Шардирование PostgreSQL
Вопрос
Одна база PostgreSQL перестаёт справляться с объёмом записи. Когда вы пойдёте в шардирование и как его спроектируете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Сначала дешёвые шаги: оптимизация запросов, индексы, партиционирование, реплики для чтения, вертикальный рост
Ключ шардирования выбираю по главному паттерну доступа (например, `tenant_id`), чтобы запросы шли в один шард
Хеш против диапазонов: равномерность против удобства диапазонных запросов, горячие ключи
Кросс-шардовые запросы и транзакции дороги: денормализация, саги, отдельное хранилище для аналитики
Решардинг: виртуальные шарды или consistent hashing, чтобы не перекладывать всё
Готовые решения: Citus, маршрутизация в приложении или прокси
Что могут спросить следом
- Как выбрать ключ, если у части клиентов в 1000 раз больше данных?
- Как делать уникальные id между шардами?
- Как выполнить отчёт по всем шардам?
Разбор
Шардирование это последний шаг, потому что оно усложняет всё: запросы, транзакции, миграции, бэкапы. До него проверяю, что исчерпаны оптимизация запросов, индексы, партиционирование, вынос чтения на реплики, архивация старых данных и вертикальный рост. Если упираемся в запись или объём одного узла, выбираю ключ по главному сценарию: в B2B это tenant_id, тогда почти все запросы клиента живут в одном шарде, и транзакции остаются локальными. Хеширование ключа даёт равномерность, диапазоны удобнее для сканов, но создают горячие шарды; крупных клиентов выношу на выделенные шарды. Кросс-шардовых транзакций избегаю: денормализую, а там, где нужно, использую саги и идемпотентные шаги. Отчёты по всем шардам уводятся в отдельное аналитическое хранилище (например, ClickHouse) через CDC. Чтобы потом расширяться без перекладывания всего, заранее делю данные на много виртуальных шардов и раскладываю их по физическим узлам. Из готового смотрю Citus, иначе маршрутизация в слое доступа к данным.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Репликация и отказоустойчивость PostgreSQL
Следующий вопрос
Что гарантирует синхронная репликация