Ответ вслух Senior NoSQL и выбор хранилища обновлено

Шардирование PostgreSQL

Вопрос

Одна база PostgreSQL перестаёт справляться с объёмом записи. Когда вы пойдёте в шардирование и как его спроектируете?

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

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

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

Коротко

Шардирование это последний шаг, потому что оно усложняет всё: запросы, транзакции, миграции, бэкапы. До него проверяю, что исчерпаны оптимизация запросов, индексы, партиционирование, вынос чтения на реплики, архивация старых данных и вертикальный рост.

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

  • Сначала дешёвые шаги: оптимизация запросов, индексы, партиционирование, реплики для чтения, вертикальный рост

  • Ключ шардирования выбираю по главному паттерну доступа (например, `tenant_id`), чтобы запросы шли в один шард

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

  • Кросс-шардовые запросы и транзакции дороги: денормализация, саги, отдельное хранилище для аналитики

  • Решардинг: виртуальные шарды или consistent hashing, чтобы не перекладывать всё

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

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

  • Как выбрать ключ, если у части клиентов в 1000 раз больше данных?
  • Как делать уникальные id между шардами?
  • Как выполнить отчёт по всем шардам?

Разбор

Шардирование это последний шаг, потому что оно усложняет всё: запросы, транзакции, миграции, бэкапы. До него проверяю, что исчерпаны оптимизация запросов, индексы, партиционирование, вынос чтения на реплики, архивация старых данных и вертикальный рост. Если упираемся в запись или объём одного узла, выбираю ключ по главному сценарию: в B2B это tenant_id, тогда почти все запросы клиента живут в одном шарде, и транзакции остаются локальными. Хеширование ключа даёт равномерность, диапазоны удобнее для сканов, но создают горячие шарды; крупных клиентов выношу на выделенные шарды. Кросс-шардовых транзакций избегаю: денормализую, а там, где нужно, использую саги и идемпотентные шаги. Отчёты по всем шардам уводятся в отдельное аналитическое хранилище (например, ClickHouse) через CDC. Чтобы потом расширяться без перекладывания всего, заранее делю данные на много виртуальных шардов и раскладываю их по физическим узлам. Из готового смотрю Citus, иначе маршрутизация в слое доступа к данным.

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

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