Pgpool-II实现高可用+读写分离+负载均衡(三)---- 日常使用篇

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: Pgpool-II是一款工作在PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件。提供了连接池、复制、负载均衡、限制过多连接、看门狗、查询缓存等功能。本系列的前两篇讲解了Pgpool-II的安装及配置,本篇介绍日常使用。

一、启动/停止Pgpool

开始使用Pgpool前请先确认:

  • 各节点(server1、server2、server3)$HOME/pgpool/etc目录下是否有以下文件:

文件名

功能描述

pgpool_node_id

节点标识文件

pcp.conf

pcp系列命令密码文件

pool_hba.conf

Pgpool客户端认证配置文件

pgpool.conf

Pgpool配置文件

pool_passwd

Pgpool客户端密码文件

escalation.sh

浮动IP切换脚本

failover.sh

故障转移脚本

follow_primary.sh

故障转移后续处理脚本

  • 各节点(server1、server2、server3)$HOME目录下是否有以下文件:

文件名

功能描述

.pcppass

pcp密码文件

.pgpass

PostgreSQL密码文件

.pgpoolkey

Pgpool客户端密码密钥文件

  • 各节点(server1、server2、server3)$PG_DATA目录下是否有以下文件:

文件名

功能描述

recovery_1st_stage

recovery第一阶段脚本

pgpool_remote_start

recovery完成后启动数据库脚本

请检查上述文件是否存在,并确认文件内容是否正确、相应的脚本文件是否是执行权限。同时检查pgpool.conf中相关的目录是否已经创建(比如日志目录、archive目录等)。

[server1]$ pgpool--helppgpool-II version 4.4.4 (nurikoboshi),
  A generic connection pool/replication/load balance server for PostgreSQL
Usage:
  pgpool [ -c] [ -f CONFIG_FILE ] [ -F PCP_CONFIG_FILE ] [ -a HBA_CONFIG_FILE ]
         [ -n ] [ -D ] [ -d ]
  pgpool [ -f CONFIG_FILE ] [ -F PCP_CONFIG_FILE ] [ -a HBA_CONFIG_FILE ]
         [ -m SHUTDOWN-MODE ] stop  pgpool [ -f CONFIG_FILE ] [ -F PCP_CONFIG_FILE ] [ -a HBA_CONFIG_FILE ] reload
Common options:
-a, --hba-file=HBA_CONFIG_FILE
                      Set the path to the pool_hba.conf configuration file
                      (default: /home/postgres/pgpool/etc/pool_hba.conf)
-f, --config-file=CONFIG_FILE
                      Set the path to the pgpool.conf configuration file
                      (default: /home/postgres/pgpool/etc/pgpool.conf)
-k, --key-file=KEY_FILE
                      Set the path to the pgpool key file
                      (default: /home/postgres/.pgpoolkey)
                      can be over ridden by PGPOOLKEYFILE environment variable
-F, --pcp-file=PCP_CONFIG_FILE
                      Set the path to the pcp.conf configuration file
                      (default: /home/postgres/pgpool/etc/pcp.conf)
-h, --help          Print this help
Start options:
-C, --clear-oidmaps Clear query cache oidmaps when memqcache_method is memcached
                      (If shmem, discards whenever pgpool starts.)
-n, --dont-detach   Don't run in daemon mode, does not detach control tty  -x, --debug-assertions   Turns on various assertion checks, This is a debugging aid  -D, --discard-status Discard pgpool_status file and do not restore previous status  -d, --debug         Debug modeStop options:  -m, --mode=SHUTDOWN-MODE                      Can be "smart", "fast", or "immediate"Shutdown modes are:  smart       quit after all clients have disconnected  fast        quit directly, with proper shutdown  immediate   the same mode as fast

1.1 启动

pgpool -n &

1.2 停止

pgpool -m {smart | fast | immediate} stop

二、使用

首先在主节点(server1)启动PostgreSQL数据库,其余两个节点不启动PostgreSQL,然后分别在三个节点启动Pgpool。

su- postgres
pg_ctl -D /data/pgsql16/data -l logfile
# 分别在三个节点上执行pgpool -n &

2.1 设置从节点

通过Pgpool online recovery功能设置从节点,此过程会调用$PG_DATA目录下的recovery_1st_stage和pgpool_remote_start 脚本通过流复制机制同步主节点数据到从节点,同步完成后启动从节点。

# pcp_recovery_node -h 192.168.0.5 -p 9898 -U pgpool -n 1Password:
pcp_recovery_node -- Command Successful
# pcp_recovery_node -h 192.168.0.5 -p 9898 -U pgpool -n 2Password:
pcp_recovery_node -- Command Successful

成功执行完pcp_recovery_node后,检查从节点是否正确加入集群:

psql -h192.168.0.5 -p9999-U pgpool postgres -c"show pool_nodes"Password for user pgpool
 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.333333  | primary | primary | 0          | false             | 0                 |                   |                        | 2023-10-2307:00:57
1       | server2  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2023-10-2307:00:57
2       | server3  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | false             | 0                 | streaming         | async                  | 2023-10-2307:00:57
(3 rows)

2.2 Watchdog切换测试

  • 执行pcp_watchdog_info命令,查看哪个节点是LEADER
$ pcp_watchdog_info-h192.168.0.5 -p9898-U pgpool
Password:
33 YES server1:9999 Linux server1 server1
server1:9999 Linux server1 server1 999990004 LEADER 0 MEMBER #The Pgpool-II server started first became "LEADER".server2:9999 Linux server2 server2 999990007 STANDBY 0 MEMBER #run as standbyserver3:9999 Linux server3 server3 999990007 STANDBY 0 MEMBER #run as standby
  • 停止leader的Pgpool,Pgpool会投票选举出新的leader,此例中server2成为了新leader。
[server1]$ pgpool-m fast stop$ pcp_watchdog_info-p9898-h192.168.0.5 -U pgpool
Password:
33 YES server2:9999 Linux server2 server2
server2:9999 Linux server2 server2 999990004 LEADER 0 MEMBER    #server2 is promoted to LEADERserver1:9999 Linux server1 server1 9999900010 SHUTDOWN 0 MEMBER #server1 is stoppedserver3:9999 Linux server3 server3 999990007 STANDBY 0 MEMBER   #server3 runs as STANDBY
  • 重新启动刚才停止的Pgpool,启动后该节点会成为standby节点。
[server1]$ pgpool-n &
[server1]# pcp_watchdog_info -p 9898 -h 192.168.0.5 -U pgpoolPassword: 
33 YES server2:9999 Linux server2 server2
server2:9999 Linux server2 server2 999990004 LEADER 0 MEMBER
server1:9999 Linux server1 server1 999990007 STANDBY 0 MEMBER
server3:9999 Linux server3 server3 999990007 STANDBY 0 MEMBER

2.3 故障转移测试

查看当前主节点,当前server是主节点。

$ psql-h192.168.0.5 -p9999-U pgpool postgres -c"show pool_nodes"Password for user pgpool:
 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.333333  | primary | primary | 0          | false             | 0                 |                   |                        | 2023-10-2307:08:14
1       | server2  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | false             | 0                 | streaming         | async                  | 2023-10-2307:08:14
2       | server3  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2023-10-2307:08:14
(3 rows)

停止server的PostgreSQL

[server1]$ pg_ctl-D /data/pgsql16/data -m immediate stop

停止server1后,发生故障转移,server2成为新的主节点。

$ psql-h192.168.0.5 -p9999-U pgpool postgres -c"show pool_nodes"Password for user pgpool:
 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 | down   | down      | 0.333333  | standby | unknown | 0          | false             | 0                 |                   |                        | 2023-10-2307:10:01
1       | server2  | 5432 | up     | up        | 0.333333  | primary | primary | 0          | false             | 0                 |                   |                        | 2023-10-2307:10:01
2       | server3  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2023-10-2307:10:03
(3 rows)

此时server2为primary,server3为standby。

[server3]$ psql-h server3 -p5432-U pgpool postgres -c"select pg_is_in_recovery()"pg_is_in_recovery 
-------------------t
[server2]$ psql-h server2 -p5432-U pgpool postgres -c"select pg_is_in_recovery()"pg_is_in_recovery 
-------------------f
[server2]# psql -h server2 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x-[ RECORD 1 ]----+------------------------------pid              | 7198usesysid         | 16385usename          | repl
application_name | server3
client_addr      | 192.168.0.3
client_hostname  |
client_port      | 40916backend_start    | 2023-10-2311:27:30.39248+08backend_xmin     |
state            | streaming
sent_lsn         | 0/12000260
write_lsn        | 0/12000260
flush_lsn        | 0/12000260
replay_lsn       | 0/12000260
write_lag        |
flush_lag        |
replay_lag       |
sync_priority    | 0sync_state       | async
reply_time       | 2023-10-2311:27:35.077533+08

2.4 在线恢复

使用Pgpool的online recovery功能恢复server1

$ pcp_recovery_node-h192.168.0.5 -p9898-U pgpool -n0Password: 
pcp_recovery_node -- Command Successful

恢复完成后检查状态,server1已变为standby

# psql -h 192.168.0.5 -p 9999 -U pgpool postgres -c "show pool_nodes"Password for user pgpool:
node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change  
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------0       | server1  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2023-10-2209:42:27
1       | server2  | 5432 | up     | up        | 0.333333  | primary | primary | 0          | false             | 0                 |                   |                        | 2023-10-2209:42:27
2       | server3  | 5432 | up     | up        | 0.333333  | standby | standby | 0          | false             | 0                 | streaming         | async                  | 2023-10-2209:42:27
(3 rows)
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
174 0
|
4月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
5月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关
|
6月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
187 1
|
6月前
|
负载均衡 关系型数据库 PostgreSQL
Pgpool-II实现高可用+读写分离+负载均衡(八)---- 维护工具
Pgpool提供了一些维护工具,用于日常观察Pgpool运行状态、上线、下线节点等操作。主要有:pcp_stop_pgpool,pcp_node_count,pcp_node_info,pcp_health_check_stats,pcp_proc_count,pcp_proc_info,pcp_detach_node,pcp_attach_node,pcp_recovery_node,pcp_promote_node,pcp_pool_status,pcp_watchdog_info,pcp_reload_config
192 0
|
6月前
|
负载均衡 前端开发 网络协议
Keepalived+HAProxy 搭建高可用负载均衡(二)
Keepalived+HAProxy 搭建高可用负载均衡
|
23天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
35 0
|
4月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
35 0
|
4月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
49 1
|
13天前
|
负载均衡 应用服务中间件 nginx
Nginx 负载均衡
Nginx 负载均衡
23 2