awesome-everything EN
↑ Обратно к восхождению

Базы данных

Зачем нужно шардирование: потолок одного Postgres

Суть У каждого экземпляра Postgres есть жёсткие пределы по CPU, хранилищу и пропускной способности; шардирование — единственный путь за них — но оно умножает каждую операционную задачу на число шардов.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 8 min

Postgres Отто работает при 95% CPU, рабочий набор данных перерос объём RAM, а запись перегружает единственный primary. Реплики для чтения помогают с чтением, но узкое место по записи — это сам сервер. Более мощного инстанса попросту не существует.

Потолок одного Postgres

У единственного экземпляра Postgres есть жёсткие пределы:

  • Рабочий набор против RAM: когда горячая часть данных перестаёт помещаться в shared_buffers плюс OS page cache, каждый запрос начинает обращаться к диску. Падение cache-hit ratio (blks_hit / (blks_hit + blks_read)) ниже 95–99% — главный сигнал тревоги.
  • Пропускная способность записи: единственный primary выдерживает примерно 10–50k транзакций в секунду в зависимости от железа. Выше этого значения генерация WAL доминирует по CPU и primary становится бутылочным горлышком.
  • Хранилище: практический потолок — около 1–10 ТБ рабочего набора в RAM на самых больших доступных машинах.

Вертикальное масштабирование (больше RAM, более быстрый NVMe) выигрывает время — нередко годы. Правильный порядок: сначала исправить медленные запросы, добавить индексы, добавить реплики для чтения, вертикально масштабироваться. Шардирование — последнее средство, а не первое.

Что делает шардирование

Шардирование берёт один логический датасет (все ваши orders, все ваши users) и разбивает его по N физическим экземплярам Postgres. Каждая строка живёт ровно на одном шарде, определяемом ключом шарда — колонкой или набором колонок (обычно tenant_id для B2B SaaS, user_id для B2C).

Один PostgresШардированный (4 инстанса)
Все строки на одной машинеСтроки разбиты по ключу шарда между 4 машинами
Один потолок CPU/IO~4× мощность по CPU/IO
Простые операции (1 бэкап, 1 миграция)4× операций (4 бэкапа, миграция запускается 4×)
Кросс-таблица joins: бесплатноКросс-шард joins: дорого

Выигрыш — почти линейное горизонтальное масштабирование: 10 шардов дают примерно 5–8× пропускной способности (накладные расходы на координацию снижают теоретический 10× прирост). Цена — каждая операционная задача: бэкапы, миграции, обновления, VACUUM — должна выполняться на каждом шарде.

Режим отказа hot shard

Самый важный режим отказа, против которого нужно проектировать с первого дня — это горячий шард (hot shard): один шард получает значительно больше трафика, чем остальные, потому что ключ шарда был выбран неудачно или один клиент вырос в 1000× раз по сравнению с медианным.

Пример: SaaS шардирует orders по customer_id. Корпоративный клиент подписывается и его заказы в 5 раз превышают сумму всех остальных клиентов. Их шард достигает 95% CPU, пока остальные шарды работают при 10%. Кластер по факту работает с мощностью одного шарда для доминирующего клиента.

Исправление — перемещение этого клиента на выделенный шард — рассматривается в уроке 05. Главный вывод здесь: выбор ключа шарда — это единственное наиболее важное проектное решение в шардированной системе, а плохой выбор приходится терпеть годами.

Метафора библиотеки

Шардирование — это разница между одной библиотекой с миллионом книг (одно здание, один стол выдачи, найти что угодно можно просто походив по зданию) и десятью библиотеками по 100k книг (десять зданий, нужен каталог «в какой библиотеке эта книга»). Единственная библиотека проще. Десятибиблиотечная установка требует каталога (карта шардов) и правила, в какое здание идти, прежде чем отправиться туда.

Книги, которые выдают миллион раз в год, заполняют одну библиотеку, пока остальные пустуют — это и есть режим отказа hot shard.

Почему это работает

Почему бы просто не взять более крупный облачный инстанс? Вертикальное масштабирование почти всегда дешевле шардирования в первые несколько лет. Точка принятия решения — когда вы измерили, что самого крупного доступного инстанса всё равно не хватает в пиковой нагрузке — обычно это 10 ТБ рабочего набора, устойчивая нагрузка записи 50k+ QPS или многолетние прогнозы, пересекающие эти пороги. Шардирование — дверь в одну сторону: как только схема и логика приложения написаны под шардированный мир, откат назад — это многомесячный проект.

Викторина

Что определяет ключ шарда?

Викторина

B2B SaaS шардирует 'orders' по customer_id. Один корпоративный клиент генерирует в 5 раз больше трафика, чем все остальные вместе взятые. Каков результат?

Расставь шаги по порядку

Упорядочьте стратегии масштабирования от самых дешёвых до самых дорогих (по операционной сложности), прежде чем прибегать к шардированию:

  1. 1 Исправить медленные запросы: добавить недостающие индексы, переписать неэффективный SQL
  2. 2 Добавить реплики для чтения, чтобы снять нагрузку с primary на read-heavy трафик
  3. 3 Добавить кеширующие слои (Redis, in-process) для горячих путей чтения
  4. 4 Вертикальное масштабирование: обновить до более крупного инстанса (больше RAM, более быстрый NVMe)
  5. 5 Шардирование: разбить датасет по нескольким экземплярам Postgres с помощью ключа шарда
Вспомните перед уходом
  1. 01
    Каковы три жёстких потолка единственного экземпляра Postgres, которые шардирование устраняет?
  2. 02
    В одном предложении: что такое режим отказа hot shard и что его вызывает?
  3. 03
    Почему операционная стоимость шардирования описывается как 'N×'?
Итог

Единственный экземпляр Postgres имеет жёсткие потолки по рабочему набору (RAM), пропускной способности записи и хранилищу, которые вертикальное масштабирование может только отсрочить, но не устранить. Шардирование разбивает датасет по N физическим экземплярам Postgres с помощью ключа шарда, давая примерно N× мощности ценой N× операционной сложности — каждая миграция, бэкап и обновление запускаются по разу на каждый шард. Центральный режим отказа — горячий шард: один шард насыщается, потому что ключ был выбран неудачно или один клиент перерос остальных. Опытные инженеры исчерпывают индексирование, кеширование, реплики для чтения и вертикальное масштабирование прежде чем шардировать — а когда всё же шардируют, выбирают ключ намеренно и проектируют реакцию на hot shard до первого инцидента.

Связанные уроки
встречается в140
Продолжить восхождение ↑Выбор ключа шарда: стратегии hash, range, list и directory
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.