Шардирование
Шардирование — метод горизонального масштабирования базы данных, при котором она разбивается на независимые фрагменты, т.е. шарды. Каждый шард содержит один или несколько узлов кластера. В шарде из нескольких узлов работает репликация.
Шардирование позволяет решить следующие задачи:
Масштабировать базу данных. Если мощности одного узла не хватает, можно добавить в кластер шарды и распределить по ним данные.
Ускорить выполнение запросов. Когда кластер шардирован, запросы к одной таблице могут выполняться параллельно.
Изолировать сбои. Если один шард выйдет из строя, это повлияет на доступность только той части данных, которую хранит этот шард.
В ClickHouse данные шардируются с помощью распределенных таблиц на движке Distributed. Распределенные таблицы хранят только метаданные. Они обращаются к локальным таблицам, которые хранят данные на узлах шардов, и определяют, куда направить запрос:
Запрос на чтение (
SELECT) направляется на все шарды. Чтение выполняется на одном доступном узле каждого шарда. Распределенная таблица объединяет промежуточные результаты, возвращенные шардами, и передает клиенту итоговый ответ.Запрос на запись (
INSERT) направляется на определенный шард, который вычисляется с помощью ключа шифрования. Запись выполняется на одном доступном узле шарда, а затем данные асинхронно реплицируются на другие узлы.Если заранее известно, в какой шард нужно записать данные, запрос можно отправить напрямую к локальной таблице, а не через распределенную.
Для настройки распределения данных по шардам используется вес шарда — коэффициент, определяющий, какая доля новых данных попадет на конкретный шард. Это позволяет отправлять больше данных на узлы с большей мощностью и меньше данных на узлы с меньшей мощностью.
Шардирование включается при создании или редактировании multi-node-кластера. Если шардирование включено, узлы будут распределены между шардами. Если шардирование отключено, в кластере будет создан 1 шард со всеми узлами.