Ответ
Patroni — это инструмент для оркестрации и управления отказоустойчивыми кластерами PostgreSQL. В стеке, где Node.js-приложение использует PostgreSQL как основную БД, Patroni решает критически важную задачу: обеспечение высокой доступности (High Availability, HA).
Основные функции Patroni:
- Автоматический failover: Если мастер-нода PostgreSQL падает, Patroni автоматически продвигает одну из реплик в мастера, минимизируя время простоя.
- Управление репликацией: Автоматически настраивает и поддерживает streaming-репликацию.
- Хранение состояния кластера: Использует распределённое хранилище конфигурации (etcd, Consul, ZooKeeper) как "источник истины" о том, какая нода является мастером. Это предотвращает "раскол мозга" (split-brain).
- REST API: Предоставляет API для мониторинга состояния кластера и ручного управления (например, switchover).
Как это связано с Node.js-приложением? Приложение подключается не напрямую к IP-адресу сервера БД, а к виртуальному DNS-имени или IP (VIP), которое Patroni динамически назначает текущему мастеру. Это можно организовать через:
- Интеграцию с DCS (Distributed Configuration Store): Приложение или пулер соединений (например,
pgbouncer) могут запрашивать у DCS текущего мастера. - Использование HAProxy: HAProxy настраивается на проверку здоровья через REST API Patroni и направляет запросы только на живого мастера.
Пример конфигурации подключения Node.js: Ваше приложение использует строку подключения к HAProxy, который выступает как умный прокси.
// config/database.js
const { Pool } = require('pg');
const pool = new Pool({
host: 'haproxy-host', // HAProxy, который знает текущего мастера через Patroni
port: 5432,
user: 'app_user',
password: 'secure_password',
database: 'app_db',
// Пул соединений помогает пережить короткие переключения
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 5000 // Таймаут, чтобы быстро получить ошибку при недоступности
});
module.exports = pool;
Итог: Patroni — это ключевой компонент для обеспечения отказоустойчивости PostgreSQL в production-средах, где работают Node.js-приложения, критичные к доступности данных.