Сколько может быть ведущих узлов в PostgreSQL?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ведущие узлы в PostgreSQL: Архитектура и Масштабирование
В PostgreSQL нет встроенного понятия "ведущего узла" в классическом смысле master-slave архитектуры, как в MySQL с потоковой репликацией. PostgreSQL использует более совершенный подход на основе Write-Ahead Logging (WAL) и потоковой репликации WAL.
Архитектура репликации PostgreSQL
В стандартной конфигурации PostgreSQL:
- Один первичный (Primary) узел — принимает все операции записи (INSERT, UPDATE, DELETE)
- Множество вторичных (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 архитектурой.