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

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: 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)
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
166 9
|
7月前
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
343 0
|
7月前
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
291 1
|
7月前
|
负载均衡 算法 Java
实现高可用和可扩展的负载均衡系统的Java方法
实现高可用和可扩展的负载均衡系统的Java方法
|
8月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
9月前
|
负载均衡 关系型数据库 分布式数据库
【PolarDB开源】PolarDB读写分离实践:优化读取性能与负载均衡策略
【5月更文挑战第26天】PolarDB是云原生关系型数据库,通过读写分离优化性能和扩展性。它设置主节点处理写操作,从节点处理读操作,异步复制保证数据一致性。优化读取性能的策略包括增加从节点数量、使用只读实例和智能分配读请求。负载均衡策略涉及基于权重、连接数和地理位置的分配。实践示例中,电商网站通过主从架构、只读实例和负载均衡策略提升商品查询效率。PolarDB的读写分离与负载均衡为企业应对大数据和高并发提供了有效解决方案。
300 0
|
9月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
1067 0
|
2月前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
161 3
|
7月前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
148 1
|
7月前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
700 2