С течением времени:
➡️ количество запросов растет
➡️ количество данных растет
➡️ узлы выходят из строя
Эти изменения требуют перемещения данных из одних узлов на другие. Такое перемещение называется ребалансировкой (rebalancing).
Методики ребалансировки
❌ При шардировании по хэшу ключа НЕ рекомендуется использовать деление по модулю для определения узла.
Например, у нас 10 узлов.
Определим узел для записи с key = 1005.
hash(1005) mod 10 = 5
Кажется, что удобно так назначать номер узла.
Однако как только мы добавим в кластер новый узел, значения для всех ключей поменяются. При 11 узлах наша запись должна быть помещена на 4-й узел:
hash(1005) mod 11 = 4
Значит нам придется переносить почти все записи между шардами.
При 12 узлах запись нужно переместить на узел 9:
hash(1005) mod 12 = 9
Делать полный перенос при добавлении каждого нового узла дорого. Поэтому используют подходы, при которых перемещается минимально необходимое количество данных.
🟢 Фиксированное количество шардов
Такой подход используется в Elasticsearch, Couchbase.
Суть подхода в том, чтобы создать намного больше виртуальных шардов, чем физических узлов в системе, и распределить по несколько шардов на каждый узел.
Например, разбить базу данных, работающую на кластере из 10 узлов на 1000 шардов из расчета по 100 шардов на каждый узел.
При добавлении в кластер нового узла на него перемещается некое количество шардов от существующих узлов. Соответствие ключей шардам не меняется, переносятся только сами шарды между физическими узлами.
Подробнее на картинке к посту.
Количество шардов обычно задается при первичной настройке базы данных и потом не меняется. Сложность заключается в том, чтобы подобрать оптимальное количество шардов.
🟢 Динамическое количество шардов
Этот подход используется в HBase, RethinkDB.
Для пустой БД задают некое начальное количество шардов. Затем, когда размер шарда превышает заданный максимум (в HBase по умолчанию — 10 Гбайт), шард делится на два.
При динамическом шардировании количество шардов адаптируется под рост данных. Размер каждого шарда находится в заданных пределах.
При фиксированном количестве шардов при росте данных растёт размер каждого шарда.
В обоих случаях количество шардов не зависит от количества узлов. В следующем подходе количество узлов влияет.
🟢 Шардирование пропорционально количеству узлов
Этот подход используется в Cassandra.
На каждый узел приходится фиксированное количество шардов, например, 256 шардов на узел. Если количество узлов не меняется, то размеры шардов растут пропорционально количеству данных. При добавлении новых узлов — шарды уменьшаются.
Новый узел случайным образом выбирает фиксированное количество существующих шардов для разбиения. Затем забирает по половине каждого из разбиваемых шардов, а вторые половины шардов остаются на своих местах.
#шардирование #кабанчик #сисдиз
