前面介绍了 PostgreSQL 事务与并发控制、主从复制、高可用方案、基于 Patroni 高可用架构部署及故障切换、 基于 repmgr 高可用架构实践等相关的知识点,今天我将详细的为大家介绍 PostgreSQL 基于 pgpool 实现读写分离相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!
Pgpool 简介
Pgpool 是一个高性能的连接池和负载均衡器,用于 PostgreSQL 数据库。Pgpool 可以作为中间层,位于客户端和 PostgreSQL 服务器之间,来管理连接请求并分配给不同的 PostgreSQL 服务器进行处理,以提高整体的系统性能和可用性。Pgpool 的一些主要功能包括:
-
连接池:Pgpool在应用程序和数据库之间建立一个连接池,使得多个应用程序可以共享一组数据库连接,避免了重复的连接和断开。
-
负载均衡:Pgpool可以将客户端请求均衡地分配到多个PostgreSQL服务器上,以实现负载均衡和更好的性能。
-
高可用性:Pgpool可以检测到PostgreSQL服务器的故障,并自动将客户端请求重新路由到其他可用服务器,从而提高系统的可用性和稳定性。
-
并行查询:Pgpool可以将大型查询分成几个子查询,然后将这些子查询并行发送到多个PostgreSQL服务器上执行,以提高查询性能。

当使用 Postgresql HA 集群时,应用只需连接 pgpool 即可。
-
通过 pgpool 实现读写分离,写入操作由 Master 执行,读取操作由 Slave 执行。
-
由 repmgr 实现流复制,Master 数据自动复制到 Slave。
-
当 Master 遇故障下线时,由 repmgr 自定选择 Slave 为 Master,并继续执行写入操作。
-
当某个节点遇故障下线时,由 pgpool 自动断开故障节点的连接,并切换到可用的节点上。
-
更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。
环境准备
主从复制请看:
主机分配
-
OS:CentOS 7
-
节点1:master(192.168.36.130)
-
节点2:slave(192.168.36.131)
-
节点3:slave(192.168.36.133)
主从切换
手动切换
在上一节中,配置好了流复制结构,接下来模拟主库宕机,进行测试。
-
主库宕机
在master上执行
pg_ctl stop
会发现测试库报错,连接不上主库。这时我们创建触发文件。
touch /tmp/trigger_file0
也可以放在别的目录,记得要给postgres权限。这时,测试库会变成主库。我们在slave上的测试库中新建测试表,并插入数据。
create database test;
create teble test_1 (id int);
insert into test_1 valuse (1);
将主库的recover.done变为recovery.conf
mv recovery.done recovery.conf
启动主库
pg_ctl start
主库会自动的发现时间线的差异,并拷贝过来。登录主库查询,可以查到数据。

如果你们更改recovery.done,或者进行了别的操作,你会发现数据是不一样的。这是你需要停掉被恢复的库,手动同步时间线。
pg_rewind --target-pgdata=/home/postgres/data --source-server='host=slave port=5432 user=postgres dbname=postgres'
将主库的recover.done变为recovery.conf
mv recovery.done recovery.conf
再次启动主库。数据就已经同步了。
你可以多次手动切换进行测试,但是你会发现一个问题。触发文件trigger_file0每次在即创建完成后并不会存在,他在切换完成后就消失了。每次都要手动创建文件的话很麻烦,所以使用pgpool进行自动切换。更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。
pgpool 自动切换
下载地址:http://www.pgpool.net/mediawiki/images/
解压编译安装
tar -zxvf pgpool-II-3.6.0.tar.gz -C /opt/
cd /opt/pgpol-II/
./configure –prefix=/opt/pgpool -with-pgsql=path -with-pgsql=/home/postgres
make
make install
添加环境变量
vim /etc/profile
PGPOOL_HOME=/opt/pgpool
export PGPOOL_HOME
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin:$PGPOOL_HOME/bin
export PATH
#使之生效
source /etc/profile
配置pool_hba.conf
参考 pg_hba.conf 配置,增加一下内容
host all all 0.0.0.0/0 md5
[postgres@pool etc]$ pwd
/opt/pgpool/etc
[postgres@pool etc]$ cat pool_hba.conf
local all all trust
host all all ::1/128 trust
host all all 0.0.0.0/0 md5
配置pcp.conf和pool_passwd
master主节点登陆后执行:
postgres=# select rolname,rolpassword from pg_authid;
rolname | rolpassword
--------------------+-------------------------------------
postgres &

本文详细介绍了如何利用 Pgpool 实现 PostgreSQL 的读写分离和高可用性。Pgpool 作为连接池和负载均衡器,能提高系统性能和可用性。在主从复制的基础上,当主库宕机时,Pgpool 可自动切换到从库,同时支持手动切换。通过配置,可以实现读写分离,简化数据库操作。此外,文章还涉及了看门狗机制,用于监控 pgpool 服务并自动处理故障。
最低0.47元/天 解锁文章
1050

被折叠的 条评论
为什么被折叠?



