Для чего используется Patroni в контексте PostgreSQL?

«Для чего используется Patroni в контексте PostgreSQL?» — вопрос из категории Базы данных, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 динамически назначает текущему мастеру. Это можно организовать через:

  1. Интеграцию с DCS (Distributed Configuration Store): Приложение или пулер соединений (например, pgbouncer) могут запрашивать у DCS текущего мастера.
  2. Использование 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-приложения, критичные к доступности данных.