Что происходит при масштабировании системы на примере шардирования
Что проверяют
Понимаете ли вы, что шардирование это не «ускорение базы», а размен: вы получаете горизонтальный рост записи и объёма, отдавая транзакции, соединения таблиц и простоту эксплуатации. Смотрят, назовёте ли цену, а не только выгоду.
Как отвечать
Сначала оговорите порядок: шардирование это последняя мера. До него идут индексы и переписанные запросы, кэш, реплики для чтения, вынос аналитики в отдельное хранилище, секционирование таблицы внутри базы. Всё это не ломает транзакционность, а шардирование ломает.
Шардирование это разрезание данных по ключу на независимые базы, каждая со своим набором строк, и запрос попадает на нужную по значению ключа. Способы раскладки:
- по остатку от хеша: равномерно, но добавление шарда двигает почти все данные, если заранее не нарезать много логических шардов на малое число физических;
- по диапазону: удобны выборки по диапазону, зато свежие записи бьют в один шард;
- по справочнику: гибко, но справочник становится узким местом и точкой отказа.
Что меняется в приложении: пул подключений на каждый шард, маршрутизация по ключу в слое доступа к данным, глобально уникальные идентификаторы вместо автоинкремента, а запрос без ключа шардирования превращается в опрос всех шардов со слиянием на стороне приложения. Транзакция поперёк шардов либо исключается из дизайна, либо становится сагой с компенсациями.
Где спотыкаются
Выбирают ключ по удобству записи и получают перекос. Ключ по дате или автоинкременту сваливает всю свежую нагрузку в последний шард. Обратная крайность тоже встречается: ключ равномерный, но ни один частый запрос по нему не фильтруется, и каждое чтение идёт по всем шардам.
Второе: забывают про уникальность и агрегаты. Автоинкремент на каждом шарде выдаёт одни и те же значения, уникальный индекс по адресу почты перестаёт быть уникальным в системе целиком, а постраничная выдача с сортировкой требует собрать и слить ответы всех шардов.
Третье: не продумывают переезд. Шардирование выглядит разовым решением, а решардинг живой системы это отдельный проект с двойной записью и сверкой. Ответ, в котором нет ни слова о том, как добавить шард без остановки, читается как пересказ книжки.