High Availability
Load Balancers (keepalived)
- VIP: 10.10.19.100
- lb-1: MASTER (priority выше), lb-2: BACKUP
- При падении lb-1 — VIP переходит на lb-2
PostgreSQL (HAProxy + Patroni + etcd)
HAProxy (на lb-1 и lb-2): - Порт 5432: TCP proxy к текущему Patroni leader - Порт 8404: HAProxy stats dashboard - Автоматически определяет текущий leader через Patroni health checks - Приложения и voip-серверы подключаются к PostgreSQL через HAProxy
Patroni: - db-1: Primary (leader), db-2: Replica (streaming replication) - etcd кластер: db-1, db-2, mon-1 - При падении db-1 — Patroni промоутит db-2, HAProxy автоматически переключится
После failover: ODBC на voip-серверах может потребовать обновления:
ansible-playbook playbooks/failover-db.yml
Redis (Sentinel)
- Master: redis-1 (10.10.19.40:6379), master name: callbox-redis
- Sentinel кластер: redis-1, web-1, web-2 (порт 26379)
- При падении redis-1 — Sentinel выбирает новый master
- Backend подключается через Sentinel (автоматический failover)
Application Servers
- web-1, web-2: active-active, nginx (lb-1/lb-2) балансирует с least_conn
VoIP серверы
- voip-1: основной (SIP NAT направлен на него), voip-2: резервный
- Переключение: изменить NAT правила на lb-1/lb-2
- ВАЖНО: разные dialplan engines (pbx_lua/pbx_ael) — при failover поведение может отличаться
Известные проблемы
- После Patroni failover ODBC на voip-серверах может указывать на старый primary. Запустить failover-db.yml.
- AMI настроен только на voip-1. При переключении на voip-2 мониторинг через AMI не работает.
- voip-1 и voip-2 имеют разные dialplan engines — планируется унификация.
История изменений
- 2026-02-12: Добавлен HAProxy. Проверены роли Patroni (db-1=leader, db-2=replica).