← Назад к вопросам

Сколько может быть ведущих узлов в PostgreSQL?

2.0 Middle🔥 231 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ведущие узлы в PostgreSQL: Архитектура и Масштабирование

В PostgreSQL нет встроенного понятия "ведущего узла" в классическом смысле master-slave архитектуры, как в MySQL с потоковой репликацией. PostgreSQL использует более совершенный подход на основе Write-Ahead Logging (WAL) и потоковой репликации WAL.

Архитектура репликации PostgreSQL

В стандартной конфигурации PostgreSQL:

  1. Один первичный (Primary) узел — принимает все операции записи (INSERT, UPDATE, DELETE)
  2. Множество вторичных (Standby/Replica) узлов — получают копию WAL-логов и применяют изменения

Можно иметь:

  • 1 первичный узел (обязательно)
  • Неограниченное количество вторичных узлов (теоретически)
  • На практике 5-10 репликах — оптимум из-за задержек WAL-потока

Практическая реализация

# Проверка статуса репликации на первичном узле
import psycopg2

conn = psycopg2.connect("dbname=mydb user=postgres host=primary_host")
cur = conn.cursor()

# Просмотр подключенных реплик
cur.execute("""
    SELECT client_addr, state, flush_lsn, replay_lsn 
    FROM pg_stat_replication;
""")
replicas = cur.fetchall()
print(f"Количество активных реплик: {len(replicas)}")
for replica in replicas:
    print(f"  Реплика {replica[0]}: {replica[1]}")

Высокодоступность: Решения с несколькими master-узлами

Если вам нужно несколько ведущих узлов (multi-master):

Вариант 1: Patroni + etcd

  • Автоматический failover
  • Один узел всегда является primary
  • Остальные — standby
# Пример: как приложение находит текущий primary
import etcd3

client = etcd3.client()
primary_info = client.get('/patroni/postgresql/leader')
print(f"Текущий primary: {primary_info[0]}")

Вариант 2: pg_partman или Citus (sharding)

  • Горизонтальное масштабирование
  • Разные узлы отвечают за разные диапазоны данных

Вариант 3: Logical Replication

  • Несколько primary-узлов в разных регионах
  • Каждый может принимать записи
  • Требует разрешения конфликтов
# Настройка logical replication на primary
cur.execute("""
    CREATE PUBLICATION my_publication FOR ALL TABLES;
    -- На replicate узле:
    CREATE SUBSCRIPTION my_subscription 
    CONNECTION 'dbname=mydb host=primary_host' 
    PUBLICATION my_publication;
""")

Ключевые параметры для репликации

# postgresql.conf
wal_level = replica              # Минимум для репликации
max_wal_senders = 10             # Max реплик одновременно
wal_keep_segments = 64           # Хранить WAL-логи
wal_receiver_status_interval = 10s  # Интервал отчётов
wal_receiver_timeout = 60s       # Timeout для replicas

Итог

Ответ на вопрос: В классической потоковой репликации PostgreSQL может быть 1 первичный узел и неограниченное (практически 5-10) количество вторичных узлов. Если нужна multi-master архитектура, используйте Patroni, Citus или Logical Replication.

Для интервью запомните: PostgreSQL — это система с одним primary узлом и множеством replica узлов, в отличие от некоторых других БД с истинной multi-master архитектурой.