简介: Pgpool-II是一款工作在PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件。提供了连接池、复制、负载均衡、限制过多连接、看门狗、查询缓存等功能。
一、Pgpool-II简介
Pgpool-II是一款工作在PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件。提供了以下功能:
-
连接池
Pgpool-II保存到PostgreSQL服务器的连接,并在具有相同属性(即用户名、数据库、协议版本)的新连接进入时重新使用它们。它减少了连接开销,并提高了系统的整体吞吐量。
-
复制
Pgpool-II可以管理多个PostgreSQL服务器。使用复制功能可在2个或更多物理磁盘上创建实时备份,以便在磁盘出现故障时无需停服即可继续服务。
-
负载均衡
如果数据库有多副本,则在任何服务器上执行SELECT查询都将返回相同的结果。Pgpool-II利用复制功能,通过在多个服务器之间分配SELECT查询来减少每台PostgreSQL服务器上的负载,从而提高系统的整体吞吐量。查询性能随PostgreSQL服务器数量的增加而成比例提高。负载均衡在有许多用户同时执行多个查询的情况下工作得最好。
-
限制过多的连接
与PostgreSQL的并发连接的最大数量是有限制的,连接过多后会被拒绝。但是,设置最大连接数会增加资源消耗并影响系统性能。Pgpool-II对最大连接数也有限制,但额外的连接将被排队,而不是立即返回错误。
-
看门狗
WatchDog可以协调多个Pgpool-II,创建一个健壮的集群系统,避免单点故障或脑裂。WatchDog可以对其他pgpool-II节点执行健康检查,以检测PgPoll-II的故障。如果主用Pgpool-II关闭,备用Pgpool-II可以升级为主用,并接管虚拟IP。
-
查询缓存
查询缓存允许保存SELECT语句及其结果。如果出现相同的查询,则Pgpool-II将从缓存中返回值。由于不涉及SQL解析或访问PostgreSQL,因此在内存缓存中使用非常快。另一方面,在某些情况下,它可能比正常路径慢,因为它增加了存储缓存数据的一些开销。
Pgpool-II使用PostgreSQL的后端和前端协议,并在后端和前端之间转发消息。因此,数据库应用程序(前端)认为Pgpool-II是实际的PostgreSQL服务器,而服务器(后端)将Pgpool-II视为其客户端之一。因为Pgpool-II对服务器和客户端都是透明的,所以现有的数据库应用程序几乎可以在不更改其源代码的情况下与Pgpool-II一起使用。
下面以最新的Pgpool-II
4.5.2版为例介绍搭建过程,PostgreSQL数据库采用最新的16.3,操作系统为Ubuntu20.04。
二、安装规划
2.1 主机名及IP地址
主机名
IP地址 虚拟IP
master 172.16.101.120 主节点
segement1 172.16.101.121 备节点sync[同步复制]
segement2 172.16.101.122 备节点async[异步复制]
segement3 172.16.101.123 备节点async[异步复制]
VIP 172.16.101.124 VIP节点 对外提供服务(虚拟IP)
WAL 172.16.101.125 WAL流复制使用的IP(standby primary_conninfo)(虚拟IP)
2.2 PostgreSQL版本及相关配置
项目 | 内容 | 说明 |
---|---|---|
PostgreSQL版本 | 16.3 | 端口:5432 |
$PGDATA | /data/pgsql/data | |
归档模式 | 开启 | 归档日志目录:/data/pgsql/archive |
Replication Slots | 启用 |
2.3 PgPool-II版本及配置
项目内容说明
Pgpool-II版本
- 版本号:4.5.2
端口配置
- 9999:Pgpool-II服务连接端口
- 9898:PCP进程管理端口
- 9000:watchdog监控端口
- 9694:心跳检测UDP端口
配置文件
- 路径:/etc/pgpool2/pgpool.conf
用户权限
- 运行用户:postgres(适用于4.1及以上版本)
- 注意:4.0及以下版本需使用root用户运行
运行模式
- 部署方式:流复制模式
Watchdog配置
- 状态:启用
- 检测方式:heartbeat心跳检测### 项目内容说明
2.4 相关脚本
功能描述 | 脚本路径 | 说明 |
---|---|---|
故障转移 | /etc/pgpool2/failover.sh | 通过failover_command 调用执行主节点故障转移 |
故障恢复 | /etc/pgpool2/follow_primary.sh | 通过follow_primary_command 调用,用于同步新主节点和从节点 |
在线恢复 | /etc/pgpool2/recovery_1st_stage | 通过recovery_1st_stage_command 调用,用于恢复指定从节点 |
节点启动 | /etc/pgpool2/pgpool_remote_start | 通过recovery_1st_stage_command 调用,用于启动从节点 |
Watchdog | /etc/pgpool2/escalation.sh | 通过wd_escalation_command 调用,用于Pgpool-II节点间浮动IP切换功能描述 |
三、安装
1.在线安装
安装postgresql
sh -c 'echo "deb http://172.16.240.8/postgresql/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - http://172.16.240.8//postgresql/repos/apt/ACCC4CF8.asc | sudo apt-key add -
apt-get update
apt-get install postgresql-16-postgis-3
apt-get install libpq-dev
#安装pgpool
apt-get install pgpool2
2. 离线安装
Postgre16.3下载
# postgresql16.3
tar zxf postgresql-16.3.tar.gz
cd postgresql-16.3/
参数详解
# --prefix=/usr/pgsql-16 指定安装目录
# --with-systemd 支持systemd服务通知(只有使用systemd启动pg时才有效)
# --with-icu 支持使用icu排序规则功能
# --with-llvm JIT编译
# --with-lz4 允许使用LZ4来压缩表数据
# --with-ssl=openssl SSL(加密)连接的支持
# --with-uuid=ossp 支持使用ossp构建uuid
# --with-libxml SQL/XML支持
# --with-libxslt 支持XML和XSL转换,使用此选项必须指定--with-libxml
# --with-system-tzdata=/usr/share/zoneinfo PostgreSQL包括自己的时区数据库,这是日期和时间操作所需要的,这个时区数据库实际上与许多操作系统(如FreeBSD Linux Solaris)提供的IANA时区数据库兼容,因此再次安装它是多余的,使用此选项时,将使用DIRECTORY中系统提供的时区数据库,而不是PostgreSQL源代码分发中包含的时区数据库,必须将目录指定为绝对路径。注意:安装过程中不会自动检测不匹配或错误的时区数据,如果使用此选项,建议回归测试,以验证指向的时区数据是否与PostgreSQL正确使用
# --with-segsize=4 设置段大小(默认是1 单位为GB),大型表被划分为多个操作系统文件,每个文件的大小等于段大小,这避免了许多平台存在的文件大小限制问题,默认的段大小1GB在所有支持的平台上都是安全的,如果所用操作系统具有“大文件”支持(现在大多数系统都支持),则可以使用更大的段大小,这有助于减少处理非常大的表时消耗的文件描述符数,建议值为2的幂,注意:不同段大小的PG是不兼容的。
# --with-blocksize=8 设置块大小(默认为8,单位为KB),这是表中的存储I/O单位,默认值8KB,适用于大多数情况,如果阵列中的磁盘全是SSD,设置为4KB可能会有更好的性能,建议值为2的幂,注意:不同块大小的PG是不兼容的,这个参数与执行计划相关(Buffers: shared hit=805 read=64 dirtied=4)
# --with-wal-blocksize WAL块大小(默认为8,单位为KB),wal-segsize指定WAL段的大小(默认为16MB),wal-segsize/wal-blocksize为每个WAL段中WAL块的数量,建议值为2的幂,注意:不同WAL块大小的PG是不兼容的,--with-wal-segsize大小可以在initdb时指定,也可以通过pg_resetwal修改
./configure --prefix=/usr/pgsql-16 --with-systemd
make && make install
# -------------------------------
yum install -y systemd-devel readline-devel zlib-devel
pgpool-II-4.5.2下载
#pgpool-II-4.5.3
tar zxvf pgpool-II-4.5.2.tar.gz
cd pgpool-II-4.5.2
# 一定要加上--with-openssl,否则后续使用pgpool验证密码时会出错
# 这里将Pgpool安装到/opt/pgpool目录下
./configure --prefix=/opt/pgpool --with-openssl
make
make install
# 如果后续要使用Pgpool-II的online recovery功能,则需要编译相关扩展
cd src/sql/pgpool-recovery
make
make install
四、环境准备
创建postgres用户
# 创建postgres的家目录
mkdir -p /usr/pgsql-14
# 指定家目录创建以及登录方式
useradd -d /usr/pgsql-14 -s /bin/bash postgres
# 更改目录属主
chown -R postgres:postgres /usr/pgsql-14
# 修改密码
passwd postgres
# 验证
su - postgres
pwd
#all server
vi /etc/hosts
添加集群节点的IP和主机名
172.16.101.120 master
172.16.101.121 segement1
172.16.101.122 segement2
172.16.101.123 segement3
#120
vi /etc/hostname
hostnamectl set-hostname master
vim /etc/ssh/ssh_config
Host master
HashKnownHosts yes
GSSAPIAuthentication yes
#121
vi /etc/hostname
hostnamectl set-hostname segement1
vim /etc/ssh/ssh_config
Host segement1
HashKnownHosts yes
GSSAPIAuthentication yes
#122
......
#123
......
五、Pgpool-II配置
1.1 PostgreSQL相关配置
本例使用在线安装Postgresql安装在/usr/lib/postgresql/目录,Pgpool-II安装在/etc/pgpool目录。
1.在PostgreSQL主节点(db01)上设置流复制
数据库密码设置
passwd postgres
根据规划,创建归档日志目录
mkdir -p /data/pgsql/archive
mkdir -p /data/pgsql/data
chown -R postgres:postgres /data/pgsql
在主节点初始化数据库(如果你已经初始化了数据库,可跳过此步骤)
# 以postgres用户身份执行
su - postgres
/usr/lib/postgres/16/bin/initdb -D /data/pgsql/data
修改/data/pgsql/data/postgresql.conf文件:
listen_addresses = '*'
archive_mode = on
archive_command = 'cp "%p" "/home/pgsql/archive/%f"'
max_wal_senders = 10
max_replication_slots = 10
wal_level = replica
hot_standby = on
wal_log_hints = on
启动命令:
/usr/lib/postgresql/16/bin/pg_ctl -D /data/pgsql/data start
在主节点启动后,我们将使用Pgpool-II的在线恢复(Online Recovery)功能设置从节点。
2.创建相关用户
基于安全考虑,创建repuser用户用于流复制,pgpool用户用于流复制延迟检查及Pgpool健康检查。
用户名 | 密码 | 描述 |
---|---|---|
repuser | repuser | PostgreSQL 复制用户 |
pgpool | pgpool | Pgpool-II健康检查 (health_check_use)及复制延迟检查 (sr_check_user) 用户 |
postgres | postgres | 运行在线恢复的用户 |
[db01]# psql
postgres=# create role pgpool login password 'pgpool';
postgres=# create role repuser login replication encrypted password 'repuser';
如果想在show pool_nodes的结果里显示"replication_state"和"replication_sync_state"列,pgpool用户需要有数据库的超级用户权限或者添加到pg_monitor组(>=Pgpool-II 4.1):
GRANT pg_monitor TO pgpool;
修改/data/pgsql/data/pg_hba.conf,允许子网内其它节点访问主节点
host all all 0.0.0.0/0 trust
host replication repuser 0.0.0.0/0 md5
3.设置主从节点postgres用户ssh免密登录
如果要使用自动故障转移和在线恢复功能,需要设置主从节点间postgres用户免密登录,为方便配置时在各节点间复制文件,可先给postgres用户设置一个密码,配置完成后再删除密码。
# 在root用户下执行
# passwd postgres
在每个节点上执行如下命令创建ssh密钥,并将公钥分发到各个节点,这里假设创建的密钥名为id_rsa_pgpool。运行 withoutpasswd.sh 如下:
# 确保当前用户是postgres
if [ "$(id -u -n)" != "postgres" ]; then
echo "请以postgres用户身份运行此脚本"
exit 1
fi
# 生成SSH密钥对(如果尚不存在)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa -f ~/.ssh/id_rsa_pgpool -N "" # -N "" 表示不设置密码
# 将公钥复制到所有远程服务器
for ip in 172.16.101.120 172.16.101.121 172.16.101.122 172.16.101.123; do
ssh-copy-id -i ~/.ssh/id_rsa_pgpool.pub postgres@$ip
done
密钥创建分发完成后,执行ssh postgres@server1,检查是否不需要输入密码就可以登录成功。如果无法使用公钥登录,需要检查相关配置:
检查/etc/ssh/sshd_config文件PubkeyAuthentication选项是否为 yes
如果运行ssh-copy-id时无法通过密码登录其他节点,可在/etc/ssh/sshd_config文件中临时设置PasswordAuthentication yes
如果启用了selinux,ssh免密登录也可能会失败,可做如下操作:
[all servers]# su - postgres
[all servers]$ restorecon -Rv ~/.ssh
确保几个节点相互之间均可以通过ssh免密码登录后,继续配置。
scp /tmp/pg/withoutpasswd.sh postgres@172.16.101.121:/tmp/pg/
scp /tmp/pg/withoutpasswd.sh postgres@172.16.101.122:/tmp/pg/
scp /tmp/pg/withoutpasswd.sh postgres@172.16.101.123:/tmp/pg/
ssh postgres@172.16.101.121
cd /tmp/pg
chmod -R 777 withoutpasswd.sh
./withoutpasswd.sh
exit
ssh postgres@172.16.101.122
4.建立PostgreSQL密码文件
在流复制跟在线recovery时需要repuser用户密码,执行pg_rewind时需要postgres超级用户的密码,因此需要在postgres的家目录下创建.pgpass密码文件(重要!!!):
[all servers]# su - postgres
[all servers]$ vi .pgpass
#server1:5432:replication:repuser:<repl user password>
172.16.101.120:5432:replication:repuser:repuser
172.16.101.121:5432:replication:repuser:repuser
172.16.101.122:5432:replication:repuser:repuser
172.16.101.123:5432:replication:repuser:repuser
#server1:5432:postgres:postgres:<postgres user password>
172.16.101.120:5432:postgres:postgres:postgres
172.16.101.121:5432:postgres:postgres:postgres
172.16.101.122:5432:postgres:postgres:postgres
172.16.101.123:5432:postgres:postgres:postgres
[all servers]$ chmod 600 /var/lib/postgresql/.pgpass
创建完成后用scp复制到其他节点的postgres家目录下。
#otherservers
su - postgres
scp postgres@172.16.101.120:/var/lib/postgresql/.pgpass /var/lib/postgresql/
5.防火墙设置
如果启用了防火墙,需要设置防火墙允许相应端口:
[all servers]# firewall-cmd --permanent --zone=public --add-service=postgresql
[all servers]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp --add-port=9694/udp
[all servers]# firewall-cmd --reload
6.创建节点文件pgpool_node_id
需要在每个节点机的/etc/pgpool2目录下创建一个节点文件pgpool_node_id用于标识节点ID,以便看门狗识别每个节点,每个节点ID不能相同。
[server1]# cat /etc/pgpool2/pgpool_node_id
0
[sever2]# cat /etc/pgpool2/pgpool_node_id
1
[server3]# cat /etc/pgpool2/pgpool_node_id
2
[server4]# cat /etc/pgpool2/pgpool_node_id
2
1.2 Pgpool-II配置
源码安装,配置文件在/etc/pgpool2目录下,复制pgpool.conf.sample文件为pgpool.conf,然后修改相应选项。在线安装方式无sample文件,参考提供文档。
1.集群模式
Pgpool-II支持多种集群模式,这里推荐使用PostgreSQL的流复制模式
backend_clustering_mode = 'streaming_replication'
2.侦听地址、端口号
listen_addresses = '*'
port = 9999
3.流复制检查
sr_check_user = 'pgpool'
#密码置空,使用pool_passwd文件
sr_check_password = ''
4.健康检查
启用运行状况检查,以便Pgpool-II执行故障切换。此外,如果网络不稳定,即使后端运行正常,健康检查也会失败,可能会发生故障切换或退化操作。为了防止此类错误检测运行状况检查,我们将Health_check_max_reries设置为3。
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
#密码置空,使用pool_passwd文件
health_check_password = ''
health_check_max_retries = 3
5.PostgreSQL服务端设置
本例添加了三个节点
backend_hostname0 = 'server0' #主机名或IP地址
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'server1'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
......
如果想在show pool_nodes的结果里显示"replication_state" and "replication_sync_state"列,需要设置backend_application_name参数。这里我们设置成后端主机名。(>=Pgpool-II 4.1)
...
backend_application_name0 = 'server0'
...
backend_application_name1 = 'server1'
...
......
6.故障转移配置
在failover_command参数中指定故障转移后要执行的failover.sh脚本。如果我们使用3台PostgreSQL服务器,则需要指定flow_primary_command用于在主节点故障转移后进行后续处理。如果有两台PostgreSQL服务器,则不需要设置flow_primary_command。
failover_command = '/etc/pgpool2/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool2/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
/opt/pgpool2/etc目录下有相关脚本的的示例文件,需要根据自身情况做相应的修改。修改完成后scp到其他节点相同目录下。
[all servers]# cd /opt/pgpool2/etc
[all servers]# cp -p failover.sh.sample failover.sh
[all servers]# cp -p follow_primary.sh.sample follow_primary.sh
[all servers]# chown postgres:postgres failover.sh follow_primary.sh
# 这两个脚本文件主要修改PG_HOME这一项,改为自己的PostgreSQL安装目录
follow_primary_command所设置的脚本follow_primary.sh脚本还需要执行pcp命令,还需要做pcp密码验证,因些还要修改follow_primary.sh的PCP_USER参数,这里我们使用pgpool用户。
# cat /etc/pgpool2/follow_primary.sh
...
PCP_USER=pgpool
...
同步配置到其它节点
chown postgres:postgres /etc/pgpool2
su - postgres
scp postgres@172.16.101.120:/etc/pgpool2/failover.sh /etc/pgpool2/
scp postgres@172.16.101.120:/etc/pgpool2/follow_primary.sh /etc/pgpool2/
使用pg_md5程序加密pgpool密码并保存到/etc/pgpool2/pcp.conf文件中:
[all servers]#echo 'pgpool:'`pg_md5 pgpool` >> /etc/pgpool2/pcp.conf
为了让follow_primary.sh脚本执行pcp命令时无需输入密码,需要在postgres用户的家目录下生成.pcppass文件。
[all servers]# su - postgres
[all servers]$ echo 'localhost:9898:pgpool:pgpool' > ~/.pcppass
[all servers]$ chmod 600 ~/.pcppass
7.在线recovery配置
在线recovery需要超级用户权限,因此需要以postgres用户的身份运行,需要执行recovery_1st_stage_command和recovery_2nd_stage_command参数指定的脚本,配置如下:
recovery_user = 'postgres'
recovery_password = ''
recovery_1st_stage_command = 'recovery_1st_stage'
recovery_2nd_stage_command = 'pgpool_remote_start'
这两个脚本在/opt/pgpool2目录下也有相应的用例,根据自己的场景修改相关参数,主要修改PG_HOME参数。并将修改好的脚本文件复制到PG_HOME目录,赋予可执行权限。
[server1]# cp -p /opt/pgpool2/etc/recovery_1st_stage.sample /data/pgsql/data/recovery_1st_stage
[server1]# cp -p /opt/pgpool2/pgpool_remote_start.sample /data/pgsql/data/pgpool_remote_start
[server1]# chown postgres:postgres /data/pgsql/data/{recovery_1st_stage,pgpool_remote_start}
[server1]# chmod +x /data/pgsql/data/{recovery_1st_stage,pgpool_remote_start}
在线recovery需要用到pgpool_recovery扩展提供的pgpool_recovery, pgpool_remote_start, pgpool_switch_xlog函数,因此需要在主节点的template1数据库模板上创建pgpool_recovery扩展
[server1]# su - postgres
[server1]$ psql template1 -c "CREATE EXTENSION pgpool_recovery"
拷贝文件到其它服务器
#other servers
su - postgres
scp postgres@172.16.101.120:/data/pgsql/data/{recovery_1st_stage,pgpool_remote_start} /data/pgsql/data/
8.客户端认证配置
出于安全原因,客户端访问pgpool里也需要密码认证,因些需要配置pgpool的密码认证,类似于PostgreSQL的pg_hba.conf,pgpool的配置文件保存在/ect/pgpool2目录下,文件名为pool_hba.conf,我们使用md5算法。
enable_pool_hba = on
pool_passwd = 'pool_passwd'
pool_hba.conf
host all pgpool 0.0.0.0/0 md5
host all postgres 0.0.0.0/0 md5
此外还需要为所有需要通过Pgpooll访问PostgreSQL数据库的用户创建Pgpool的密码文件,密码文件位于/etc/pgpool2目录下,缺省文件名为:pool_passwd。密码使用AES算法加密,需要先生成.pgpoolkey文件,文件中保存加密用的密钥。
[all servers]# su - postgres
[all servers]$ echo 'some string' > ~/.pgpoolkey
[all servers]$ chmod 600 ~/.pgpoolkey
生成key文件后,执行pg_enc -m -k /path/to/.pgpoolkey -u username -p生成用户的密码。
[all servers]# su - postgres
[all servers]$ pg_enc -m -k ~/.pgpoolkey -u pgpool -p
db password: [pgpool user's password]
[all servers]$ pg_enc -m -k ~/.pgpoolkey -u postgres -p
db password: [postgres user's password]
# cat /etc/pgpool2/pool_passwd
pgpool:AESheq2ZMZjynddMWk5sKP/Rw==
postgres:AESHs/pWL5rtXy2IwuzroHfqg==
chmod -R 777 /etc/pgpool2/
scp postgres@172.16.101.120:/etc/pgpool2/pgpool.conf /etc/pgpool2/pgpool.conf
scp postgres@172.16.101.120:/etc/pgpool2/pool_hba.conf /etc/pgpool2/pool_hba.conf
9.看门狗配置
# 看门狗相关
use_watchdog = on
# 节点1
hostname0 = 'server0'
wd_port0 = 9000
pgpool_port0 = 9999
# 节点2
hostname1 = 'server1'
wd_port1 = 9000
pgpool_port1 = 9999
# 节点3
hostname2 = 'server2'
wd_port2 = 9000
pgpool_port2 = 9999
# 节点4
hostname3 = 'server3'
wd_port3 = 9000
pgpool_port3 = 9999
delegate_ip = '172.16.101.124' #浮动IP
if_cmd_path = '/usr/sbin'
if_up_cmd = '/usr/bin/sudo /usr/sbin/ip addr add $_IP_$/32 dev ens160 label eth160 :0'
if_down_cmd = '/usr/bin/sudo /usr/sbin/ip addr del $_IP_$/32 dev ens160 '
arping_path = '/usr/sbin'
arping_cmd = '/usr/bin/sudo /usr/bin/arping -U $_IP_$ -w 1 -I ens160 '
ping_path = '/usr/bin'
wd_escalation_command = '/etc/pgpool2/escalation.sh'
heartbeat_hostname0 = 'server0'
heartbeat_port0 = 9694
heartbeat_device0 = ''
heartbeat_hostname1 = 'server1'
heartbeat_port1 = 9694
heartbeat_device1 = ''
heartbeat_hostname2 = 'server2'
heartbeat_port2 = 9694
heartbeat_device2 = ''
heartbeat_hostname3 = 'server3'
heartbeat_port3 = 9694
heartbeat_device3 = ''
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
看门狗在做浮动IP切换、执行arping检查其他节点是否存活时需要以root权限执行,需要为postgres用户设置相应的权限,使用visudo编辑权限,加上如下内容:
postgres ALL=NOPASSWD: /usr/sbin/ip
postgres ALL=NOPASSWD: /usr/bin/arping
wd_escalation_command指定浮动IP切换脚本,/home/postgres/pgpool/etc目录下有相应用例escalation.sh.sample,根据自身情况修改:
[all servers]# cd /opt/pgpool2/etc
[all servers]# cp -p escalation.sh.sample escalation.sh
[all servers]# chown postgres:postgres escalation.sh
[all servers]# chmod +x escalation.sh
[all servers]# vi escalation.sh
...
PGPOOLS=(server1 server2 server3 server4)
VIP=172.16.101.124
# 需要绑定的网卡名可通过ifconfig -a查看
DEVICE=ens160
10.日志配置
logging_collector = on
log_directory = '/var/log/pgpool/logs'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_size = 100MB
pid_file_name = '/var/run/pgpool/pgpool.pid'
logdir = '/tmp'
附:postgres.conf
#数据库访问控制,* 为所有都可以
listen_addresses = '*'
#数据库端口
port = 5432
#数据库连接数
max_connections = 500
superuser_reserved_connections = 10
wal_level = replica
full_page_writes = on
wal_log_hints = on
#wal日志是否开启,如果不开启,wal日志相关都可以关闭。
archive_mode = on
archive_command = 'cp "%p" "/data/pgsql/archive/%f"'
max_wal_senders = 50
max_replication_slots = 10
#wal_keep_segments = 512
#wal_keep_size
#wal_segment_size =300M
min_wal_size =800MB
hot_standby = on
log_destination = 'csvlog'
#日志设置
logging_collector = on
log_directory = 'log'
log_filename = 'pglog-%Y-%m-%d'
log_rotation_size = 64MB
log_statement = 'none'
log_line_prefix = '%m %a %u %d %r'
log_rotation_age = 1440
log_truncate_on_rotation = off
#SQL超过多少毫秒会被记录到日志中
log_min_duration_statement =3000
#单个线程用于排序大小,reload 生效
work_mem = 4MB
#单个线程缓冲区大小,reload 生效
temp_buffers = 4MB
#系统支持最大后台进程数,不要超过CPU核心数
max_worker_processes =4
#系统支持最大并行进程数
max_parallel_workers = 4
#系统允许启动最大并行进程数
max_parallel_workers_per_gather = 4
#备库应用wal和查询冲突时候,调整该参数超时。毫秒
max_standby_streaming_delay = 1200000
log_timezone = 'PRC'
timezone = 'PRC'
parallel_tuple_cost=0.1
parallel_setup_cost=1000
min_parallel_table_scan_size = 8MB
min_parallel_index_scan_size = 512kB
#force_parallel_mode=off
#内存25%-50%,分配数据库内存
shared_buffers = 8GB
#内存的50%,适当调整该参数可以提高查询走索引
#SSD配置
#random_page_cost = 1.5
effective_cache_size = 4GB
maintenance_work_mem = 2GB
wal_buffers =16MB
archive_timeout = 1800
wal_sync_method = fsync
tcp_keepalives_interval = 60
tcp_keepalives_idle = 300
log_checkpoints=on
track_activities = on
track_counts = on
track_io_timing = on
#track_functions = all/p1
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = 'top'
pg_stat_statements.save = on
#tcp_keepalives_idle = 60
#tcp_keepalives_interval = 60
#tcp_keepalives_count = 5
#以下是地图编译平台特殊需要参数
bytea_output = 'escape'
#checkpoint_segments =10
commit_delay =1000
DateStyle = 'ISO, YMD'
default_text_search_config = 'pg_catalog.simple'
#lc_messages ='zh_CN.UTF-8'
#lc_monetary ='zh_CN.UTF-8'
#lc_numeric ='zh_CN.UTF-8'
#lc_time = 'zh_CN.UTF-8'
#流复制配置
#synchronous_commit = on
#synchronous_standby_names = '*'
#wal_sender_timeout = 60s
附:pgpool.conf
backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
unix_socket_directories = '/tmp'
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
# master
backend_hostname0 = '172.16.101.120' #主机名或IP地址
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'server0'
# standby-1
backend_hostname1 = '172.16.101.121'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'server1'
# standby-2
backend_hostname2 = '172.16.101.122'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/data/pgsql/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'server2'
# standby-3
backend_hostname2 = '172.16.101.123'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/data/pgsql/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'server3'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
process_management_mode = dynamic
num_init_children = 32
min_spare_children = 5
max_spare_children = 10
max_pool = 4