
Aliaksandr
06.06.2018
08:57:35
Было бы здорово, если бы сервис наподобие кафки был бы встроен в кликхаус. Например, в виде отдельного типа таблицы

Рулон
06.06.2018
08:59:31
А это не то? https://clickhouse.yandex/docs/ru/table_engines/kafka/


Александр
06.06.2018
09:09:01
Наверное, потому что кафка выполняет похожую работу, что буфер-таблицы - мержит входящие данны в бОльшие пачки данных и скармливает их кликхаусу. Отличие, наверное, в том, что кликхаус сам вытягивает данные из кафки, когда готов это делать (pull модель), а из буфер-таблицы данные могут прилететь в mergetree в произвольный момент, который может оказаться не таким удобным для кликхауса (push-модель). Еще одно отличие, что данные из буфер-таблицы видны в запросах сразу же, а данные в кафке не видны до тех пор пока кликхаус их не заберет.
Спасибо за подробный ответ
Наверное, потому что кафка выполняет похожую работу, что буфер-таблицы - мержит входящие данны в бОльшие пачки данных и скармливает их кликхаусу. Отличие, наверное, в том, что кликхаус сам вытягивает данные из кафки, когда готов это делать (pull модель), а из буфер-таблицы данные могут прилететь в mergetree в произвольный момент, который может оказаться не таким удобным для кликхауса (push-модель). Еще одно отличие, что данные из буфер-таблицы видны в запросах сразу же, а данные в кафке не видны до тех пор пока кликхаус их не заберет.
А какие объемы вы впихаваете, если не секрет? И как оно впихивается?

Google

Aliaksandr
06.06.2018
09:22:33
А какие объемы вы впихаваете, если не секрет? И как оно впихивается?
впихивали до 300к строчек по ~45 колонок в секунду на один сервер. Каждая строчка содержит данные по рекламному запросу. В основном инты и короткие строки. В сутки прилетало до 25 миллиардов событий на сервер. Когда начинало прилетать больше строчек в секунду, начинались тормоза. Поэтому мы добавляли новую шарду в кластер.

Рулон
06.06.2018
09:30:27
А что за железо?)

Александр
06.06.2018
09:34:23

Aliaksandr
06.06.2018
09:36:01
1 сервер - это один инстанс в google compute engine с 32 ядрами, 104 гигами памяти и динамически расширяемым persistent hdd диском. Максимальный размер данных на одном сервере был в районе 40Тб

Daniel
06.06.2018
09:45:18
Есть ли какие-то рекомендации или опыт, с базами с таблицами в совокупном размере посколько ТБ может оперировать один сервер с Clickhouse? 36ТБ, 54ТБ, 72ТБ - может кто-то работает с таким в проде?

Wolf
06.06.2018
09:46:37
Если только хранить то в целом без разницы

Aliaksandr
06.06.2018
09:47:05

Daniel
06.06.2018
09:47:24

Aliaksandr
06.06.2018
09:47:48
Не знаю. Я там уже не работаю )

Wolf
06.06.2018
09:47:50
Все вопросы к объему зависят от вставок и ваших запросов

Daniel
06.06.2018
09:48:47

Wolf
06.06.2018
09:49:23
Зная как он хранит данные то надо только смотреть чтобы не упереться в ограничения файлухи

Google

Daniel
06.06.2018
09:50:21

Alex
06.06.2018
09:50:31

Gennady
06.06.2018
09:50:56

Wolf
06.06.2018
09:51:48
В свое время отказался от xfs как только доросла ext4, c xfs только хорошие воспоминания, но ее там надо было как то отдельно ставить, а екст4 из коробки хорошо работает

Daniel
06.06.2018
09:53:46
У меня как-то во время тестов и заполнения очереди distributed таблицы закончились иноды на ext4, так что грызут сомнения

Vladislav
06.06.2018
09:57:46
подскажите, пожалуйста, а можно ли для ReplacingMergeTree сделать так, чтобы оставалась старая версия, а не новая? -ver не работает.

Daniel
06.06.2018
09:59:06
Отбой XFS, не хочу повторять опыт Cloudflare =)
"Another disk failure highlighted a problem with the filesystem we used. Initially we used XFS, but it started to lock up during replication from 2 peers at the same time, thus breaking replication of segments before it completed. This issue has manifested itself with a lot of I/O activity with little disk usage increase as broken parts were deleted, so we gradually migrated to ext4 that didn’t have the same issue."


Aliaksandr
06.06.2018
10:09:12
И типа железа, это понятно. У нас xeon gold - ы и RAM от 128, так что интересуют чисто потенциальные ограничения CH. Типа "не может сразу искать по таблицам больше 20ТБ"
знаю следующие ограничения:
1) Скорость сканирования данных ограничена скоростью чтения сжатых данных с диска, если эти данные отсутствуют в файловом кэше операционной системы ("холодные" данные). Например, у persistent hdd в google cloud'е максимальная скорость чтения - 180мб/с на инстанс. Если сканировать колонку с хорошим уровнем сжатия (например, поставить фильтр на дату, которая сжимается в 1000 раз), то кликхаус сможет в теории сканировать эту колонку с диска со скоростью 180мб/с*1000=180гб/с или 180 / 4 = 45 миллиардов строк в секунду (одно поле DateTime занимает 4 байта) . Если же сканировать плохо сжимаемую колонку (например, IP юзера, которая сжимается в лучшем случае в полтора раза), то скорость сканирования айпишек с диска будет ограничена 180*1.5=270мб/с или 270/4 = 67.5 миллионов строк в секунду (если айпишки хранить в UInt32). Если бы они читались из файлового кэша ("теплые" данные, которые либо были недавно записаны, либо недавно считаны), то скорость была бы ограничена скоростью чтения из памяти, т.к. в районе 10гб/с или 2.5 миллиарда строк в секунду, т.е. почти в 40 раз быстрее.
2) Вроде индексы всех таблиц должны помещаться в оперативную память. В теории возможна ситауция, когда для очень больших таблиц не хватит оперативной памяти для индексов. У нас такого никогда не было.


Рулон
06.06.2018
10:12:25
https://github.com/yandex/clickhouse-jdbc
java.lang.NoClassDefFoundError: Could not initialize class ru.yandex.clickhouse.ClickHouseDriver


Daniel
06.06.2018
10:12:38
знаю следующие ограничения:
1) Скорость сканирования данных ограничена скоростью чтения сжатых данных с диска, если эти данные отсутствуют в файловом кэше операционной системы ("холодные" данные). Например, у persistent hdd в google cloud'е максимальная скорость чтения - 180мб/с на инстанс. Если сканировать колонку с хорошим уровнем сжатия (например, поставить фильтр на дату, которая сжимается в 1000 раз), то кликхаус сможет в теории сканировать эту колонку с диска со скоростью 180мб/с*1000=180гб/с или 180 / 4 = 45 миллиардов строк в секунду (одно поле DateTime занимает 4 байта) . Если же сканировать плохо сжимаемую колонку (например, IP юзера, которая сжимается в лучшем случае в полтора раза), то скорость сканирования айпишек с диска будет ограничена 180*1.5=270мб/с или 270/4 = 67.5 миллионов строк в секунду (если айпишки хранить в UInt32). Если бы они читались из файлового кэша ("теплые" данные, которые либо были недавно записаны, либо недавно считаны), то скорость была бы ограничена скоростью чтения из памяти, т.к. в районе 10гб/с или 2.5 миллиарда строк в секунду, т.е. почти в 40 раз быстрее.
2) Вроде индексы всех таблиц должны помещаться в оперативную память. В теории возможна ситауция, когда для очень больших таблиц не хватит оперативной памяти для индексов. У нас такого никогда не было.
Спасибо.
Из рекомендаций RedHat почитал, что у ext4 ограничение на размер файловой системы - 50ТБ. Отсюда и будем отталкиваться.


Рулон
06.06.2018
10:13:18
Это для Jmetr

Wolf
06.06.2018
10:13:37

Daniel
06.06.2018
10:15:40

Wolf
06.06.2018
10:16:23
с инодами довольно редкая проблема так как заранее знаешь что их мало по дефолту

Леонид
06.06.2018
10:20:17
еще вопрос.
Nullable с JOIN-ами работать умеет?


Aliaksandr
06.06.2018
10:22:09
У меня как-то во время тестов и заполнения очереди distributed таблицы закончились иноды на ext4, так что грызут сомнения
В вашей таблице либо тысячи колонок, либо вы вставляли туда данные по одной строчке и увеличили лимит на максимальное количество кусков с 300 до десятков тысяч. Иначе не совсем понятно, как могут закончиться иноды. Для кликхауса легко посчитать максимальное количество файлов на таблицу - умножаем количество колонок на 2 (для каждой колонки создается два файла - с данными, индексом), потом на 300 (максимальное количество кусков в одной партиции, если вы его не меняли), потом на количество партиций. Например, если партиционирование помесячное и у вас есть данные за год, то нужно умножать на 12. Обычно в старых партициях куски "схлопываются", поэтому их количеством можно пренебречь.
Пример: максимальное количество файлов для таблицы с 50 колонками равно 50*2*300*partitions_count = 30000*partitions_count, т.е. по 30к на партицию. Обычно это количество намного меньше, т.к. кликхаус старается минимизировать количество кусков путем их слияния. Большое количество файлов обычно говорит либо о неправильной вставке данных (много мелких вставок) либо о неправильном партиционировании (слишком много партиций).


Tima
06.06.2018
10:43:51
В вашей таблице либо тысячи колонок, либо вы вставляли туда данные по одной строчке и увеличили лимит на максимальное количество кусков с 300 до десятков тысяч. Иначе не совсем понятно, как могут закончиться иноды. Для кликхауса легко посчитать максимальное количество файлов на таблицу - умножаем количество колонок на 2 (для каждой колонки создается два файла - с данными, индексом), потом на 300 (максимальное количество кусков в одной партиции, если вы его не меняли), потом на количество партиций. Например, если партиционирование помесячное и у вас есть данные за год, то нужно умножать на 12. Обычно в старых партициях куски "схлопываются", поэтому их количеством можно пренебречь.
Пример: максимальное количество файлов для таблицы с 50 колонками равно 50*2*300*partitions_count = 30000*partitions_count, т.е. по 30к на партицию. Обычно это количество намного меньше, т.к. кликхаус старается минимизировать количество кусков путем их слияния. Большое количество файлов обычно говорит либо о неправильной вставке данных (много мелких вставок) либо о неправильном партиционировании (слишком много партиций).
+1


Рулон
06.06.2018
11:58:51
А что дальше? как класс инициализировать?))

Google

Yuri
06.06.2018
12:00:58

Рулон
06.06.2018
12:03:45
Jmetr настроить
Нужен jdbc driver class
Нужен jdbc driver class
Uncaught Exception java.lang.NoClassDefFoundError: Could not initialize class ru
.yandex.clickhouse.ClickHouseDriver. See log file for details.


Kirill
06.06.2018
12:17:38
В вашей таблице либо тысячи колонок, либо вы вставляли туда данные по одной строчке и увеличили лимит на максимальное количество кусков с 300 до десятков тысяч. Иначе не совсем понятно, как могут закончиться иноды. Для кликхауса легко посчитать максимальное количество файлов на таблицу - умножаем количество колонок на 2 (для каждой колонки создается два файла - с данными, индексом), потом на 300 (максимальное количество кусков в одной партиции, если вы его не меняли), потом на количество партиций. Например, если партиционирование помесячное и у вас есть данные за год, то нужно умножать на 12. Обычно в старых партициях куски "схлопываются", поэтому их количеством можно пренебречь.
Пример: максимальное количество файлов для таблицы с 50 колонками равно 50*2*300*partitions_count = 30000*partitions_count, т.е. по 30к на партицию. Обычно это количество намного меньше, т.к. кликхаус старается минимизировать количество кусков путем их слияния. Большое количество файлов обычно говорит либо о неправильной вставке данных (много мелких вставок) либо о неправильном партиционировании (слишком много партиций).
Там немного сложнее если есть массивы/nested-структуры, но для простых типов всё так + несколько служебных файлов типа чексум/колонок и т.д.


Yuri
06.06.2018
12:18:16

Frenky
06.06.2018
13:17:01
Ребята, день добрый!
одскажите плиз куда копать (кластер из 5 реплик), хостнеймы проверил, все корректно
Code: 159.
DB::Exception: Received from localhost:9000, 127.0.0.1.
DB::Exception: Watching query is executing too long (121 sec.)
version 1.1.54248.

Andrey
06.06.2018
13:19:23
Ребят, есть вопрос по конфигурации ZooKeeper: в мане предлагается указать все ноды ZooKeeper, а если он будет представлен как сервис по одному адресу, это будет работать? В k8s можно его повесить за сервис, который будет сам балансить запросы на узлы.

Stanislav
06.06.2018
13:20:06
работать будет точно, но вот что будет при обрыве соединения, когда нода перепинывается - хз.

Wolf
06.06.2018
13:33:13

Andrey
06.06.2018
13:35:05
Нет смысла вешать за сервис или указывать все инстансы при наличии балансера перед zookeeper?

Wolf
06.06.2018
13:36:45
нет смысла в балансере
какой смысл перед зукипером поднимать еще одну сущность , просто станет единая точка отказа по сути
а в кх все сделано чтобы уйти от этого , да и в целом мы все стремимся чтобы не было единых точек отказа, а вы зачем то их пытаетесь сделать это

Andrey
06.06.2018
13:43:52
Потому что в k8s сервис - это нормально. Отсюда и вопрос возник. Под с зукипером и так, по сути, за сервисом висит. Тем более тут сущность достаточно эфемерная, ибо там используется ipvs

Александр
06.06.2018
14:25:34
А что произойдет, если запустить detach partition и во время выполнения запроса прилетят данные в эту партицию?
И как это реплицируется? Т.е. если я сделал detach партиции на одной реплике и написал в это время данных на другой реплике в эту партицию, то добавленные данные отлетят?

Kirill
06.06.2018
14:27:12
Там лок будет и drop/detach будут ждать выполнения insert

Александр
06.06.2018
14:27:57
А если сначала detach запущен был, а потом insert? Получается, что insert будет ждать пока detach отработает?

Kirill
06.06.2018
14:28:18
Да

Google

Александр
06.06.2018
14:29:16
Супер! А с репликацией как дела обстоят? Вот я запустил детач на первой реплике и на второй реплике во время выполнения детача на первой, приехали данные в удаляемую партицию. Они останутся на второй реплике или при получении запроса на detach так же отлетят?

Кирилл
06.06.2018
14:32:51

Yuran
06.06.2018
14:34:45

Александр
06.06.2018
14:35:11

Yuran
06.06.2018
14:35:27

Kirill
06.06.2018
14:35:40

Wolf
06.06.2018
14:35:54

Kirill
06.06.2018
14:36:28

Yuran
06.06.2018
14:36:58

Александр
06.06.2018
14:37:09

Yuran
06.06.2018
14:37:14
на обычном MergeTree всё отрабатывало нормально и так, как ожидается :)

Wolf
06.06.2018
14:37:27

Yuran
06.06.2018
14:38:37

Кирилл
06.06.2018
14:38:48
Да
спасибо, интересно, попробую

Yuran
06.06.2018
14:39:02
и сначала догнать репликацию, конечно же

Wolf
06.06.2018
14:40:42
ну то есть не принимать записываемые вами данные ?
выдавать ошибку на запист ?
а если вы пишете во вторую реплику постоянно то лок на вечно пока новая партиция не начнется?
подводных камней мне кажется тут слишком много

Google

Александр
06.06.2018
14:41:25
выдавать ошибку на запист ?
Я думаю, что сервер должен сначала по журналу репликации догнать данные, а потом серез детач отцепить именно куски
А не все что там есть

Wolf
06.06.2018
14:41:54

Александр
06.06.2018
14:42:05
Нет, они должны остаться

Wolf
06.06.2018
14:42:23
ну как они останутся если лок на партицию то , куда он их должен по вашему положить ?
решение тут очень не тривиальным должно быть и как мы видим у нас троих примерно разное видение очевидного поведения кх в данном случае. если позвать еще человек десять то думаю можно получить еще пяток видений как должен поступить кх

Alex
06.06.2018
14:45:37
При DETACH все куски, вставленные в партицию до выполнения команды, должны задетачиться, а все куски, вставленные после, должны остаться. Если это не так, создавайте issue.

Александр
06.06.2018
14:46:37
Вот данные которые на другой реплике записались в удаляемую партицию на первой реплике останутся или удалятся?

Alex
06.06.2018
14:48:06
То же самое. Вставки на всех репликах линейно упорядочены через ZooKeeper и DETACH встраивается в этот порядок.

Рулон
06.06.2018
14:49:44
Друзья, а для кафки есть GUI ?

Kirill
06.06.2018
14:50:13

Alex
06.06.2018
14:50:24

Александр
06.06.2018
14:50:56

Рулон
06.06.2018
14:53:55

Alex
06.06.2018
14:55:50
Вот если insert на второй реплике прошёл после создания записи DETACH в логе, то он не должен удалиться.