Раздел 38 · ClickHouse и аналитические базы

Распределённые таблицы и шардирование

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Один сервер ClickHouse справляется с миллиардами строк. Но наступает день, когда данные не влезают на его диски, или запросы дашборда упираются в его процессоры, или Отто спрашивает: а что будет, если этот сервер сгорит? Ответ на первые два вопроса это шардирование, на третий репликация. В этом уроке разберём обе идеи и соберём маленький кластер из двух серверов.

Две разные беды и два лекарства

Представь библиотеку. Книг стало так много, что одно здание их не вмещает. Решение: второе здание, и книги делят между ними: авторы от А до М в первом, от Н до Я во втором. Это шардирование: каждая книга лежит в одном месте, зато места вдвое больше, и искать можно в двух зданиях одновременно.

Другая беда: если первое здание закроют на ремонт, половина книг недоступна. Решение: держать в каждом здании копию. Это репликация: места не прибавилось, зато потеря одного здания ничего не ломает.

В настоящих кластерах делают оба: данные делят на шарды, а у каждого шарда две-три реплики.

Репликация словами

Репликация в ClickHouse устроена так: таблица создаётся на движке ReplicatedMergeTree, а серверы-реплики договариваются через службу координации ClickHouse Keeper. Вставка приходит на любую реплику, та пишет часть и отмечает её в Keeper, остальные реплики видят отметку и скачивают часть себе. Слияния тоже согласуются через Keeper, чтобы части на репликах были одинаковыми.

В песочнице репликации нет: для неё нужны несколько настоящих серверов и Keeper. Поэтому дальше займёмся шардированием, его можно потрогать руками.

Кластер и движок Distributed

Список серверов кластера описывают в конфигурации ClickHouse. В песочнице есть кластер gonets из двух шардов: shard-1, к которому ты подключён, и shard-2. Увидеть кластеры можно в system.clusters.

Шардированная таблица собирается из двух слоёв:

  1. Локальная таблица на каждом шарде, обычный MergeTree. Каждый шард хранит в ней свою часть строк.
  2. Распределённая таблица на движке Distributed. Она сама ничего не хранит, а работает диспетчером: при вставке раскладывает строки по шардам, при запросе рассылает его на все шарды и складывает ответы.
CREATE TABLE orders_all ON CLUSTER gonets AS orders_local
ENGINE = Distributed(gonets, default, orders_local, cityHash64(customer_id));

Аргументы движка: кластер, база, локальная таблица и ключ шардирования. cityHash64(customer_id) превращает номер клиента в большое псевдослучайное число, а остаток от деления на число шардов выбирает шард. Все заказы одного клиента окажутся на одном шарде.

ON CLUSTER gonets в CREATE TABLE создаёт таблицу сразу на всех серверах кластера. В ответ ClickHouse печатает таблицу: какой сервер выполнил команду и сколько ещё осталось.

урок из курса

Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.