Если вы хотите использовать решение на основе Docker, попробуйте PostDock.
В настоящее время я пробовал это в нашем проекте с docker-compose со схемой, показанной ниже:
pgmaster (primary node1) --|
|- pgslave1 (node2) --|
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client
|- pgslave3 (node4) --|
|- pgslave4 (node5) --|
Я протестировал следующие сценарии, и все они работают очень хорошо:
- Репликация: изменения, внесенные на первичном (т. Е. Главном) узле, будут реплицированы на все резервные (т. Е. Подчиненные) узлы.
- Отработка отказа: останавливает основной узел, а резервный узел (например, node4) автоматически принимает на себя основную роль.
- Предотвращение появления двух основных узлов: воскресите предыдущий основной узел (node1), node4 продолжит работу как основной узел, а node1 будет синхронизироваться, но как резервный узел.
Что касается клиентского приложения, все эти изменения прозрачны. Клиент просто указывает на узел pgpool и продолжает нормально работать во всех вышеупомянутых сценариях.
Примечание. Если у вас возникли проблемы с запуском PostDock, вы можете попробовать мою разветвленную версию PostDock.
Pgpool-II со сторожевым псом
Проблема с вышеупомянутой архитектурой заключается в том, что pgpool является единственной точкой отказа. Поэтому я также попытался включить Watchdog для pgpool-II с помощью делегированный виртуальный IP-адрес, чтобы избежать единой точки отказа.
master (primary node1) --\
|- slave1 (node2) ---\ / pgpool1 (active) \
| |- slave2 (node3) ----|---| |----client
|- slave3 (node4) ---/ \ pgpool2 (standby) /
|- slave4 (node5) --/
Я протестировал следующие сценарии, и все они работают очень хорошо:
- Нормальный сценарий: оба pgpools запускаются, и виртуальный IP-адрес автоматически применяется к одному из них, в моем случае pgpool1
- Аварийное переключение: завершение работы pgpool1. Виртуальный IP-адрес будет автоматически применен к pgpool2, который, следовательно, станет активным.
- Не удалось запустить pgpool: запустить снова pgpool1. Виртуальный IP-адрес будет храниться в pgpool2, а pgpool1 теперь работает как резервный.
Что касается клиентского приложения, все эти изменения прозрачны. Клиент просто указывает на виртуальный IP-адрес и продолжает нормально работать во всех вышеупомянутых сценариях.
Вы можете найти этот проект в моем репозитории GitHub в ветке сторожевого пса.
person
Yuci
schedule
14.12.2017