Ответ вслух Senior Масштабирование обновлено

Как шардировать базу

Вопрос

Ваша таблица сообщений выросла до 20 ТБ и запись упёрлась в лидер. Как будете шардировать?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Ключ выбираю по главному запросу: «последние сообщения чата», значит chatid. Распределение по хешу от chatid, причём сразу делаю много логических шардов, например 1 024, и раскладываю их по 8-16 физическим узлам: при росте переношу логические шарды целиком, а не перехешировываю данные.

Что должно прозвучать в ответе

  • Выбор ключа по главному запросу: chat_id, чтобы история чата лежала в одном шарде

  • Способ распределения: хеш или консистентное хеширование, логические шарды больше физических

  • Слой маршрутизации: в приложении, прокси или Citus

  • План миграции без простоя: двойная запись, перенос, сверка, переключение чтения

  • Цена: межшардовые запросы, глобальные индексы, горячие чаты

Что могут спросить следом

  • Что делать с огромным чатом на миллион участников?
  • Как добавить шарды через год?
  • Как искать сообщения пользователя по всем чатам?

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.