Для чего используется шардирование и какие виды шардирования существуют
Что проверяют
Отличаете ли вы шардирование от репликации и понимаете ли, что выбор ключа почти необратим.
Как отвечать
Шардирование это горизонтальное разбиение данных между узлами: каждый хранит своё подмножество строк. Нужно, когда данные или нагрузка на запись перестали помещаться в один сервер.
Сразу разведите с соседними понятиями: репликация это копии одних и тех же данных ради отказоустойчивости и масштабирования чтения, а шардирование ради объёма и записи. Обычно применяют вместе: каждый шард ещё и реплицирован.
Виды по способу выбора шарда:
- по диапазону: ключи делятся на интервалы. Просто, поддерживает запросы по диапазону, но при монотонно растущем ключе (дата, автоинкремент) вся запись идёт в последний шард, и он становится горячей точкой;
- по хешу: шард выбирается хешем ключа. Распределение равномерное, горячих точек нет, но запросы по диапазону приходится рассылать во все шарды;
- по справочнику: отдельная таблица соответствия ключа и шарда. Максимально гибко, позволяет двигать данные точечно, но справочник становится узким местом и точкой отказа;
- по арендатору или региону: данные клиента целиком на одном шарде. Естественно для многопользовательских систем и удобно для требований о хранении данных в конкретной стране, но крупный клиент может перекосить нагрузку.
Главные сложности, которые надо назвать:
- перебалансировка при добавлении узла. Наивный остаток от деления переносит почти все данные, поэтому берут согласованное хеширование или заранее создают много логических шардов (скажем 1024) и раскладывают их по физическим узлам;
- запросы между шардами: соединения и агрегаты приходится собирать в приложении;
- транзакции между шардами требуют распределённого протокола или саги;
- идентификаторы: автоинкремент больше не работает, нужны UUID или генератор вроде снежинки.
Ключ шардирования выбирается один раз и меняется потом крайне болезненно, поэтому его подбирают под реальные запросы.
Где спотыкаются
Путают шардирование и репликацию.
Шардируют по дате и получают одну горячую точку.
Не продумывают перебалансировку и упираются при добавлении узла.
Выбирают ключ, по которому не идёт большинство запросов.