Обсуждаем ClickHouse
Для этого придумали движок базы replicated
Читать полностью…Не на каждую году, а на каждый шард! В этом весь цимес! Предполагая что выполнив на любом шарде create database, автоматом создасться бд и на реплике.
А это не так!
Я понимаю, что ситуация не обычная. Просто потому что все пишут on cluster. Но! Для любого нормального человека существует иерархия
Кластер
|-- шард
|--Реплика
Так вот создавая БД на уровне шарда, ты автоматом создаёшь бд на уровне реплики
В текущей реализации все совсем не так (и в это есть определенная логика) - репликация идёт на уровне таблиц. Т.е. по факту можно создать в кластере! таблицу на шарде 2, реплике 3, и он нигде вообще не будет доступна, кроме как если обратишься именно к этому хосту.
Имеет ли право на жизнь такая логика? Конечно имеет. Кто-нибудь использует эту разницу внутри шарда? Очень сомневаюсь.
Реплика, имхо, не может быть на уровне таблицы (в кластере иначе это не реплика). Реплика, имхо, долга быть уровне хоста. В этом хитрость. А ReplicatedMergeTree юзать в очень и очень редких случаях
изначально в КХ не было on cluster (надо было писать собственную автоматизацию которая подключалась к каждой ноде кластера и выполняла create)
потом где-то в конце 2018 добавили on cluster, но КХ не понимал что таблица replicated и выполнял все команды избыточно на всех нодах, и пытался добавить колонку на каждой реплике в шарде
затем где-то в 2020 это исправили
Немного непонятен ваш вопрос. Вы не указали распределённый запрос изначально. Затем пошли на каждую ноду отдельно создавать базу - и она не создалась нигде ? Тогда это странный первый кейс.
Агая варианта два. Откуда клик должен знать"где" вы хотите создать базу. Это вам не потоковая репликация в пг, тут всё иначе.
create database if not exists mydatbase on cluster ...
или я не понял, у меня много кластеров
один называется segmented там все ноды КХ как шарды из одной реплики, т.е. 50 серверов, 50 шардов
другой называется segmented_mirrored там x шардов n реплик, т.е. 25 шардов * 2 реплики
я бы выполнял
create database on ... cluster segmented
create table on ... cluster segmented
alter table xxx on ... cluster segmented_mirrored add column ..
По дефолту Atomic стоит для БД. Но вот встретился с такой хренью (сейчас мне кажется что раньше такого не было, но не 100%).
Итак, кластер - несколько шардов. На каждый шард по реплике..все вроде норм. Создаю create database (коннект к шарду в целом, а не к хосту), без on cluster.
Ну бывает, мало ли. Shit happens.. далее осознав что 'on cluster' забыт коннекчусь к каждому шарду и создаю там БД (проблема-то? 😃).
И тут оказывается, что ни на одной реплике бд не создалась.
Т.е..по факту, (это пример) если у тебя 50 шардов с 2мя репликами, и ты хочешь создать бд на 25 шардах, то у тебя два варианта:
1) создать БД on cluster и потом на на 50= 25*2 удалить
2) сразу не тупить и создавать бд на каждом хосте?
То есть например я разработчик, база данных replicated, но я создаю там внутри MergeTree. По логике вещей резработчика он хочет видеть ее и на других репликах, но получается на одной только оно создается 🤔
Читать полностью…а если внутри этой базы создашь не ReplicatedMergeTree, а просто MergeTree, то таблица не реплицируется, ведь так же получается?
Читать полностью…Немного понять можно? (Риторический вопрос).
Почему, блин, создавая БД без ON Cluster, БД не создаётся на реплике? Ну ведь бред, нет?
Немного занялся документацией своего драйвера КХ на Haskell (и по совместительству формализации протокола). Добавил генерацию описания пакетов. Верстка пока скудная, а формализация далека до полноты, но представляет рабочее подмножество, а документация всегда совпадает с реализацией
Буду рад звездочкам или контрибьютерам (если тут кому-то интересен Haskell😅)
https://clickhaskell.dev/protocol/server
Причем вставка во временную таблицу 1с
А перегрузка из нее в основную таблицу 6с и утилизация ядер
В новых кх клиентах если пробел нажать профайлер показывает
Читать полностью…Не знаю, я бы попробовал выгрузить в csv файл и загрузить из файла и посмотреть сколько инсерт из файла ест.
Читать полностью…for future reference: в пару к index_mark_cache_size, есть метрика IndexMarkCacheBytes, чтобы понять не пора ли его бампнуть
Читать полностью…@den_crane в чате не хватает реакций конечно. большое агрегированное спасибо за ваши рассказы!
Читать полностью…Ладно. Мне не впадлу пройтись по 1005000 шардам, грохнуть везде базы и заново создать "on cluster"
Читать полностью…Как-то усложнили тут и вводите в мысли. То есть в рамках кластера segmented где описан еще кластер segmented_mirror вы создаете БД, таблицу, но на mirror добавляете в эту таблицу колонку ?
Читать полностью…но вообще мне кажется КХ сам догадывается и create database on cluster делает на всех нодах кластера, не важно кто там шард, кто реплика
Читать полностью…Соррян. Про таблицы все ясно без слов. Мы говорим про бд
Читать полностью…ddl таблицы реплицируется , т.е. она создастся , данные не реплицируются.
в cloud engine подменяется на SharedMergeTree
(я не настоящий сварщик, описываю ощущения)
контептуально, это все давно изменилось (2021г)
https://clickhouse.com/docs/engines/database-engines/replicated
если вы используете database engine = replicated
то тогда там on cluster не нужен вообще, база занимается структурой таблиц без всякого on cluster
несколько лет эта фигня была experimental, но ее срочно доделали для clickhouse cloud и у них она используется в prod режиме везде уже пару лет.
и ноды(сервера) не имеют жестой привязки к шардам, репликам, т.е. если есть 12 серверов, это может быть 12*1, 1*12, 2*6, 6*2, 4*3, 3*4 и нода не знает что она реплика и какой она шард.
Вообще это странно, должно быть наоборот. эти параметры ставят что парт будет любого размера, и это вынуждает КХ создать огромный парт и отсортировать в памяти, я бы ни рисковал и поставил min_insert_block_size_bytes = '10Gi' чтобы макс. размер парта был 10гб
Читать полностью…мне помогли вот такие опции
"SET min_insert_block_size_rows = 0",
"SET min_insert_block_size_bytes = 0"
какие могут быть подводные камни,если у меня запрос будет работать раз в день добавляя по 100 тыс строк с этими опциями? Изначально много партов создастся, но вроде как они быстро фоново склеиваются
Я пока только поймал виноватых по логам и перегрузка из временных, которых больше нет.
Так что нужно еще воспроизвести :)
Да, пока версия что там в полях чуть ли не doc файлы.
Буду разбираться что там на такой банальщине так на ядра налегает
там все время улучшают, но суть в том что DateTime64 это децимал и там в общем случае нужна точка (dot) , чтобы отделить дробную часть от целой части секунд
т.е. либо 1759496469.555
либо 2025-10-03 15:01:54.555
но в разных версиях по разному, КХ пытаются научить угадывать что имелось в виду под 1759496469555 -- это наносекунды или секунды, но это типа тут работает (insert values), а вот тут не работает (insert csv).
Привет! Вставляю из другой базы в кликхаус таймстемпы
Поле в которое вставляю названо так же timestamp, тип данных выставил DateTime64(N)
При N от 3 до 8 данные вставляются, однако кастятся не верно
Дело в том, что таймстемпы даны с точностью до наносекунд (например 1642435541563013422) и для них N от 3 до 8 неверно интерпретируется.
Но при DateTime64(9) - появляется ошибка:
Decimal math overflow: while converting source column timestamp to destination column timestamp: while executing 'FUNCTION _CAST(timestamp :: 6, DateTime64(9) :: 21) -> _CAST(timestamp, DateTime64(9)) DateTime64(9)