暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL中间件之pgpool-II

叶同学专栏 2021-04-16
4190

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

将给定的后端节点附加到恢复中


文章转载自叶同学专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论