TGViewer
Женя Янченко Женя Янченко @jane_yanchenko · 5.51K subscribers
Post #80 1.93K
Ребалансировка шардов

С течением времени:

➡️ количество запросов растет
➡️ количество данных растет
➡️ узлы выходят из строя

Эти изменения требуют перемещения данных из одних узлов на другие. Такое перемещение называется ребалансировкой (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 шардов на узел. Если количество узлов не меняется, то размеры шардов растут пропорционально количеству данных. При добавлении новых узлов — шарды уменьшаются.

Новый узел случайным образом выбирает фиксированное количество существующих шардов для разбиения. Затем забирает по половине каждого из разбиваемых шардов, а вторые половины шардов остаются на своих местах.

#шардирование #кабанчик #сисдиз
  • ❤ 7
  • 👍 7
  • 🔥 2
More from @jane_yanchenko
  1. Sep 30, 2026Представьте ситуацию. Дисклеймер: пример вымышленный, проблема реально встречающаяся 🐤 Вы…
  2. Sep 25, 2026В прошлой жизни, когда я была менеджером проектов, одним из первых мест работы у меня был…
  3. Sep 23, 2026Куда пропало обращение - развязка В прошлом посте у нас загадочно пропало обращение 58122.…
  4. Sep 23, 2026Куда пропало обращение Однажды от руководителя техподдержки пришло письмо, суть которого с…
  5. Sep 21, 2026🔗 Подборка постов про Кафку Как обещала на стриме, собрала посты про Кафку в удобное огла…
  6. Sep 21, 2026🎞 Готова запись стрима про Кафку: https://youtu.be/2aRKsD-MWDA Большое спасибо всем, кто…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →