当前位置:   article > 正文

pgpool+watchdog流复制集群下 主从切换 在线恢复 读写分离 负载均衡 高可用 配置_pgpool ii watchdog

pgpool ii watchdog

版本环境:

pgpool4.3.3
postgresql14.0

主机环境:

192.168.1.200psql-master
192.168.1.201psql-slave
192.168.1.222VIP

pgpool工作原理图:

Pgpool-II version and Configuration(端口情况)

Various sample scripts included in rpm package(pgpool自带脚本)

预环境配置:

 配置本地域名解析:

  1. [all service]# vim /etc/hosts
  2. 添加
  3. 192.168.1.200 psql-master
  4. 192.168.1.201 psql-slave
  5. 192.168.1.222 VIP

 下载tar.gz包:

  1. 下载postgresql:http://www.postgresql.org/ftp/source/http://www.postgresql.org/ftp/source/
  2. 下载pgpoll:https://www.pgpool.net/mediawiki/index.php/Downloads

防火墙配置:(大家可以根据实际情况调整端口)

  1. 防火墙配置:
  2. [all service]# systemctl stop firewalld.service
  3. [all service]# systemctl enable firewalld.service
  4. [all service]# systemctl status firewalld.service
  5. 或者
  6. [all service]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp
  7. [all service]# firewall-cmd --permanent --zone=public --add-port=9694/udp
  8. [all service]# firewall-cmd --reload
  9. [all service]# firewall-cmd --permanent --zone=public --add-service=postgresql
  10. [all service]# firewall-cmd --reload
  11. [all service]# firewall-cmd --get-services
  12. 云服务器则需要将9999、9898、9000、9604加入安全组

用户管理:

(建议在单独的用户帐户下运行Pgpool-II,但是因为pgpool主要用于pgsql数据库的管理,推荐使用postgres用户管理)

  1. [all service]# groupadd postgres
  2. [all service]# useradd -g postgres postgres

配置主机互信关系

postgres用户下操作):(在pgpoll运行过程中需要主机间相互通信)

  1. [all service]# ssh-keygen -t rsa
  2. [all service]# ssh-copy-id pgsql-slave
  3. [all service]# ssh-copy-id pgsql-master
  4. [all service]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  5. [all service]# chmod 600 ~/.ssh/authorized_keys
  6. [all service]# ssh postgres@pgsql-slave //测试是否成功互通
  7. [all service]# ssh postgres@pgsql-master //测试是否成功互通

安装部署:

安装部署postgresql

编译安装postgres及部署postgresql主从流复制

参考源码包部署postgresql文档与pg主从流复制和归档配置文档

pgsql--linux源码包编译安装postgresql

pgsql主从流复制---postgresql主从流复制和归档配置

创建所需数据库用户:(由于安全原因,我们创建了一个用户repl仅用于复制目的,以及一个用户pgpool用于Pgpool-II的流复制延迟检查和健康检查。)

  1. [postgres@pgsql-master ~]$ psql -U postgres -p 5432
  2. psql (14.0)
  3. Type "help" for help.
  4. postgres=# SET password_encryption = 'md5';
  5. postgres=# CREATE ROLE pgpool WITH LOGIN;
  6. postgres=# CREATE ROLE repl WITH REPLICATION LOGIN;
  7. postgres=# \password pgpool
  8. postgres=# \password repl
  9. postgres=# \password postgres
  10. postgres=# GRANT pg_monitor TO pgpool; //如果要在 SHOW POOL NODES命令结果中显示“replication_state”和“replication_sync_state”列,角色pgpool 需要是 PostgreSQL 超级用户或pg_monitor组( Pgpool -II 4.1 或更高版本)。将pg_monitor 授予pgpool:

检查pg_hba.conf访问列表:

  1. [all servers]$ vim /usr/local/pgsql/data/pg_hba.conf
  2. //如没有,添加,也可以添加具体ip
  3. host all all 192.168.1.0/24 md5
  4. host replication all 192.168.1.0/24 md5
  5. host all pgpool 0.0.0.0/0 md5
  6. host all postgres 0.0.0.0/0 md5

pgpool编译安装部署:

  1. [all servers]# su - root
  2. [all servers]# tar xf pgpool-II-4.3.3.tar.gz
  3. [all servers]# cd pgpool-II-4.3.1
  4. [all servers]# ./configure --prefix=/usr/local/pgpool-II-4.3.3 --with-openssl
  5. [all servers]# make && sudo make install

安装相关pgpool函数:

  1. pgpool-regclass: 如果你在使用 PostgreSQL 9.4,可以不装
  2. [all servers]# cd /usr/local/pgpool-II-4.3.3/src/sql/pgpool-regclass
  3. [all servers]# make && make install
  4. [all servers]# psql -f pgpool-regclass.sql template1
  5. pgpool-recovery: pgpool在线恢复会使用函数
  6. [all servers]# cd /usr/local/pgpool-II-4.3.3/src/sql/pgpool-recovery
  7. [all servers]# make && sudo make install
  8. [all servers]# psql -f pgpool-recovery.sql template1
  9. insert_lock:
  10. 如果你在复制模式中使用了本机复制和 insert_lock ,强烈推荐建立 pgpool_catalog.insert_lock 表,用于互斥。 到现在为止,insert_lock 还能够工作。但是,在这种情况下,pgpool-II 需要锁定插入的目标表。 这种行为和 pgpool-II 2.2 和 2.3 系列类似。由于表锁与 VACUUM 冲突,所以 INSERT 操作可能因而等待很长时间。
  11. [all servers]# cd /usr/local/pgpool-II-4.3.3/src/sql
  12. [all servers]# make && make install
  13. [all servers]# psql -f insert_lock.sql template1

配置环境变量:

  1. [all servers]# vim /etc/profile
  2. export PGPOOL_HOME=/usr/local/pgpool
  3. export PATH=$PATH:/usr/local/pgpool//bin
  4. [all servers]# source /etc/profile

更改权限和所属组:

  1. [all servers]# chmod 750 /usr/local/pgpool/ -R
  2. [all servers]# chown postgres.postgres /usr/local/pgpool/ -R

创建.pgpass文件

为了允许repl用户在不指定密码的情况下进行流复制和在线恢复,并使用postgres执行pg_rewind,我们在postgres用户的主目录中创建.pgpass文件,并将每个PostgreSQL服务器 上的权限更改为 600 。

  1. [all servers]# su - postgres
  2. [all servers]$ vi /var/lib/pgsql/.pgpass
  3. server1:5432:replication:repl:<repl user password>
  4. server2:5432:replication:repl:<repl user password>
  5. server3:5432:replication:repl:<repl user password>
  6. server1:5432:postgres:postgres:<postgres user password>
  7. server2:5432:postgres:postgres:<postgres user password>
  8. server3:5432:postgres:postgres:<postgres user password>
  9. [all servers]$ chmod 600 /var/lib/pgsql/.pgpass //需要注意的是,此文件位置与官方自带的shell脚本的位置相呼应,如果要更改,需要同时更改shell执行脚本

创建pgpool_node_id文件:

Pgpool-II 4.2 开始所有配置将一样通过/etc/pgpool/下面的pgpool_node_id 区分节点

  1. [postgres@pgsql-master ~]$echo 0 > /usr/local/pgpool/etc/pgpool_node_id
  2. [postgres@pgsql-slave ~]$echo 1 > /usr/local/pgpool/etc/pgpool_node_id

pgpool-II的配置:

由于从Pgpool-II 4.2 开始,所有主机上的所有配置参数都相同,您可以在任何 pgpool 节点上编辑 pgpool.conf 并将编辑后的 ​​pgpool.conf 文件复制到其他pgpool 节点。

pgpool.conf基础配置

  1. [postgres@pgsql-master ~]$ cp /usr/local/pgpool/etc/pgpool.conf.sample /usr/local/pgpool/etc/pgpool.conf
  2. [postgres@pgsql-master ~]$ vim /usr/local/pgpool/etc/pgpool.conf
  3. backend_clustering_mode = 'streaming_replication' # Pgpool-II有几种集群模式。要设置集群模式,可以使用backend_clustering_mode 。在此配置示例中,使用流复制模式。
  4. listen_addresses = '*' # 为了允许 Pgpool-II 接受所有传入的连接,我们设置listen_addresses = '*'
  5. port = 9999 # 指定 Pgpool-II 监听的端口号。
  6. #客户端认证配置,同时需要对etc文件夹下的pool_passwd,pool.conf,pcp.conf进行配置
  7. enable_pool_hba = on
  8. pool_passwd = 'pool_passwd'
  9. #负载均衡开关,会根据后端信息中的weight选项来决定权重
  10. load_balance_mode = on
  11. # 在sr_check_user 和sr_check_password 中指定复制延迟检查用户和密码。我们将 sr_check_password留空,并在 pool_passwd中创建条目。从Pgpool-II 4.0 开始,这些参数留空,Pgpool-II将首先尝试从pool_passwd文件中获取该特定用户的密码,然后再使用空密码。
  12. sr_check_user = 'pgpool'
  13. sr_check_password = ''
  14. # 启用健康检查,以便Pgpool-II执行故障转移。此外,如果网络不稳定,即使后端运行正常,健康检查也会失败,可能会出现故障转移或退化操作。为了防止这种健康检查的错误检测,我们设置health_check_max_retries = 3。以与sr_check_user和sr_check_password相同的方式指定health_check_user和health_check_password。
  15. health_check_period = 5
  16. health_check_timeout = 30
  17. health_check_user = 'pgpool'
  18. health_check_password = ''
  19. health_check_max_retries = 3
  20. #指定PostgreSQL后端信息。可以通过在参数名称末尾添加一个数字来指定多个后端
  21. backend_hostname0 = 'pgsql-master'
  22. backend_port0 = 5432
  23. backend_weight0 = 1 #用于负载均衡
  24. backend_data_directory0 = '/usr/local/pgsql/data'
  25. backend_flag0 = 'ALLOW_TO_FAILOVER' #允许故障转移
  26. backend_hostname1 = 'pgsql-slave'
  27. backend_port1 = 5432
  28. backend_weight1 = 1
  29. backend_data_directory1 = '/usr/local/pgsql/data'
  30. backend_flag1 = 'ALLOW_TO_FAILOVER' #允许故障转移
  31. #要在SHOW POOL NODES 命令结果 中显示“replication_state”和“replication_sync_state”列,需要backend_application_name参数。在这里,我们在这些参数中指定每个后端的主机名。(Pgpool-II 4.1 或更高版本)
  32. backend_application_name0 = 'pgsql-master'
  33. backend_application_name1 = 'pgsql-slave'
  34. #故障转移配置,同时我们还要配置两个脚本
  35. failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
  36. follow_primary_command = '/etc/pgpool-II/follow_primary. sh %d %h %p %D %m %H %M %P %r %R
  37. # Pgpool-II 在线恢复配置,同时我们还要配置两个脚本
  38. recovery_user = 'postgres'
  39. recovery_password = ''
  40. recovery_1st_stage_command = 'recovery_1st_stage'
  41. #日志记录配置
  42. log_destination = 'stderr'
  43. logging_collector = on
  44. log_directory = '/usr/local/pgpool/log' //记得创建日志路径
  45. log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
  46. log_truncate_on_rotation = on
  47. log_rotation_age = 1d
  48. log_rotation_size = 100MB

创建日志记录路径

  1. [all servers]$ mkdir /usr/local/pgpool/log
  2. [all servers]$ chown postgres:postgres /usr/local/pgpool/log

故障转移脚本配置

在failover_command 参数 中指定故障转移后要执行的 failover.sh 脚本。如果我们使用 3 个 PostgreSQL 服务器,我们需要指定 follow_primary_command 在主节点故障转移后运行。我们又有两个 PostgreSQL 服务器,follow_primary_command 设置不是必需的。

  1. [all servers]$ cp -p /usr/local/pgpool/etc/failover.sh{.sample,}
  2. [all servers]$ cp -p /usr/local/pgpool/etc/follow_primary.sh{.sample,}
  3. [all servers]$ chown postgres:postgres /usr/local/pgpool/etc/{failover.sh,follow_primary.sh}
  4. [all servers]$ vim /usr/local/pgpool/etc/failover.sh
  5. ...
  6. PGHOME=/usr/local/pgsql
  7. ...
  8. [all servers]$ vim /usr/local/pgpool/etc/follow_primary.sh
  9. ...
  10. PGHOME=/usr/local/pgsql
  11. PCP_USER=pgpool
  12. ...

由于follow_primary.sh脚本必须在不输入密码的情况下执行PCP命令,所以我们需要在每台服务器的Pgpool -II启动用户(postgres用户) 的主目录下 创建.pcppass

  1. [all servers]$ echo 'localhost:9898:pgpool:<pgpool user password>' > ~/.pcppass
  2. [all servers]$ chmod 600 ~/.pcppass

在线恢复脚本配置:

在线恢复示例脚本recovery_1st_stage 和pgpool_remote_start 安装在/usr/local/pgpool/etc/中。将这些文件复制到主服务器 (pg-master) 的数据目录。

  1. [pgsql-master]$ su - root
  2. [pgsql-master]# cp -p /usr/local/pgpool/etc/recovery_1st_stage.sample /usr/local/pgsql/data/recovery_1st_stage
  3. [pgsql-master]# cp -p /usr/local/pgpool/etc/pgpool_remote_start.sample /usr/local/pgsql/data/pgpool_remote_start
  4. [pgsql-master]# chown postgres:postgres /usr/local/pgsql/data/{recovery_1st_stage,pgpool_remote_start}
  5. #根据 PostgreSQL 安装目录更改PGHOME
  6. [pgsql-master]# vim /usr/local/pgsql/data/recovery_1st_stage
  7. ...
  8. PGHOME=/usr/local/pgsql
  9. ...
  10. [pgsql-master]# vim /usr/local/pgsql/data/pgpool_remote_start
  11. .. .
  12. PGHOME=/usr/local/pgsql
  13. ...

为了使用在线恢复功能,我们需要安装 在PostgreSQL服务器 server1的 template1 上。 pgpool_remote_startpgpool_switch_xlogpgpool_recovery

  1. [pgsql-master]# su - postgres
  2. [pgsql-master]$ psql template1 -c "CREATE EXTENSION pgpool_recovery"

pool_hba.conf配置

pool_hba.conf文件的格式非常接近 PostgreSQL的pg_hba.conf格式。这里我们可以直接将 PostgreSQL 的 pg_hba.conf复制过来

[all servers]$cp /usr/local/pgsql/data/pg_hba.conf /usr/local/pgpool/etc/pool_hba.conf

pcp.conf配置

  1. [all servers]$ cp /usr/local/pgpool/etc/pcp.conf.sample /usr/local/pgpool/etc/pcp.conf //此账户密码用于连接pgpool管理
  2. [all servers]$ echo 'pgpool:'`pg_md5 PCP password` >> /usr/local/pgpool/etc/pcp.conf

pool_passwd配置:

  1. [all servers]$ cp /usr/local/pgpool/etc/pool_passwd.sample /usr/local/pgpool/etc/pool_passwd
  2. [all servers]$ /usr/local/pgpool/bin/pg_md5 -p -m -u postgres /usr/local/pgpool/etc/pool_passwd
  3. [all servers]$ /usr/local/pgpool/bin/pg_md5 -p -m -u pgpool /usr/local/pgpool/etc/pool_passwd
  4. [all servers]$ /usr/local/pgpool/bin/pg_md5 -p -m -u repl /usr/local/pgpool/etc/pool_passwd

watchdog看门狗配置:

  1. [postgres@pgsql-master ~]$ vim /usr/local/pgpool/etc/pgpool.conf
  2. use_watchdog = on #启动功能
  3. Vdelegate_IP = '192.168.1.222' 虚拟ip
  4. #为了启动/关闭虚拟 IP 并发送 ARP 请求,我们设置了 if_up_cmd、if_down_cmd和arping_cmd。此示例中使用的网络接口是“ens33”。由于执行if_up/down_cmd或 arping_cmd命令需要 root 权限,因此在这些命令上使用 setuid 或允许 Pgpool-II启动用户、postgres用户(Pgpool-II 4.1 或更高版本)在没有密码的情况下 运行sudo命令。
  5. if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:0'
  6. if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
  7. arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'
  8. if_cmd_path = '/sbin'
  9. arping_path = '/usr/sbin'
  10. #配置节点信息:
  11. hostname0 = 'pgsql-master'
  12. wd_port0 = 9000
  13. pgpool_port0 = 9999
  14. hostname1 = 'pgsql-slave'
  15. wd_port1 = 9000
  16. pgpool_port1 = 9999
  17. #指定 lifecheck wd_lifecheck_method的方法 和 lifecheck 间隔wd_interval。在这里,我们使用心跳方法来执行看门狗生命检查。
  18. wd_lifecheck_method = 'heartbeat'
  19. wd_interval = 10
  20. #指定发送和接收心跳信号的所有Pgpool-II节点信息
  21. heartbeat_hostname0 = 'pgsql-master'
  22. heartbeat_port0 = 9694
  23. heartbeat_device0 = ''
  24. heartbeat_hostname1 = 'pgsql-slave'
  25. heartbeat_port1 = 9694
  26. heartbeat_device1 = ''
  27. wd_heartbeat_keepalive = 2 #心跳间隔
  28. wd_heartbeat_deadtime = 30 #检测故障时间
  29. #当Watchdog进程异常终止时,虚拟IP可能在旧的和新的活动pgpool节点上都“启动”。为了防止这种情况,请配置wd_escalation_command以在启动新的活动pgpool节点上的虚拟IP之前关闭其他pgpool节点上的虚拟IP。需要配置脚本使用
  30. wd_escalation_command = '/usr/local/pgpool/etc/escalation.sh'

配置sudo权限:

  1. [all servers]$su - root
  2. [all servers]#vim /etc/sudoers
  3. 添加
  4. postgres ALL=NOPASSWD:/sbin/ip
  5. postgres ALL=NOPASSWD:/usr/sbin/arping

配置 escalation.sh脚本

  1. [all servers]$ cp -p /usr/local/pgpool/etc/escalation.sh{.sample,}
  2. [all servers]$ chown postgres:postgres /usr/local/pgpool/etc/escalation.sh
  3. [all servers]$ vi /usr/local/pgpool/etc/escalation.sh
  4. ...
  5. PGPOOLS=(pgsql-master pgsql-slave)
  6. VIP=192.168.1.222
  7. DEVICE=ens33
  8. ...

server1 上pgpool.conf 的配置完成。将pgpool.conf复制 到其他Pgpool -II节点

[pgsql-master]$ scp -p /usr/local/pgpool/etc/pgpool.conf postgres@pgsql-slave:/usr/local/pgpool/etc/pgpool.conf 

启动数据库和pgpool

  1. [all servers]$ pg_ctl -D /usr/local/pgsql/data start #启动数据库
  2. [all servers]$ pgpool #启动
  3. [all servers]$ pgpool -n -D > /tmp/pgpool.log 2>&1 & #后台启动并输出日志
  4. [all servers]$ pgpool stop #等待所有连接关闭
  5. [all servers]$ pgpool -m fast stop #强制关闭

设置postgresql备用服务器(可能需要一点时间)

首先,我们应该使用Pgpool-II在线恢复功能 设置PostgreSQL备用服务器。确保pcp_recovery_node命令使用的recovery_1st_stage和pgpool_remote_start 脚本位于PostgreSQL主服务器 ( server1 ) 的数据库集群目录中。

  1. [pgsql-master]$ pcp_recovery_node -h 192.168.1.222 -p 9898 -U pgpool -n 1
  2. 密码:
  3. pcp_recovery_node -- 命令成功

执行pcp_recovery_node命令后,验证PostgreSQL备用服务器启动情况

  1. # psql -h 192.168.1.222 -p 9999 -U pgpool postgres -c "show pool_nodes"
  2. Password for user pgpool
  3. 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
  4. ---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
  5. 0 | pgsql-master | 5432 | up | up | 0.5 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:00:57
  6. 1 | pgsql-slave | 5432 | up | up | 0.5 | standby | standby | 0 | true | 0 | streaming | async | 2021-10-19 07:00:57
  7. (2 rows)

测试:

切换主备watchdog

使用pcp_watchdog_info确认看门狗状态。首先启动的Pgpool-II服务器作为LEADER运行。

  1. # pcp_watchdog_info -h 192.168.1.222 -p 9898 -U pgpool
  2. Password:
  3. 2 2 YES pgsql-master:9999 Linux pgsql-master pgsql-master
  4. server1:9999 Linux pgsql-master pgsql-master 9999 9000 4 LEADER 0 MEMBER #LEADER
  5. server2:9999 Linux pgsql-slave pgsql-slave 9999 9000 7 STANDBY 0 MEMBER # standby

停止活动服务器pgsql-master,然后pgsql-slave。要停止pgsql-master,我们可以停止Pgpool-II 服务或关闭整个系统。在这里,我们停止Pgpool-II服务。

  1. [pgsql-master]# pgpool -m fast stop
  2. # pcp_watchdog_info -p 9898 -h 192.168.1.222 -U pgpool
  3. Password:
  4. 3 3 YES pgsql-slave:9999 Linux pgsql-slave pgsql-slave
  5. server2:9999 Linux pgsql-slave pgsql-slave 9999 9000 4 LEADER 0 MEMBER # LEADER
  6. server1:9999 Linux pgsql-master pgsql-master 9999 9000 10 SHUTDOWN 0 MEMBER #已经停止

启动我们已经停止的 Pgpool-II ,并验证pgsql-master作为备用服务器运行。

  1. [server1]# pgpool -n -d > /tmp/pgpool.log 2>&1 &
  2. # pcp_watchdog_info -p 9898 -h 192.168.1.222 -U pgpool
  3. Password:
  4. 3 3 YES pgsql-slave:9999 Linux pgsql-slave pgsql-slave
  5. server2:9999 Linux pgsql-slave pgsql-slave 9999 9000 4 LEADER 0 MEMBER # LEADER
  6. server1:9999 Linux pgsql-master pgsql-master 9999 9000 10 STANDBY 0 MEMBER # STANDBY

故障转移:

  1. # psql -h 192.168.1.222 -p 9999 -U pgpool postgres -c "show pool_nodes"
  2. Password for user pgpool:
  3. 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
  4. ---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
  5. 0 | server1 | 5432 | up | up | 0.5 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:08:14
  6. 1 | server2 | 5432 | up | up | 0.5 | standby | standby | 0 | false | 0 | streaming | async | 2021-10-19 07:08:14
  7. (2 rows)

手动停止pgsql-master,再查看:

  1. [pgsql-master]$ pg_ctl -D /usr/local/pgsql/data -m immediate stop
  2. [pgsql-master]$ psql -h 192.168.1.222 -p 9999 -U pgpool postgres -c "show pool_nodes"
  3. Password for user pgpool:
  4. 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
  5. ---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
  6. 0 | pgsql-master | 5432 | down | down | 0.5 | standby | unknown | 0 | false | 0 | | | 2021-10-19 07:10:01
  7. 1 | pgsql-slave | 5432 | up | up | 0.5 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:10:01
  8. (2 rows)
  9. [pgsql-slave]# psql -h pgsql-slave -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
  10. pg_is_in_recovery
  11. -------------------
  12. f
  13. #备库已经成为主库

在线恢复

在这里,我们使用Pgpool-II在线恢复功能来恢复pgsql-master(旧的主服务器)作为备用服务器。在恢复旧的主服务器之前,请确保 当前主服务器pgsql-slave的数据库集群目录中存在recovery_1st_stage和pgpool_remote_start脚本。

  1. # pcp_recovery_node -h 192.168.1.222 -p 9898 -U pgpool -n 0
  2. 密码:
  3. pcp_recovery_node -- 命令成功

然后验证pgsql-slave是否作为备用服务器启动。

  1. # psql -h 192.168.1.222 -p 9999 -U pgpool postgres -c "show pool_nodes"
  2. Password for user pgpool:
  3. node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
  4. ---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
  5. 0 | pgsql-master | 5432 | up | up | 0.5 | standby | standby | 0 | true | 0 | streaming | async | 2021-10-19 07:14:06
  6. 1 | pgsql-slave | 5432 | up | up | 0.5 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:10:01
  7. (2 rows)
  8. #备库已经恢复

测试读写分离+负载均衡

测试之前,可以考虑修改文件pgpool.conf中的如下参数:

  1. #开启这些开关后,会在数据库和日志页面详细的展示pgpool收到客户端请求后的请求分发日志
  2. [all servers]$ vim /usr/local/pgpool/etc/pgpool.conf
  3. log_statement=all
  4. log_per_node_statement =on
  5. client_min_messages =log
  6. log_min_messages = info
  7. [all servers]$ pgpool reload #重载生效

开启4个窗口分别进行如下操作:

  1. [pgsql-master]$ psql -U postgres -h 192.168.1.222 -p 9999 -d test
  2. #create table test(id int);
  3. #insert into test values(1);
  4. #select * from test;

pgsql+pgpool常见问题:

watchdog节点故障后不转移:

如果看门狗节点数为偶数,则需要开启enable_consensus_with_half_votes参数,比如我们的实验中为两台,则需要打开这个参数,同时,建议集群数量为奇数最优,否则容易脑裂。

recover在线恢复异常:

recover的两个脚本需要进行一定的修改,才能很好的使用,本版本脚本原理依然是依据

pg_basebackup进行流复制。所以解决的方案有两个:1、修改测试官方shell脚本;2、先进行主从流复制集群的方式尽心搭建,然后加入pgpool集群中

关于负载均衡

经过测试,pgpool并不会直接将所有的select请求分发给从服务器,是根据weight的权重进行分配的,这一点,可以根据负载均衡的测试进行观察,在实际生产环境中,可以根据进行合理的资源调配

为主服务器和后备服务器创建复制槽(该步非必做项):

select * frompg_create_physical_replication_slot('pgsql_master');

select * frompg_create_physical_replication_slot('pgsql_slave');

创建后查询复制槽

select * from pg_replication_slots;

复制槽(replicationslot)的作用是:

1.在流复制中,当一个备节点断开连接时,备节点通过hot_standby_feedback提供反馈数据数据会丢失。当备节点重新连接时,它可能因为被主节点发送清理记录而引发查询冲突。复制槽即使在备节点断开时仍然会记录下备节点的xmin(复制槽要需要数据库保留的最旧事务ID)值,从而确保不会有清理冲突。

2.当一个备节点断开连接时,备节点需要的WAL文件信息也丢失了。如果没有复制槽,当备节点重连时,可能已经丢弃了所需要的WAL文件,因此需要完全重建备节点。而复制槽确保这个节点保留所有下游节点需要的WAL文件。

要配置slave使用这个槽,在后备机的recovery.conf中应该配置primary_slot_name,如下:

$ vi $PGDATA/recovery.conf

primary_slot_name = 'pgsql_master'

standby_mode = 'on'

recovery_target_timeline = 'latest'

primary_conninfo = 'user=replicator password=123456 host=192.168.1.200 port=5432 application_name= pgsql_slave'

trigger_file = '/tmp/postgresql.trigger.5432'

---删除复制槽

slave在使用primary_slot_name 参数时是无法删除replication slots

postgres=# SELECT * FROM pg_drop_replication_slot('pgsql_master');

postgres=# SELECT * FROM pg_drop_replication_slot('pgsql_slave');

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/173366
推荐阅读
相关标签
  

闽ICP备14008679号