Как сделать таблицу шардированной в ClickHouse
Что проверяют
Понимаете ли вы, что шардирование в ClickHouse состоит из двух слоёв: локальных таблиц на каждом узле и таблицы-роутера Distributed поверх них. Следом спрашивают про ключ шардирования и про добавление шарда.
Как отвечать
Шаги по порядку:
- описание кластера: секция
remote_serversв конфиге, внутри шарды и реплики. Для реплицируемых таблиц ставитсяinternal_replicationвtrue, тогдаDistributedпишет в одну реплику, остальные догоняют сами; - координация: ClickHouse Keeper или ZooKeeper, без них не работают ни
ReplicatedMergeTree, ни DDL сON CLUSTER. Макросы{shard}и{replica}задаются в конфиге каждого узла; - локальная таблица:
CREATE TABLE events_local ON CLUSTER main (...) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events', '{replica}') ORDER BY (user_id, ts); - распределённая таблица:
CREATE TABLE events ON CLUSTER main AS events_local ENGINE = Distributed(main, default, events_local, cityHash64(user_id)). Сама она данных не хранит.
Про ключ: rand() даёт ровное распределение, но данные одного пользователя разлетаются по всем шардам. Хеш от бизнес-ключа держит их вместе, и агрегации по нему считаются локально. Неравные по мощности шарды выравнивают через weight.
Про вставку: INSERT в Distributed по умолчанию асинхронный, данные копятся на диске узла-инициатора и уходят в фоне. Синхронность включает distributed_foreground_insert (раньше insert_distributed_sync). На большом потоке надёжнее писать прямо в локальные таблицы.
Про запросы: подзапрос в IN или JOIN по другой распределённой таблице по умолчанию запрещён настройкой distributed_product_mode. Обычно пишут GLOBAL IN: подзапрос выполнится один раз на инициаторе, результат разошлют по шардам.
Где спотыкаются
Создают Distributed без локальной таблицы, указывая его на самого себя.
Описывают один шард с двумя репликами и называют это шардированием. Это репликация, данные на обоих узлах одинаковые.
Считают, что новый шард заберёт часть старых данных. Автоматической перебалансировки нет: существующие данные остаются на месте, и выравнивать приходится весами на запись или переливкой.