pgpool-II 介绍
版本:pgpool-II 4.1.1
pgpool-II是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:
连接池
Pgpool-II维护与PostgreSQL 服务器的已建立连接,并在出现具有相同属性(即用户名,数据库,协议版本和其他连接参数,如果有)的新连接时重用它们。它减少了连接开销并改善了系统的整体吞吐量。
负载均衡
如果复制了数据库(因为以复制模式或主/从模式运行),则在任何服务器上执行SELECT查询都将返回相同的结果。Pgpool-II 利用复制功能来减少每个PostgreSQL服务器上的负载。它通过在可用服务器之间分配SELECT查询来做到这一点,从而提高了系统的整体吞吐量。在理想情况下,读取性能可以与PostgreSQL服务器的数量成比例地提高。在许多用户同时执行许多只读查询的情况下,负载平衡效果最佳。
自动故障转移
如果其中一台数据库服务器出现故障或无法访问,则 Pgpool-II会将其分离,并将继续使用其余的数据库服务器进行操作。有一些复杂的功能可以帮助自动故障转移,包括超时和重试。
在线恢复
Pgpool-II可以通过执行一个命令来执行数据库节点的联机恢复。当联机恢复与自动故障转移一起使用时,可以通过故障转移将分离的节点自动附加为备用节点。也可以同步并附加新的 PostgreSQL服务器。
复写
Pgpool-II可以管理多个PostgreSQL 服务器。激活复制功能可以在两个或多个PostgreSQL群集上创建实时备份,因此,如果其中一个群集发生故障,服务可以继续运行而不会中断。Pgpool-II具有内置复制(本机复制)。但是,用户可以使用外部复制功能,包括PostgreSQL的流复制。
限制超出的连接
与PostgreSQL的最大并发连接数是有限制的,达到此数量时,新连接将被拒绝。但是,增加此最大连接数会增加资源消耗,并对整体系统性能产生负面影响。Pgpool-II对最大连接数也有限制,但是额外的连接将排队,而不是立即返回错误。但是,您可以配置为在超过连接限制(4.1或更高版本)时返回错误。
看门狗
跟keepalived一样,对其他pgpool-II节点执行生命检查,以检测Pgpoll-II的故障。如果活动Pgpool-II发生故障,则备用 Pgpool-II可以提升为活动状态,并接管虚拟IP。
内存中查询缓存
在内存中查询缓存允许保存一对SELECT语句及其结果。如果出现相同的SELECT,则Pgpool-II从缓存中返回该值。由于不 涉及SQL解析或对PostgreSQL的访问,因此在内存缓存中使用非常快。另一方面,在某些情况下,它可能比正常路径慢,因为它增加了存储缓存数据的开销。
pgpool-II 安装
源码安装前提
GNU make 版本是3.8及以上
#查看版本命令
make --version
需要的包
postgresql-libs
postgresql-devel
解压安装包
tar xf pgpool-II-4.1.1.tar.gz
mkdir usr/local/pgpool
chown -R postgres:postgres pgpool*
源码编译 使用postgres用户
cd pgpool-II-4.1.1
./configure --prefix=/usr/local/pgpool
make
make install
maske install 报权限错误,之前安装pg数据库时使用root用户,权限没有改过来
chown -R postgres:postgres usr/local/pgsql安装c语言函数
使用postgres用户
pgpool-recovery,在线恢复的 C 和 SQL 函数。
cd pgpool-II-4.1.1/src/sql/pgpool-recovery
make
make install
启用
psql template1 -c "CREATE EXTENSION pgpool_recovery;"pgpool-regclass,它被 pgpool-II 内部使用,保证在不同的 schema 中处理相同的表名不会出现问题。
cd pgpool-II-4.1.1/src/sql/pgpool-regclass
make
make install
启用
psql template1 -c "CREATE EXTENSION pgpool_regclass;"insert_lock,如果你在复制模式中使用了 insert_lock ,强烈推荐建立 pgpool_catalog.insert_lock 表,用于互斥。
psql -f usr/local/pgpool-II-4.1.1/src/sql/insert_lock.sql template1配置文件
pgpool.conf
Pgpool -II的主要配置文件
cd usr/local/pgpool/etc
cp pgpool.conf.sample pgpool.conf
mkdir usr/local/pgpool/run
修改配置项
listen_addresses = '*'
port = 9999
backend_hostname0 = '192.168.43.175'
backend_port0 = 6432
backend_weight0 = 1
backend_data_directory0 = '/data/pg11data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'sdw3'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
logdir = '/usr/local/pgpool/log'
pid_file_name = '/usr/local/pgpool/run/pgpool.pid'
pcp_port = 9898
可配置常用pgpool-II运行模式
流复制模式
在这种模式下,PostgreSQL负责同步数据库,pgpool以进行负载平衡
本机复制模式
Pgpool-II负责同步数据库。该模式的优点是同步是通过同步方式完成的,直到所有PostgreSQL 服务器都完成写操作后,才会返回对数据库的写操作,并且可以进行负载平衡。
原始模式
Pgpool-II不在乎数据库同步。使整个系统做一件有意义的事情是用户的责任。在此模式下无法进行负载平衡。
在任何模式下,Pgpool-II都提供连接池,自动故障转移和在线恢复。
pool_passwd
用于配置连接的用户和密码,密码需要md5格式
pg_md5 -m -p -u postgres pool_passwd -f usr/local/pgpool/etc/pgpool.conf
cat pool_passwd
postgres:md53175bce1d3201d16594cebf9d7eb3f9d
pcp.conf
Pgpool-II为管理员提供了执行管理操作的界面,例如获取Pgpool-II状态或远程终止 Pgpool-II进程。pcp.conf
是此接口用于身份验证的用户/密码文件。所有操作模式都需要设置pcp.conf
文件。
cd usr/local/pgpool/etc
cp pcp.conf.sample pcp.conf
[postgres@sdw3 etc]$ pg_md5 postgres
e8a48653851e28c69d0506508fb27fc5
pcp.conf添加配置
postgres:e8a48653851e28c69d0506508fb27fc5
.pcppass
用于访问pcp免密的配置文件
[postgres@sdw3 ~]$ cat ~/.pcppass
*:*:postgres:postgres
chmod 600 ~/.pcppass
注:填两个*才正常,不知道什么原因
pool_hba.conf
开启访问控制时,需要配置访问认证文件。
cd usr/local/pgpool/etc
cp pool_hba.conf.sample pool_hba.conf
并添加配置
host all all 192.167.43.0/24 trust
启动pgpool
用户添加环境变量
export PGPOOLHOME=/usr/local/pgpool
export PATH=$PATH:$PGPOOLHOME/bin
启动pgpool
pgpool使用默认端口连接pgpool
[postgres@sdw3 ~]$ psql -p 9999
psql (11.7)
Type "help" for help.
postgres=#
配置本机复制模式和负载均衡
在复制模式下,除了查询,pgpool-II其它操作都会发送到各个PG数据库。
配置文件pgpool.conf 主要参数
backend_hostname0 = '192.168.43.175'
backend_port0 = 6432
backend_weight0 = 1
backend_data_directory0 = '/data/pg11data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'sdw3'
backend_hostname1 = '192.168.43.176'
backend_port1 = 6432
backend_weight1 = 1
backend_data_directory1 = '/data/pg11data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'sdw4'
replication_mode = true
load_balance_mode = true
failover_when_quorum_exists = false
重启pgpool
停止
pgpool -m fast stop
pgpool -n -d > tmp/pgpool.log 2>&1 & #输出启动日志
或
pgpool
验证复制
createdb -p 9999 bench_replication
pgbench -i -p 9999 bench_replication
查询两个库结果一致
for table_name in pgbench_branches pgbench_tellers pgbench_accounts pgbench_history
do
echo $table_name
psql -c "SELECT count(*) FROM $table_name" -p 9999 bench_replication
psql -c "SELECT count(*) FROM $table_name" -p 6432 bench_replication
psql -c "SELECT count(*) FROM $table_name" -p 6432 bench_replication -h 192.168.43.176
done
检查负载均衡
pgbench -p 9999 -S -T 60 bench_replication -c 40 -n
分别查看两个库都有均衡的查询数量
配置流复制模式和负载均衡
配置文件pgpool.conf
修改
replication_mode = off
master_slave_mode = on
master_slave_sub_mode = 'stream'
重启生效,在主备模式下,pgpool查询会均衡分发到master和standby,其它操作都会在master上
简单测试
pgpool和nginx负载均衡性能对比
在一主一备异步流复制的架构下,在客户机分别测试pgpool和nginx的负载均衡查询的性能
数据库使用6432端口
pgpool使用的9999端口
nginx使用的16432端口
pgpool测试结果
[postgres@sdw3 ~]$ pgbench -h 192.168.43.175 -p 9999 -S -T 30 bench_replication -c 20 -j 4 -n
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 20
number of threads: 4
duration: 30 s
number of transactions actually processed: 188016
latency average = 3.192 ms
tps = 6266.114034 (including connections establishing)
tps = 6268.888281 (excluding connections establishing)
nginx测试结果
[postgres@sdw3 ~]$ pgbench -h 192.168.43.175 -p 16432 -U postgres -n -S -T 30 -c 20 -j 4 bench_replication
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 20
number of threads: 4
duration: 30 s
number of transactions actually processed: 243826
latency average = 2.462 ms
tps = 8124.026158 (including connections establishing)
tps = 8128.137122 (excluding connections establishing)
从测试结果看出,使用pgpool-II的负载均衡性能不如nginx,也可能跟本机配置有关(cpu差),但从架构来看,pgpool-II包括了很多组件,性能不如主要做负载均衡的nginx也是正常。
pcp管理命令
pcp_node_count
显示数据库节点总数
[postgres@sdw3 ~]$ pcp_node_count
Password:
2
pcp_node_info
显示有关给定节点ID的信息
[postgres@sdw3 etc]$ pcp_node_info -n 0
Password:
192.168.43.175 6432 2 0.333333 up master 0 2020-05-12 09:43:00
[postgres@sdw3 etc]$ pcp_node_info -n 1
Password:
192.168.43.176 6432 2 0.666667 up slave 0 2020-05-12 09:43:00
pcp_proc_info
显示有关给定的Pgpool-II子进程ID的信息
[postgres@sdw3 ~]$ pcp_proc_info -v
Password:
Database : bench_replication
Username : postgres
Start time : 2020-05-11 14:37:22
Creation time: 2020-05-12 09:30:35
Major : 3
Minor : 0
Counter : 2
Backend PID : 7497
Connected : 1
PID : 5
pcp_watchdog_info
显示Pgpool-II的看门狗状态
[postgres@sdw3 ~]$ pcp_watchdog_info
Password:
ERROR: PCP: informing watchdog info failed
DETAIL: watcdhog is not enabled
pcp_proc_count,
显示Pgpool-II子进程ID的列表
[postgres@sdw3 ~]$ pcp_proc_count
Password:
5490 4084
pcp_pool_status,
显示pgpool.conf中
定义的参数值
pcp_detach_node
从Pgpool-II分离给定的节点。与Pgpool-II的现有连接被迫断开
[postgres@sdw3 ~]$ pcp_detach_node -n 1
Password:
pcp_detach_node -- Command Successful
[postgres@sdw3 ~]$ pcp_node_info -n 1
Password:
192.168.43.176 6432 3 0.666667 down slave 0 2020-05-12 09:44:45
pcp_attach_node
将给定节点附加到Pgpool-II
原先down掉的节点,使用命令回到pgpool-II后,先会做恢复,恢复完了等到当前所有连接断开后,状态才切换到正常
[postgres@sdw3 ~]$ pcp_attach_node -n 1
Password:
pcp_attach_node -- Command Successful
#恢复中
[postgres@sdw3 ~]$ pcp_node_info -n 1
Password:
192.168.43.176 6432 1 0.666667 waiting slave 0 2020-05-12 09:51:28
#正常状态
[postgres@sdw3 ~]$ pcp_node_info -n 1
Password:
192.168.43.176 6432 2 0.666667 up slave 0 2020-05-12 09:45:30
pcp_promote_node
将给定的节点升级为Pgpool-II的新主节点,仅在主/从流复制中,此命令实际上并不提升备用PostgreSQL后端:它只是更改Pgpool-II的内部状态并触发故障转移,用户必须在Pgpool-II外部提升备用PostgreSQL。
pcp_stop_pgpool
终止Pgpool-II进程
pcp_recovery_node
将给定的后端节点附加到恢复中




