
Sergey
28.03.2017
14:20:00
На offline машине обновил КХ с 154 на 190 с сохранением конфигов, при запуске ругается что нет доступа к каталогу данным. У каталога владелец metrika, запускаюсь из под root. С чем это может быть связано?

Pavel
28.03.2017
14:20:41
юзера метрик на кликхаус паменяли недавно AFAIK

Sergey
28.03.2017
14:37:30

Pavel
28.03.2017
14:38:48
супер)

Google

Konstantin
28.03.2017
14:39:22
а clickhouse нормально живет на kvm? или лучше на голое железо ставить всё-таки

Pavel
28.03.2017
14:39:52
виртулизация - всегда осознанный компромисс
у нас CH даже в контейнерах живет и норм

Konstantin
28.03.2017
14:44:22
тогда ещё вопрос, который частично обсуждался в рассылке: есть очередь, в которую прилетают события, которые надо складывать в clickhouse. Судя по доке, хорошо бы писать батчами от 1к рекордов. Соответственно, надо их где-то аккумулировать. Можно, конечно, собирать в память, но это немного ненадежно.

Pavel
28.03.2017
14:44:39
Kafka / Buffer table.

Konstantin
28.03.2017
14:47:02
@pavel_odintsov buffer table это типа складывать в tinylog таблицу clickhouse, а потом перекладывать?

Pavel
28.03.2017
14:47:52
не, это встроенная фича CH
спец таблица в памяти, которая флушится в таблицу на диске с тем же набором полей как только в нее набилосх Х записей

Konstantin
28.03.2017
14:48:21
о, сейчас посмотрю, спасибо

Pavel
28.03.2017
14:48:21
и тем самым создает те самые большие батчи

evervoid
28.03.2017
14:59:29
Используем кафку для этого, работает отлично

Sergey
28.03.2017
15:37:46
Нормально ли, что для изменения настройки add_http_cors_header у пользователя должны быть права на изменение, а с readonly правами запрос падает с ошибкой?

Igor
28.03.2017
15:42:15
readonly=2 - При значении 2 можно выполнять запросы на чтение (SELECT, SHOW) и изменение настроек (SET)

Google

Aleksey
28.03.2017
16:45:15
Привет!
А нет ли где-нибудь рекомендаций по настройке ZooKeeper-кластера для ClickHouse?
Что именно интересует:
1. Сколько инстансов ZooKeeper имеет смысл использовать в зависимости от количества шардов и реплик ClickHouse.
2. На что прежде всего обратить внимание при выборе железа под ZooKeeper, к чему он наиболее требователен в связке с ClickHouse?
3. Есть ли преимущества у схемы, когда ZooKeeper живёт на одном железе с ClickHouse? Или лучше под него использовать отдельные сервера?
4. Допустим, сервера ClickHouse у нас живут в двух дата-центрах, между ними настроена перекрёстная репликация. Мы заводим в каждом из дата-центров по 2 сервера ZooKeeper. Что будет с работоспособностью системы, если один дата-центр прилёг? Смогут ли 2 сервера ZooKeeper из живого дата-центра договориться между собой, и, соответственно, смогут ли ClickHouse-ы в этом дата-центре продолжать нормальную работу?


Alexey
28.03.2017
16:53:07
Привет
Подскажите, пожалуйста
Периодически разваливается реплика Кликхауса с таким вот сообщением в логе
2017.03.28 12:31:14.818651 [ 3297 ] <Error> HTTPHandler: Code: 999, e.displayText() = zkutil::KeeperException: connection loss, path: /clickhouse/tables/nz/1/zos2/temp/abandonable_lock-, e.what() = zkutil::KeeperException, Stack trace:
0. /usr/bin/clickhouse-server(StackTrace::StackTrace()+0x16) [0x1224296]
1. /usr/bin/clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1f) [0xf88dbf]
2. /usr/bin/clickhouse-server(zkutil::KeeperException::KeeperException(int, std::string const&)+0x6b) [0x12ea4bb]
3. /usr/bin/clickhouse-server(zkutil::ZooKeeper::tryCreate(std::string const&, std::string const&, int, std::string&)+0x52) [0x2ad5ac2]
4. /usr/bin/clickhouse-server(zkutil::ZooKeeper::create(std::string const&, std::string const&, int)+0x47) [0x2ad5b37]
При этом в логе Zookepeer вот такое
2017-03-28 12:21:29,689 [myid:3] - WARN [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@362] - Exception causing close of session 0x35b0f9728470000 due to java.io.IOException: Len err
or 1097666
2017-03-28 12:21:29,689 [myid:3] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1008] - Closed socket connection for client /10.244.2.162:33026 which had sessionid 0x35b0f9728
470000
Помогает только рестарт Зукипера и последующий рестарт Кликхауса
Может кто сталкивался с такой проблемой?
Вряд ли могу сказать что-то конкретное. Число, о котором идёт речь в сообщении об ошибке - чуть больше 1 МБ, что является ограничением по-умолчанию на размер узла, размер пакета, отправляемого по сети в ZK. Попробуйте посмотреть, нет ли слишком больших нод в ZK, и не передаются ли слишком большие пакеты:
strace -f -e trace=network -p $(pidof clickhouse-server)
tcpdump
Недавно исправляли похожую проблему: на сервере с очень большим количеством таблиц типа ReplicatedMergeTree, после переполнения zxid в ZK (глобальный счётчик транзакций, максимум 2^31 - 1) и потери сессии, сервер не мог установить новую сессию, так как отправлял в ZK слишком большое количество watch-ей и размер пакета выходил за рамки ограничения. Может быть здесь что-то похожее.


Dzmitry
28.03.2017
16:54:49
Вряд ли могу сказать что-то конкретное. Число, о котором идёт речь в сообщении об ошибке - чуть больше 1 МБ, что является ограничением по-умолчанию на размер узла, размер пакета, отправляемого по сети в ZK. Попробуйте посмотреть, нет ли слишком больших нод в ZK, и не передаются ли слишком большие пакеты:
strace -f -e trace=network -p $(pidof clickhouse-server)
tcpdump
Недавно исправляли похожую проблему: на сервере с очень большим количеством таблиц типа ReplicatedMergeTree, после переполнения zxid в ZK (глобальный счётчик транзакций, максимум 2^31 - 1) и потери сессии, сервер не мог установить новую сессию, так как отправлял в ZK слишком большое количество watch-ей и размер пакета выходил за рамки ограничения. Может быть здесь что-то похожее.
А не подскажите в какой версии была исправлена проблема с zxid ?


Alexey
28.03.2017
16:56:32
Вот здесь:
https://github.com/yandex/ClickHouse/pull/595
Менее двух недель назад. Скорее всего, в предпоследней версии.
Если хотите обновиться, ставьте самую последнюю.

Dzmitry
28.03.2017
16:58:45
Спасибо, попробуем

Andrey
28.03.2017
17:06:17


Roman
28.03.2017
17:06:35
Коллеги, мб было в доке, но подскажите плиз — YCH можно в chroot'е скомпилировать и установить?


Alexey
28.03.2017
17:08:27
Привет!
А нет ли где-нибудь рекомендаций по настройке ZooKeeper-кластера для ClickHouse?
Что именно интересует:
1. Сколько инстансов ZooKeeper имеет смысл использовать в зависимости от количества шардов и реплик ClickHouse.
2. На что прежде всего обратить внимание при выборе железа под ZooKeeper, к чему он наиболее требователен в связке с ClickHouse?
3. Есть ли преимущества у схемы, когда ZooKeeper живёт на одном железе с ClickHouse? Или лучше под него использовать отдельные сервера?
4. Допустим, сервера ClickHouse у нас живут в двух дата-центрах, между ними настроена перекрёстная репликация. Мы заводим в каждом из дата-центров по 2 сервера ZooKeeper. Что будет с работоспособностью системы, если один дата-центр прилёг? Смогут ли 2 сервера ZooKeeper из живого дата-центра договориться между собой, и, соответственно, смогут ли ClickHouse-ы в этом дата-центре продолжать нормальную работу?
1. Достаточно трёх серверов ZK (одного кластера) на 800 серверов ClickHouse (больше не проверяли), но требуется указание каких-то особенных параметров для Java (могу узнать подробнее). Могут возникать проблемы, если: - много таблиц на каждом сервере; - частые INSERT-ы; - некоторые реплики останавливаются на долгое время.
2. Могут быть тормоза при записи лога и снэпшотов, помогает поставить SSD.
3. Нет преимуществ, только недостатки. Лучше размещать ZK отдельно. Причина в том, что в ZK приходит много коротких запросов, для которых желательно иметь предсказуемую latency, тогда как ClickHouse может съесть весь CPU и диск, что приведёт к залипанию запросов в ZK на существенное время.
4. 2 сервера из 4 не смогут договориться. Лучше держать три сервера - два в одном ДЦ и один в другом. При недоступности более крупного ДЦ, система будет целиком недоступна на запись. При недоступности ДЦ с одной нодой ZK, система будет доступна на запись только в доступном ДЦ (изнутри изолированного ДЦ писать в ClickHouse не получится). При этом, на чтение система доступна всегда, но может отдавать отстающие данные.


Andrey
28.03.2017
17:10:43
Вот ещё кстати вопрос. В чем коренная особенность того что CH не любит мелкие вставки? Ведь по сути слияние не будет долгим. Цена коннекта в CH вроде тоже не высока.

Aleksey
28.03.2017
17:11:24
> 4. 2 сервера из 4 не смогут договориться. Лучше держать три сервера - два в одном ДЦ и один в другом. При недоступности более крупного ДЦ, система будет целиком недоступна на запись. При недоступности ДЦ с одной нодой ZK, система будет доступна на запись только в доступном ДЦ (изнутри изолированного ДЦ писать в ClickHouse не получится). При этом, на чтение система доступна всегда, но может отдавать отстающие данные.
А если ДЦ равнозначны, и хочется сохранять плавучесть при недоступности любого, то минимум, получается, по 3 сервера ZK в каждом ДЦ?
6 ZK ведь смогут договориться? Тогда просто кворум будет = 4, правильно?


Fike
28.03.2017
17:12:07
> 4. 2 сервера из 4 не смогут договориться. Лучше держать три сервера - два в одном ДЦ и один в другом. При недоступности более крупного ДЦ, система будет целиком недоступна на запись. При недоступности ДЦ с одной нодой ZK, система будет доступна на запись только в доступном ДЦ (изнутри изолированного ДЦ писать в ClickHouse не получится). При этом, на чтение система доступна всегда, но может отдавать отстающие данные.
А если ДЦ равнозначны, и хочется сохранять плавучесть при недоступности любого, то минимум, получается, по 3 сервера ZK в каждом ДЦ?
У вас при падении сети между ДЦ останется два кластера по три ноды. Они не могут принимать решения, потому что ни у одного кластера нет большинства, и у вас упадут оба дц

Igor
28.03.2017
17:12:17
нечетное

Aleksey
28.03.2017
17:12:42
Замкнутый круг:) Или тут нечётное, или там:)

Andrey
28.03.2017
17:12:56
Нужен третий ДЦ ;)

Fike
28.03.2017
17:13:07
или три дц, но я не уверен, что ZK-over-WAN будет хорошо себя держать
или, если КХ у вас не является первичным хранилищем, вам вообще не нужна связь между ДЦ, нужно просто переливать данные из SSOT

Andrey
28.03.2017
17:14:26

Fike
28.03.2017
17:14:48
single source of truth, первичное хранилище с актуальными данными

Google

Alexey
28.03.2017
17:17:42

Andrey
28.03.2017
17:21:09

Aleksey
28.03.2017
17:50:58

Alexey
28.03.2017
17:58:02
По куску на каждый блок.

Aleksey
28.03.2017
17:59:01
Ясно, т.е. для CH особой разницы не будет, если сделать 2 инсерта по 1кк или 1 инсерт с 2кк?

Alexey
28.03.2017
18:00:26
Да.

Vladislav
28.03.2017
18:01:57
А IS NULL нормально работает для типа Nullable(DateTime)?
получаю ошибку Size of filter doesn't match size of column

Alexey
28.03.2017
18:06:51
NULL в целом плохо работает. Недавно исправили вставку в MergeTree - раньше всё было неверно. Этого исправления ещё нет в stable релизе.

Shine
28.03.2017
18:07:12
Алексей, а когда будет в стэйбле ориентировочно ?
хочется через apt обновиться )

Alexey
28.03.2017
18:09:08
Скорее всего, вторник-среда следующей недели. Если повезёт, может успеть в четверг на этой неделе.

Shine
28.03.2017
18:10:06
спасибо

Andrey
28.03.2017
18:48:26

Alexey
28.03.2017
18:49:19
Настройка max_insert_block_size. При отправке на сервер данных по HTTP интерфейсу, сервер использует эту настройку для разбиения на блоки.
Если использовать clickhouse-client, то разбиением на блоки занимается клиент, и настройку нужно указать для него. Если другие native драйверы - C++, go, .NET - то тоже, они занимаются разбиением на блоки сами.

Vladimir
28.03.2017
21:04:35
А тут есть кто-нибудь, кто может подсказать по Go'шному драйверу (https://github.com/kshvakov/clickhouse/) ?
пытаюсь немного модифицировать пример из документации, получаю SIGSEGV
В смысле invalid memory address or nil pointer dereference
ок, понял, это была опечатка в названии колонки

Google

Alexey
28.03.2017
21:32:57
Надо попросить автора исправить.

Vladimir
28.03.2017
21:40:51
да кажется моя ошибка, надо err от Prepare проверять и все будет нормально.

Kirill
29.03.2017
06:47:43
да, все верно, в примерах нет обработки ошибок, например https://github.com/kshvakov/clickhouse/blob/master/examples/simple.go#L42 , если Prepare вернет ошибку, то и statement будет nil и Exec/Query будут падать при обращении к нему. Чуть позже добавлю обработку ошибок в примеры чтоб небыло подобных проблем

Vladimir
29.03.2017
07:13:45
Что создает ложное ощущение что в них ошибки можно не обрабатывать

Dima
29.03.2017
09:53:13
привет! я правильно понимаю, что для изменения параметра output_format_json_quote_64bit_integers надо прописать в config.xml
<output_format_json_quote_64bit_integers>true</output_format_json_quote_64bit_integers>
?

Vitaliy
29.03.2017
11:05:14

Dima
29.03.2017
11:05:54
именно пользователей, а не профиля?
у вас в доке это как то неоднозначно описано

Vitaliy
29.03.2017
11:06:33
Можно указать в users.xml, передать прямо в GET-запросе или параметром clickhouse-client
именно пользователей, а не профиля?
Т.к. и пользователи и их профили задаются в одном файле, и т.к. профили - это просто конструкторы настроек пользователей, то можно считать их за одну сущность. А в доке - да, непонятно что имеется ввиду под "конфигурационный файл" и что их бывает 2 вида.
Можно поправить
https://github.com/yandex/ClickHouse/edit/master/doc/reference_ru.html

Dima
29.03.2017
11:18:26
но синтаксис хотябы верный?

Vitaliy
29.03.2017
11:19:02
1 и 0 точно сработают

Dima
29.03.2017
11:19:15
спасибо

Anatoliy
29.03.2017
12:00:17
Добрый день. У меня есть коллекция users в mongodb со структурой типа:
{ name: 'пользователь1', property: { age: 15, region: 'Какой-то регион' }}
Можно ли описать словарь чтобы доставать например age ?
Можно ли как-то достать property с содержимым которое от документа к документу может меняться (разные свойства) ?
Просто не очень хотелось бы менять структуру данных (свойства перемещать один уровень с name) и при появлении каждого нового свойства дописывать его в конфигурацию словаря
В документации к словарям не нашел решения, но, возможно, есть другой способ

Andrew
29.03.2017
12:32:36
А зачем вам словарь для age?

Anatoliy
29.03.2017
12:39:22
Словарь не для age самого по себе, а словарь в котором можно получить все вложенные поля property (забыл сказать что в каждом документе есть еще поле uuid по которому и производится запрос через dictGet...)

Vladimir
29.03.2017
13:02:36
@kshvakov а что такое за ошибка [clickhouse][receive packet] err: unhandled type mg?
@kshvakov если делать запрос вручную (http или клиент), а не через гошный драйвер, то все работает
в таблице ничего странного нет - пачка UInt64, String, Array(UInt64), Date

Google

Vladimir
29.03.2017
13:06:55
А, каждый раз разный текст в ответ )

Dmitriy
29.03.2017
13:31:27
подскажи пожалуйста, а ATTACHE DETACH можно применять к distributed таблице?
я хочу посредтом атач детач переместить данные с одной таблици в другую, но ходить по репликам как-то не хочется, хотя наверное прийдется потому как данные складываются в deattach папку той балици где они(данные) находились

Vitaliy
29.03.2017
13:32:11

Vladimir
29.03.2017
13:39:35
@kshvakov https://github.com/kshvakov/clickhouse/issues/23

Dmitriy
29.03.2017
14:25:35
а можно еще вопрос, можно както заставить CH писать для опеределенных таблиц в другой "винт"
в системе есть HHD и SSD хотелось бы для маленьких таблиц использовать SSD
Или можно полу ручном режиме: создать таблицу, потом ее перенести на SSD и сделать сим линк в каталог CH?

Dmitry
29.03.2017
14:32:39
Симлинком можно

Dmitriy
29.03.2017
14:37:53
спасибо. на митапе каком-то слышал про симлинки и то что у яндекса была с ними проблема. чито не монтировалась таблица чито не удалялась

Roman
29.03.2017
14:43:58
Мы используем симлинки для старых партиций. Пока все ок

Alexey
29.03.2017
15:06:56

Mike
29.03.2017
17:37:51
Коллеги, а как лучше получить результаты запроса, когда они не влезают в память клиента? Стрим/батч какой-то бывает?

Andrey
29.03.2017
17:56:03

Igor
29.03.2017
18:12:24
Клиент на каком яп?

Dig
29.03.2017
19:24:54
Вечер добрый. А кто как решает задачу кеширования ответов сервера? А нас идея - есть основная таблица, куда поступают данные, есть MaterializedView с SummingMergeTree движком. Перед основным запросом, делаем запрос на MaterializedView, чтобы убедиться, что есть новые данные (запоминаем у себя значение суммы счетчиков). И если есть новые данные, то выполняем уже основной запрос, если нет, отдаем юзеру данные из кеша. Минус в том, что приходится делать вместо одного - два запроса. Но если на основной запрос сервер отвечает за десятки миллисекунд, а на запрос к MaterializedView за единицы миллисекунд, то вроде как такой подход нормальный. Что думаете?

Mike
29.03.2017
19:51:32

Andrey
29.03.2017
19:53:08
Именно клиента, да
В питоне есть же возможность сразу поток писать на диск. Я не программист но ребята делали подобное.

Igor
29.03.2017
19:53:30
если requests используете, то stream=True, будет генератор возвращаться, afaik
1) stream=True http://docs.python-requests.org/en/master/user/advanced/#body-content-workflow
2) iter_content() http://docs.python-requests.org/en/master/api/#requests.Response.iter_content


Igor
29.03.2017
19:54:22
> @umaxfun
Питон
Для php я использую подход когда curl пишет прямо в файл ( можно даже сразу zlib.deflate получать с CH) , типа c.setopt(c.WRITEFUNCTION, f.write)
Далее уже с этим raw - работать как удобно
Вечер добрый. А кто как решает задачу кеширования ответов сервера? А нас идея - есть основная таблица, куда поступают данные, есть MaterializedView с SummingMergeTree движком. Перед основным запросом, делаем запрос на MaterializedView, чтобы убедиться, что есть новые данные (запоминаем у себя значение суммы счетчиков). И если есть новые данные, то выполняем уже основной запрос, если нет, отдаем юзеру данные из кеша. Минус в том, что приходится делать вместо одного - два запроса. Но если на основной запрос сервер отвечает за десятки миллисекунд, а на запрос к MaterializedView за единицы миллисекунд, то вроде как такой подход нормальный. Что думаете?
У нас ETL пишет сразу в несколько потоков, есть отдельная быстрая таблица Summing которая менятеся, есть большая таблица Summing и просто mergeTree. Т/е мы дублируем часть данных раскладываем их на несколько таблиц - поток / сжатые / очень сжатые. Также ETL отдельно фиксирует - что он отправил пачку данных


Andrey
29.03.2017
20:00:26
Кстати про агрегирующие движки. В доках есть пример с материализованной вьюхой которая смотрит на таблицу и при заливке в нее калькулирует агрегаты. Но есть пометка что ее использование далеко не всегда обоснованного потому что агрегация и так работает быстро. Скажите, вот в кейсе когда мне часто нужны агрегаты по таблице в которой лежат данные за несколько лет, использование такого подхода обоснованно или все же нет?

Igor
29.03.2017
20:00:32
имхо, идея с MaterializedView хорошая - для кэша, но если ETL пишет +- равномерно каждые Х секунд может и не стоит посылать доп запросы и кэшить ... CH и так быстр)