原文地址:https://b-peng.blogspot.com/2022/02/auto-failback.html
原文作者:BO PENG(Pgpool-II 贡献者)
Pgpool-II可以监控PostgreSQL的状态,并在检测到故障时自动进行故障转移或退化。
一个健康的备用PostgreSQL服务器可能由于临时的网络问题而从Pgpool-II中分离出来。要重新连接被分离的备用PostgreSQL服务器,您需要确保它是一个健康的备用服务器,然后手动运行pcp_attach_node命令或重新启动Pgpool-II。
从 Pgpool-II 4.1 开始,可以通过启用 auto_failback 来自动重新连接健康的备用 PostgreSQL 服务器。
在这篇文章中,我将介绍如何启用自动故障恢复功能。
自动故障恢复
要使用这个自动故障恢复功能,必须启用Pgpool-II的健康检查和流式复制检查。
因为Pgpool-II定期从pg_stat_replication中获取信息,以检查主服务器和备用服务器之间的连接性,所以需要PostgreSQL 9.1或更高版本。
如果满足以下条件,Pgpool-II将连接PostgreSQL服务器。
- 如果它是一个备用的PostgreSQL服务器
- 如果PostgreSQL服务器的状态是关闭的(这是由Pgpool-II管理的状态)
- 如果pg_stat_replication.state是流式的
要启用自动故障恢复,你需要配置以下参数。
auto_failback = on auto_failback_interval health_check_user health_check_password sr_check_user sr_check_password backend_application_name*
复制
配置自动故障恢复
本节显示如何配置自动故障恢复。
本教程假设你已经在两个PostgreSQL服务器之间设置了流式复制,其主机名如下。
- server1: 主服务器和 Pgpool-II
- server2:备用的
创建一个PostgreSQL用户
用于流式复制检查的PostgreSQL用户必须是超级用户或具有pg_monitor角色。出于安全考虑,不建议使用超级用户。这里我们创建一个专门的用户 "pgpool "并授予最低权限。
[root@server1 ~]# psql -h server1 -U postgres
postgres=# CREATE ROLE pgpool WITH LOGIN IN ROLE pg_monitor;
复制
编辑pg_hba.conf
在本教程中,我们设置信任认证只是为了测试目的。在生产环境中,请按照PostgreSQL和Pgpool-II的文档来配置正确的认证设置。
在 pg_hba.conf 中添加以下条目
host all pgpool samenet trust
复制
设置application_name
我们在primary_conninfo设置中把备用服务器的主机名设置为application_name。这个application_name也必须在Pgpool-II的backend_application_name*中指定,它用于识别备用服务器。
primary_conninfo = 'host=server1 port=5432 user=repl application_name=server2'
复制
编辑pgpool.conf
编辑pgpool.conf并添加以下配置
auto_failback = on auto_failback_interval = 1min health_check_period = 10 health_check_user = 'pgpool' sr_check_period = 10 sr_check_user = 'pgpool' backend_hostname0 = 'server1' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/pgsql/14/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_application_name0 = 'server1' backend_hostname1 = 'server2' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/pgsql/14/data' backend_flag1 = 'ALLOW_TO_FAILOVER' backend_application_name1 = 'server2'
复制
因为PostgreSQL中指定了信任认证,所以不需要设置health_check_password和sr_check_password。如果您希望使用其他认证方法,请按照本教程在Pgpool-II中设置用户密码。
要检查每个备用服务器的pg_stat_replication.state(当前WAL发送器状态),需要backend_application_name*的配置。它必须与primary_conninfo设置中指定的application_name相同。在本教程中,我们使用每个服务器的主机名。
验证自动故障恢复
一旦PostgreSQL和Pgpool-II启动,你可以运行show pool_nodes来检查初始集群状态,主用和备用都已启动,
[root@server1 ~]# psql -h server1 -U postgres -p 9999 -c "show pool_nodes"
node_id | hostname | port | status | pg_status | lb_weight | role | pg_role |
select_cnt | load_balance_node | replication_delay | replication_state |
replication_sync_state | last_status_change
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
0 | server1 | 5432 | up | up | 0.500000 | primary | primary | 0 | false | 0 | | | 2022-02-28 12:03:18
1 | server2 | 5432 | up | up | 0.500000 | standby | standby | 0 | true | 0 | streaming | async | 2022-02-28 12:04:09
复制
然后,我们停止备用的PostgreSQL服务器。
[root@server2 ~]# su - postgres -c "/usr/pgsql-14/bin/pg_ctl stop -D 14/data"
复制
状态已经向上->向下改变。
[root@server2 ~]# psql -h server1 -U postgres -p 9999 -c "show pool_nodes"
node_id | hostname | port | status | pg_status | lb_weight | role | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
0 | server1 | 5432 | up | up | 0.500000 | primary | primary | 0 | true | 0 | | | 2022-02-28 12:03:18
1 | server2 | 5432 | down | down | 0.500000 | standby | unknown | 0 | false | 0 | | | 2022-02-28 12:05:30
复制
接下来,重新启动备用的PostgreSQL服务器。
如果你使用复制槽,你可能需要在重新启动备用PostgreSQL服务器之前创建复制槽。
[root@server2 ~]# psql -h server1 -U postgres -c "select * from pg_create_physical_replication_slot('server2')"
[root@server2 ~]# su - postgres -c "/usr/pgsql-14/bin/pg_ctl start -D 14/data"
复制
等待大约一分钟,备用服务器重新加入集群,状态变为向上。
[root@server2 ~]# psql -h server1 -U postgres -p 9999 -c "show pool_nodes"
node_id | hostname | port | status | pg_status | lb_weight | role | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_sta
tus_change
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
0 | server1 | 5432 | up | up | 0.500000 | primary | primary | 0 | true | 0 | | | 2022-02-28 12:03:18
1 | server2 | 5432 | up | up | 0.500000 | standby | standby | 0 | false | 0 | streaming | async | 2022-02-28 12:12:12
复制
评论
