Skip to content

Шардирование

Шардирование — метод горизонального масштабирования базы данных, при котором она разбивается на независимые фрагменты, т.е. шарды. Каждый шард содержит один или несколько узлов кластера. В шарде из нескольких узлов работает репликация.

Шардирование позволяет решить следующие задачи:

  • Масштабировать базу данных. Если мощности одного узла не хватает, можно добавить в кластер шарды и распределить по ним данные.

  • Ускорить выполнение запросов. Когда кластер шардирован, запросы к одной таблице могут выполняться параллельно.

  • Изолировать сбои. Если один шард выйдет из строя, это повлияет на доступность только той части данных, которую хранит этот шард.

В ClickHouse данные шардируются с помощью распределенных таблиц на движке Distributed. Распределенные таблицы хранят только метаданные. Они обращаются к локальным таблицам, которые хранят данные на узлах шардов, и определяют, куда направить запрос:

  • Запрос на чтение (SELECT) направляется на все шарды. Чтение выполняется на одном доступном узле каждого шарда. Распределенная таблица объединяет промежуточные результаты, возвращенные шардами, и передает клиенту итоговый ответ.

  • Запрос на запись (INSERT) направляется на определенный шард, который вычисляется с помощью ключа шифрования. Запись выполняется на одном доступном узле шарда, а затем данные асинхронно реплицируются на другие узлы.

    Если заранее известно, в какой шард нужно записать данные, запрос можно отправить напрямую к локальной таблице, а не через распределенную.

Для настройки распределения данных по шардам используется вес шарда — коэффициент, определяющий, какая доля новых данных попадет на конкретный шард. Это позволяет отправлять больше данных на узлы с большей мощностью и меньше данных на узлы с меньшей мощностью.

Шардирование включается при создании или редактировании multi-node-кластера. Если шардирование включено, узлы будут распределены между шардами. Если шардирование отключено, в кластере будет создан 1 шард со всеми узлами.