Налаштування автоматичного Failover бази даних
Автоматичний failover — механізм, який обнаруджує недоступність мастер-сервера БД та автоматично промотує реплік до мастера без ручного втручання. Мета: зменшити RTO (Recovery Time Objective) з десятків хвилин до секунд.
Інструменти для PostgreSQL
Patroni — стандарт de facto
Patroni — Python-демон, що працює на кожному вузлі PostgreSQL. Використовує DCS (Distributed Consensus Store: etcd, Consul, ZooKeeper) для координації та обрання лідера.
# /etc/patroni/patroni.yml (на кожному вузлі)
scope: production-cluster
namespace: /service/
name: node1
restapi:
listen: 0.0.0.0:8008
connect_address: 192.168.1.10:8008
etcd3:
hosts: 192.168.1.20:2379,192.168.1.21:2379,192.168.1.22:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 30
maximum_lag_on_failover: 1048576 # 1MB максимальний лаг при failover
synchronous_mode: false
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.1.10:5432
data_dir: /var/lib/postgresql/14/main
authentication:
replication:
username: replication
password: replication_password
parameters:
max_connections: 200
shared_buffers: 256MB
wal_level: replica
hot_standby: on
Запуск:
systemctl start patroni
Перевірка статусу кластера:
patronictl -c /etc/patroni/patroni.yml list
# Показує лідера та реплік з лагом
Ручне переключення (планується):
patronictl -c /etc/patroni/patroni.yml switchover production-cluster
etcd для координації
# etcd кластер на трьох серверах
etcd --name etcd1 \
--data-dir /var/lib/etcd \
--listen-peer-urls http://192.168.1.20:2380 \
--listen-client-urls http://192.168.1.20:2379 \
--initial-advertise-peer-urls http://192.168.1.20:2380 \
--advertise-client-urls http://192.168.1.20:2379 \
--initial-cluster "etcd1=http://192.168.1.20:2380,etcd2=http://192.168.1.21:2380,etcd3=http://192.168.1.22:2380"
HAProxy для прозорого переключення
Patroni надає healthcheck endpoint:
-
GET /master→ 200 якщо вузол лідер -
GET /replica→ 200 якщо вузол репліка
# haproxy.cfg
frontend postgres_write
bind *:5000
default_backend postgres_master
backend postgres_master
option httpchk GET /master
http-check expect status 200
server node1 192.168.1.10:5432 check port 8008
server node2 192.168.1.11:5432 check port 8008
server node3 192.168.1.12:5432 check port 8008
MySQL: MySQL InnoDB Cluster
MySQL Router + Group Replication — офіційне рішення Oracle:
# Ініціалізація кластера (MySQL Shell)
mysqlsh [email protected]:3306
JS> dba.createCluster('myCluster')
JS> cluster = dba.getCluster()
JS> cluster.addInstance('[email protected]:3306')
JS> cluster.status()
Настройка MySQL Router:
mysqlrouter --bootstrap [email protected]:3306 --directory /etc/mysqlrouter
Router автоматично направляє запис на primary та оновлює маршрутизацію при failover.
Тестування failover
# Вибити поточний мастер
patronictl -c /etc/patroni/patroni.yml failover production-cluster --force
# Моніторинг переключення
watch -n 1 patronictl -c /etc/patroni/patroni.yml list
Типовий час failover з Patroni + etcd: 10–30 секунд.
Тривалість
Налаштування кластера Patroni на 3 вузлах з HAProxy та etcd — 3–4 робочих дні.







