Перейти к содержимому

Кейс · Серверы и СХД

Кластер PostgreSQL Patroni для телеком-провайдера, Ростов-на-Дону

Построили кластер PostgreSQL 15 + Patroni для телеком-провайдера в Ростове: RPO 0, RTO 62 сек, NVMe RAID-1 под WAL, HAProxy на виртуальном IP, экономия 10%.

0
позиций в поставке
0
дней до поставки
0%
экономия клиента
0
сумма проекта, ₽

Коротко о проекте

Что поставили

Сервер 1U Xeon Silver 4416+, 128 ГБ DDR5 ECC, 2×NVMe 3.84 ТБ + 2×NVMe 1.92 ТБ, 4×10 GbE3 шт.
Коммутатор 10 GbE 24-port2 шт.
NAS 4U 24×HDD 8 ТБ RAID-6, 2×10 GbE1 шт.
DAC-кабель 10G 1m6 шт.
ИБП 1 кВА он-лайн с SNMP3 шт.

Ростовский телеком-провайдер с абонентской базой 180 000 абонентов использовал одиночный PostgreSQL 15 на физическом сервере для биллинга и CRM. Резервирование на уровне СУБД отсутствовало: ночной pg_dump на локальный диск — единственная защита данных. В марте произошёл инцидент: контроллер RAID вышел из строя, массив разрушился, восстановление из дампа заняло 11 часов. 11 часов простоя биллинга означали: новые подключения не оформлялись, платежи абонентов не зачислялись, операторы колл-центра работали вручную. По оценке финансового директора, прямые и косвенные потери составили около 800 000 рублей. После инцидента принято решение построить отказоустойчивый кластер PostgreSQL на базе Patroni с автоматическим фейловером и RPO не более 30 секунд.

Задача клиента

Построить кластер PostgreSQL 15 + Patroni (3 узла: primary + standby + witness) на новых серверах с NVMe-дисками. RPO не более 30 секунд (синхронная репликация на standby). RTO не более 60 секунд (автоматический фейловер Patroni). Хранить WAL-архив для PITR (Point-In-Time Recovery) 30 дней. Бюджет — 2,8 млн рублей. Серверы в двух разных стойках с разными линиями питания.

Ограничения и требованияЧто предложили

Три сервера 1U с одинаковой конфигурацией: процессор Intel Xeon Silver 4416+, 128 ГБ DDR5 ECC, 2×NVMe 3.84 ТБ (RAID-1 — зеркало) для data, 2×NVMe 1.92 ТБ (RAID-1) для WAL, сетевой адаптер 4×10 GbE (2 порта для репликации, 2 для клиентского трафика). Выбор DDR5 вместо DDR4 продиктован пропускной способностью памяти: PostgreSQL при больших shared_buffers интенсивно использует оперативную память как кеш данных, DDR5 даёт на 30–40% большую пропускную способность по сравнению с DDR4 для подобных нагрузок.

Раздельные NVMe-устройства для WAL и data — ключевое архитектурное решение для производительности PostgreSQL при синхронной репликации. WAL (Write-Ahead Log) — критический путь записи: каждая транзакция ждёт подтверждения записи WAL на диск и на удалённый standby. Размещение WAL на отдельном NVMe-массиве исключает конкуренцию за IOPS между WAL и случайными чтениями data-файлов. Измеренная задержка fsync на NVMe RAID-1: 0,12 мс против 0,8 мс на SAS SSD RAID-10 — в 6,5 раз быстрее на критическом пути записи транзакций.

Patroni + HAProxy + Keepalived для прозрачного фейловера без изменения строки подключения в приложениях биллинга и CRM. HAProxy слушает на виртуальном IP (Keepalived), анализирует роль узлов Patroni через REST API и направляет write-трафик только на текущий primary. При фейловере HAProxy автоматически переключает write-трафик на новый primary через 15–20 секунд после того, как Patroni завершил процедуру переключения. Приложениям не нужно знать, какой именно сервер является primary — они подключаются всегда к одному виртуальному IP.

WAL-архивирование на выделенный NAS для PITR: WAL-сегменты архивируются в real-time на NAS с помощью pgBackRest. Восстановление на любой момент времени в пределах 30 дней — важно для сценариев «случайно удалили таблицу» или «испортили данные batch-скриптом». Полное базовое резервное копирование — еженедельно, инкрементальные резервные копии — ежедневно. Восстановление базы 2,4 ТБ из pgBackRest с delta-restore занимает 40–55 минут против 11 часов в инциденте с pg_dump.

Нагрузочное тестирование нового кластера перед вводом в эксплуатацию проводилось с помощью pgbench: стандартный TPC-B тест с масштабным коэффициентом 500 (эквивалент ~8 млн аккаунтов) показал 14 200 TPS (транзакций в секунду) при задержке P99 4,2 мс. Для сравнения: старый одиночный сервер выдавал 4 800 TPS при задержке P99 18 мс. Почти троекратный рост TPS объясняется прежде всего переходом с SAS SSD RAID-10 на NVMe RAID-1: задержка случайной записи снизилась в 6 раз, что принципиально для биллинговых нагрузок с высокой частотой коротких транзакций.

Мониторинг кластера Patroni настроен через Prometheus + Grafana с набором PostgreSQL-специфичных метрик: lag репликации (target: менее 10 мс в штатном режиме), размер WAL-очереди, TPS и P99-задержка запросов, размер shared_buffers cache hit ratio (target: более 98%). Алерты настроены на три уровня: info (lag репликации превысил 100 мс — наблюдение), warning (lag превысил 500 мс — выяснить причину), critical (primary недоступен более 30 секунд — немедленная эскалация). Такая система мониторинга позволяет обнаруживать деградацию репликации до развития в полноценный инцидент.

Планирование расширения кластера предусмотрено архитектурой с первого дня: четвёртый узел (second standby в другом географическом сегменте сети, в резервном ЦОД) легко добавляется к существующему кластеру Patroni без остановки primary. Когда телеком-провайдер завершит строительство резервного ЦОД, PostgreSQL-кластер получит ещё один узел репликации для географически распределённой защиты данных. Существующие серверы, коммутаторы и NAS останутся в работе без каких-либо изменений — только добавится новый узел. Такая масштабируемость «без переделки» была специально заложена в топологию при первоначальном проектировании.

Состав поставки по подсистемамЭтапы и сроки поставкиРезультат

Кластер PostgreSQL Patroni запущен и принял первый переключатель фейловера в тестовом режиме: остановка primary-сервера, автоматическое промоутирование standby1 в primary за 48 секунд, хаProxy переключил трафик через 62 секунды — в рамках целевого RTO 60 секунд с небольшим превышением, устранённым настройкой таймаутов HAProxy. Экономия к бюджету составила 10%.

За первые полгода работы кластера произошло одно реальное событие фейловера: плановые работы по замене блока питания в стойке primary-сервера потребовали его перезапуска. Фейловер прошёл в штатном режиме: biлlinг продолжил работу с перерывом 54 секунды. Операторы колл-центра зафиксировали «небольшой кратковременный сбой» вместо 11-часового простоя, как год назад. Ни одного не зачисленного платежа, ни одного не оформленного подключения.

PITR впервые применён через 4 месяца после запуска: разработчик случайно выполнил UPDATE без WHERE в таблице тарифных планов. Восстановление через pgBackRest с PITR на 5 минут до выполнения запроса заняло 52 минуты — против потенциального ручного восстановления 4–8 часов. Данные восстановлены полностью, ни одного абонента с некорректным тарифом.

Почему выбрали нас

Данные приведены справочно и не являются публичной офертой. Актуальные цены, наличие и сроки поставки уточняйте при оформлении заказа.

Частые вопросы

Почему NVMe для WAL на отдельных дисках?

WAL — критический путь записи каждой транзакции. Отдельный NVMe RAID-1 устраняет конкуренцию с data-файлами: задержка fsync 0,12 мс вместо 0,8 мс на SAS SSD.

Что такое Patroni и как работает фейловер?

Patroni — агент HA для PostgreSQL. При недоступности primary он промоутирует standby в новый primary за 30–60 секунд. HAProxy переключает трафик автоматически.

Что такое PITR и когда нужен?

PITR (Point-In-Time Recovery) — восстановление базы на точный момент времени. Нужен при случайном DROP TABLE или UPDATE без WHERE — можно откатиться до момента до ошибки.

Зачем два коммутатора?

Серверы в разных стойках подключены к разным коммутаторам. При потере одного коммутатора или стойки кластер продолжает работу через второй.

Как масштабировать кластер при росте нагрузки?

Добавляется четвёртый узел-реплика без остановки кластера. HAProxy распределяет read-only запросы на все реплики, снижая нагрузку на primary.

Посчитайте свою экономию

При подборе под задачу и спец-ценах от производителя экономия по этому кейсу — 10%. Двигайте бюджет и смотрите вашу выгоду.

Ваш бюджет на оборудование1 000 000
100 тыс ₽20 млн ₽
Ваша экономия
100 000
Итого к оплате
900 000
Подобрать решение под мою задачу

Оценка ориентировочная. Точную цену и срок подтвердит менеджер.

Нужно похожее решение?

Опишите задачу — подберём оборудование с оптовыми ценами, сроками и наличием. Регистрация не нужна.

Кейс приведён для примера, данные обезличены. Состав, цены, сроки и экономия носят справочный характер, не являются публичной офертой и не гарантируют аналогичный результат — каждый проект рассчитывается индивидуально, наличие и цены подтверждаются при оформлении заказа.