теория

Разрезать, а не скопировать

Смотри, вчера ты научился копировать данные целиком — это реплики. Сегодня — прямо противоположное движение: разрезать один большой набор на куски и разложить по разным машинам, чтобы каждая держала только свой. Копия защищает от падения; разрез — от того, что данные и запись перестали влезать в одну машину.

Резать можно двумя способами, и у каждого своя цена.

По диапазону. Заказы 1–1 000 000 — на первый шард, 1 000 001–2 000 000 — на второй, и так далее. Плюс: диапазонные запросы («все заказы за март») бьют в один-два шарда. Минус: свежие записи вечно летят в последний шард — горячий край.

По хешу ключа. Берём хеш от ключа и по нему раскидываем. Плюс: нагрузка размазывается ровно, без горячего края. Минус: диапазонный запрос теперь бьёт во все шарды сразу — соседние по смыслу записи разлетаются по разным машинам. Честный размен: равномерность против локальности.

Отдельная тонкость — что делать, когда узлов станет больше. Наивное «хеш по модулю числа узлов» при добавлении одного узла перетасует почти всё. Поэтому используют и его родню: добавил узел — переехала лишь малая доля данных, а не весь набор.

И держи в голове главное: ключ шардирования выбирают один раз и почти навсегда. Поменять его позже — это, по сути, перелить всю базу заново. Поэтому думают о нём дольше, чем о чём угодно ещё.

← назад