Как шардировать базу
Вопрос
Ваша таблица сообщений выросла до 20 ТБ и запись упёрлась в лидер. Как будете шардировать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Выбор ключа по главному запросу: chat_id, чтобы история чата лежала в одном шарде
Способ распределения: хеш или консистентное хеширование, логические шарды больше физических
Слой маршрутизации: в приложении, прокси или Citus
План миграции без простоя: двойная запись, перенос, сверка, переключение чтения
Цена: межшардовые запросы, глобальные индексы, горячие чаты
Что могут спросить следом
- Что делать с огромным чатом на миллион участников?
- Как добавить шарды через год?
- Как искать сообщения пользователя по всем чатам?
Разбор
Ключ выбираю по главному запросу: «последние сообщения чата», значит chat_id. Распределение по хешу от chat_id, причём сразу делаю много логических шардов, например 1 024, и раскладываю их по 8-16 физическим узлам: при росте переношу логические шарды целиком, а не перехешировываю данные. Маршрутизация в библиотеке приложения или через Citus. Миграция: включаю двойную запись в старую и новую схему, переношу историю батчами, сверяю, переключаю чтение, затем отключаю старую запись. Цена: поиск по всем чатам пользователя уже межшардовый, поэтому его выношу в отдельный индекс (например, Elasticsearch). Огромные чаты могут стать горячими, их дополнительно режу по времени.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.