Как определить, какие данные должны лежать на одном сервере, а какие на другом
Что проверяют
Понимаете ли вы, что распределение данных по серверам определяют запросы, а не таблицы: что читается вместе, должно лежать вместе. Отдельно смотрят, отличаете ли вы шардинг от репликации и знаете ли цену межсерверных операций. Следом обычно просят выбрать ключ шардирования для конкретной задачи, например для заказов интернет-магазина.
Как отвечать
Идите от вопросов, которые определяют разбиение:
- функциональное разделение: данные разных доменов живут в разных базах за своими сервисами. Это первый шаг, и после него шардирование часто не нужно вовсе;
- паттерны доступа: что читается одним запросом и меняется одной транзакцией, держат на одном узле. Заказ и его позиции лежат рядом, иначе каждый запрос превращается в распределённый join;
- ключ шардирования: высокая кардинальность, равномерное распределение и присутствие почти в каждом запросе. Для SaaS это часто
tenant_id, для магазинаcustomer_id; - схема разбиения: хэш даёт равномерность, диапазон удобен для выборок по интервалам, но создаёт горячий шард на свежих данных, справочник гибок, но сам становится точкой отказа. Consistent hashing упрощает добавление узлов;
- горячие и холодные данные: архив уходит на дешёвое хранилище, оперативные данные остаются на быстрых узлах;
- закон: персональные данные граждан РФ по 152-ФЗ записываются и хранятся в базах на территории России, это граница независимо от нагрузки.
Репликация копирует одни и те же данные ради чтения и отказоустойчивости, шардинг делит их. В Java маршрутизацию делают через AbstractRoutingDataSource в Spring, multi-tenancy в Hibernate или Apache ShardingSphere, либо отдают базе: Citus для PostgreSQL, Vitess для MySQL.
Где спотыкаются
Шардируют диапазонами по автоинкрементному id или по дате. Вся запись идёт в последний шард, остальные простаивают.
Выбирают ключ, которого нет в основных запросах. Тогда поиск заказов пользователя опрашивает все шарды сразу, и масштабирование ничего не даёт.
Не думают о транзакциях между шардами. Перевод денег между пользователями на разных узлах уже требует саги или двухфазного коммита, и сказать об этом лучше до того, как спросят.