Сейчас решаю кейс с балансировкой PostgreSQL в ситуации, когда на программном уровне быстро не завести. В итоге пришел к компромиссному варианту: минимум доработок в приложении, но при этом нормальный масштабируемый HA кластер: Odyssey → HAProxy → PostgreSQL → Patroni.
Odyssey закрывает вопрос с пуллингом соединений, HAProxy маршрутизирует трафик и разводит чтение и запись, Patroni управляет кластером PostgreSQL — лидер, реплики, failover. В итоге даём два адреса подключения: один строго под запись, второй под чтение.
Есть вариант отказаться от Patroni: в HAProxy есть runtime-команды, поэтому можно переключать мастер и реплики на основе health-check’ов. Рабоче, но вся логика failover’а и крайние случаи остаются на вас.
Ещё вариант — Pgpool-II. Им можно заменить Odyssey + HAProxy (и частично Patroni), но компонент тяжёлый в настройке и поддержке.
Post #622
531