Назад | Перейти на главную страницу

Аварийное переключение пула PG приводит к сбою сети двух независимых мастеров

У меня есть два сервера, настроенных с PG Pool, чтобы создать настройку HA для веб-приложения.

PGPool и postgres работают на обоих серверах, используя потоковую репликацию с сервера 1 на сервер 2. Веб-приложение на каждой машине подключается к PgPool, который затем отправляет запрос текущему мастеру. Он настроен на автоматическое переключение при отказе в случае прерывания соединения с базой данных, который запускает настраиваемый сценарий аварийного переключения для понижения уровня сервера 1 до подчиненного и повышения уровня сервера 2 до главного.

Сегодня утром произошло то, что на 2 минуты сеть вышла из строя, что означает, что ни один экземпляр PGPool не мог разговаривать друг с другом, поэтому каждый PGPool думал, что другая машина не работает.

Сервер 1 - продолжил в качестве главного, отключив сервер 2
Сервер 2 - инициировал аварийное переключение, отключив сервер 1 и сделав себя мастером

Поскольку сеть не работала, команда аварийного переключения не могла пройти к серверу 1, чтобы сделать его подчиненным, и наоборот. Итак, когда через 2 минуты сеть восстановилась, у меня было два сервера, которые оба считали себя главными.

PgPool, похоже, не имеет автоматической команды восстановления после сбоя, которую можно было бы использовать, чтобы заставить сервер 1 снова стать мастером при повторном подключении сети, что является единственным реальным решением, которое я могу придумать.

У меня вопрос: как мне поступить в этой ситуации? Это вообще правильная архитектура для этой установки? Конечно, это распространенный сценарий, я не могу понять, как это можно исправить.

Изменить: было бы целесообразно запустить pgpool под виртуальным IP-адресом под linux-ha? Который мог решайте проблемы, и у меня уже есть это для общедоступного IP-адреса - таким образом, только один экземпляр pgpool получает доступ с любой машины.

Во-первых, я думаю, что у pgpool2 есть команда восстановления после сбоя, но в этом случае это не поможет. Проблема в том, что возникнет хаос, если обе машины будут считать себя хозяевами. Более того, здесь у вас был простой случай: отключилась сеть. Что делать, если сеть разделена? То есть обе машины подключены, но как-то теряют связь друг с другом. В этом случае обе машины станут главными и будут обслуживать разных клиентов, и у вас будет разветвленная база данных. Это более редкий случай, но уверены ли вы, что настолько маловероятно, что вы готовы рискнуть в результате хаоса?

Альтернативой может быть следующее:

                                    +- master db
                                    |
                ------ pgpool ------+
                                    |
                                    +- hot standby

Однако в этом случае у вас есть единственная точка отказа, pgpool, которая вам, вероятно, не нужна. Я знаю только два способа решить эту проблему. Самый простой - только продвигать резервный сервер для управления вручную, и это применимо к вашей архитектуре. Ваши приложения должны будут перейти в режим только для чтения до вмешательства человека.

Второй способ - иметь кворумы. Одна из архитектур, которая может работать, такова:

                +--- pgpool standing by -+    +- master db
                |                        |    |
   failover ip -+--- active pgpool      -+----+- hot standby 1
                |                        |    |
                +--- pgpool standing by -+    +- hot standby 2
                                              |
                                              +- hot standby 3

                                              (as many standby servers as
                                              you want, so that you have
                                              read-only load balancing)

Три пула pgpools работают на трех разных машинах, каждая со своим собственным IP-адресом, но они также предоставляют дополнительный IP-адрес аварийного переключения, который используется только активной машиной, и он используется клиентами. Если активный pgpool выходит из строя, его берет на себя резервный pgpool. Этого можно добиться с помощью heartbeat.

Чтобы преобразовать горячий резерв в мастеринг, кворум pgpools (то есть, по крайней мере, два из трех) должен принять решение об этом; и они выполнят решение только после задержки, скажем, в 10 секунд после принятия решения. Кроме того, активный pgpool может не продолжать использовать существующий главный db в течение более 10 секунд без получения подтверждения хотя бы от другого pgpool (это сделано для защиты от случая, когда два резервных pgpool теряют соединение с активным pgpool и к мастер в то же время продвигает горячий резерв к мастеру, но активный pgpool продолжает использовать старый мастер).

На самом деле третий pgpool не должен участвовать в резервном IP-адресе, а просто присутствовать там, чтобы помогать кворуму. Кроме того, я не знаю, достаточно ли у pgpool возможностей для этого. Может тебе нужен еще один демон. Более общая архитектура такова:

              +--- active pgpool      -+          +- master db
              |                        |          | 
 failover ip -+                       -+----------+- hot standby 1
              |                        |          | 
              +--- pgpool standing by -+      +---+- hot standby 2
                                              |   | 
                                              |   +- hot standby 3
                monitoring daemon 1 ---+      |
                                       |      |
                monitoring daemon 2 ---+------+
                                       |
                monitoring daemon 3 ---+

В этом случае балансировка нагрузки, выполняемая pgpool, отделена от мониторинга и перехода от режима ожидания к мастеру. Обратите внимание, что вы можете разместить pgpools, серверы баз данных и демоны мониторинга на одном компьютере, но два pgpools должны находиться на двух разных машинах, а три демона мониторинга должны быть на трех разных машинах. Обратите внимание, что я не знаю, существует ли готовый демон мониторинга со всеми необходимыми функциями.

Детали могут быть изменены, но я думаю, что если вы сделаете автоматическое продвижение из режима ожидания в мастер без использования кворума, у вас возникнут проблемы.

Это вообще правильная архитектура для этой установки? Конечно, это распространенный сценарий, я не могу понять, как это можно исправить.

Отказ от ответственности: я не использовал pgpool, но знаю, что он делает.

В программном обеспечении для кластеризации обычно не требуются автоматические операции, которые могут нарушать правила параллелизма (например, что-то должно быть в сети только в одном месте), когда кластеру известно о состоянии менее половины узлов. Это предотвращает состояние расщепления мозга, подобное тому, которое вы испытывали. В двухузловом кластере это будет означать, что в случае потери сетевого взаимодействия между двумя узлами не должно происходить автоматического переключения при отказе. Человек должен принять решение об аварийном переключении, проверив, что это правильное действие, в зависимости от того, находится ли «другой» узел в автономном режиме, или допустив, что может быть потеря нереплицированных транзакций. Я не знаю, можно ли это настроить в pgpool.

Если ваши серверы находятся в одной локальной сети (низкая задержка в сети для доступа друг к другу), вы можете рассмотреть возможность запуска pgpool в режиме репликации с несколькими мастерами. У вас возникнут небольшие накладные расходы, связанные с необходимостью одновременного обновления двух баз данных.

В случае одного сбоя системы pgpool может продолжить предоставление доступа через активный узел. После восстановления системы вы можете запустить онлайн-восстановление в pgpool, чтобы активировать другой узел.