теория

Когда узлов становится больше

Шардировали — и вроде выдохнули. Но система живая: она растёт, и однажды узлов снова не хватит. Значит, надо уметь добавлять их дёшево. Тут и прячется вторая ловушка.

Самый наивный способ раскидать ключи — «шард = хеш(ключ) mod N», где N — число узлов. Ровно до первого нового узла: меняешь N с четырёх на пять — и остаток от деления меняется почти у КАЖДОГО ключа. Почти все данные разом едут на новое место. В пиковую неделю это самоубийство.

Поэтому делают иначе. Один рабочий приём: заранее нарезать много фиксированных партиций — скажем, тысячу — и раскидать их по узлам. Ключ всегда лежит в своей партиции, число партиций не меняется, а при добавлении узла переезжают лишь несколько партиций целиком. Двигаются контейнеры, а не их содержимое.

И ещё одна вещь, которую шардирование ломает молча, — . Пока всё в одной базе, «найди все заказы фермера Х» — простой запрос по индексу. А когда заказы разрезаны по покупателю, заказы одного фермера рассыпаны по всем шардам: приходится спрашивать каждый и собирать ответы (scatter-gather) — либо держать отдельный глобальный индекс, который сам дорожает на каждой записи. Разрезав данные, ты платишь за любой запрос, который идёт не по ключу шардирования.

← назад