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

pgpool部署

原创 necessary 2025-05-08
600

简介

Pgpool-II 是一个专门为 PostgreSQL 提供中间层功能的软件,位于 PostgreSQL 客户端与后端数据库服务器之间,提供:连接池(Connection Pooling)、负载均衡(Load Balancing)、主备切换(Failover / Watchdog)、读写分离、并行查询(Parallel Query)、复制功能(基于流复制)、自动故障转移。
在安装方便,我觉得pgpool是PG高可用方案里面最复杂的一个。配置文件也是比较多,运维起来也是非常复杂。先初步了解一下相关参数及其功能
image.png

功能 说明
🔁 高可用(High Availability) Pgpool-II 通过多个 PostgreSQL 实例实现自动故障转移(failover),失效节点会自动剔除。支持 Pgpool 自身的高可用机制 Watchdog,通过仲裁算法避免误判和脑裂。
⚖️ 负载均衡(Load Balancing) Pgpool-II 自动识别读写操作,将只读查询分发到多个 PostgreSQL 服务器,提升读取性能。写操作发送至主节点或所有节点(根据复制模式)。
🔄 连接池(Connection Pooling) Pgpool-II 维护与 PostgreSQL 的连接池,重复使用已建立连接,减少连接建立的开销,提高系统吞吐量。
💡 在线恢复(Online Recovery) 支持通过一个命令恢复数据库节点。结合自动故障转移,故障节点可自动恢复为备库,并重新加入集群。
🚫 连接数限制(Connection Limiting) Pgpool-II 可配置最大连接数,超出后可选择排队等待或立即拒绝连接。比直接增大数据库连接数更节省资源。
👁️ Watchdog(守护机制) 用于 Pgpool-II 自身的高可用性,支持多个 Pgpool 节点间健康检查、自动故障转移、虚拟 IP 接管,至少需要 3 个 Pgpool 节点防止脑裂。
🧠 内存查询缓存(In-Memory Query Cache) 支持缓存 SELECT 查询及结果,命中缓存时无需解析 SQL 或访问数据库,大幅提升响应速度。某些场景下缓存管理带来的开销可能略高。
🔌 协议代理与透明性 Pgpool-II 完全模拟 PostgreSQL 的前后端协议,对客户端透明,几乎无需修改应用即可使用。
🖥️ 平台兼容性 支持 Linux、FreeBSD 和大多数类 Unix 系统(不支持 Windows)。推荐 PostgreSQL 使用相同主版本和构建选项。

集群部署的默认配置

配置项 value
PGPORT 5432
PGDATA /var/lib/pgsql/17/data
9999 Pgpool-II 接受连接端口
9898 PCP进程连接端口
9000 watchdog连接端口
9694 UDP端口,用于接收watchdog的心跳信号
pgpool配置文件路径 /etc/pgpool-II/pgpool.conf
执行failover_command命令执行故障切换 /etc/pgpool-II/sample_scripts/failover.sh.sample
执行follow_primary_command,与新的Primary同步 /etc/pgpool-II/sample_scripts/follow_primary.sh.sample
执行recovery_1st_stage命令恢复备节点 /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample
执行recovery_1st_stage_命令后启动备节点 /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample
执行wd_escalation_command命令,安全切换主备Pgpool-II /etc/pgpool-II/sample_scripts/escalation.sh.sample
repl PostgreSQL复制用户
pgpool Pgpool-II健康检查用户(health_check_user)和复制延迟检查用户(sr_check_user)
postgres 在线运行恢复用户

Pgpool-II 配置参数说明

1. 后端集群模式(BACKEND CLUSTERING MODE)

参数 说明 可选值 / 默认 典型场景
backend_clustering_mode Pgpool-II 与后端集群的协作模式 streaming_replication
native_replication
logical_replication
slony
raw
snapshot_isolation
流复制:streaming_replication
Slony:slony
逻辑复制:logical_replication
测试:raw

2. 连接设置(CONNECTIONS)

参数 说明 可选值 / 默认 典型场景
listen_addresses Pgpool-II 监听地址 'localhost' / '*' '*' 对外;127.0.0.1 本地测试
port Pgpool-II TCP 端口号 9999 与防火墙规则保持一致
unix_socket_directories Unix 域套接字路径 '/var/run/postgresql' 与 PostgreSQL 保持一致
reserved_connections 预留连接数(不计入 num_init_children) 0 保证管理员连接不中断
pcp_listen_addresses / pcp_port PCP 管理命令接口监听地址与端口 'localhost' / 9898 脚本或运维工具自动化
pcp_socket_dir PCP Unix 域套接字目录 '/var/run/postgresql' 当使用 PCP socket 模式时,指定套接字目录
listen_backlog_multiplier backlog 大小 = num_init_children×此值 2 高并发场景可调大
serialize_accept 串行化 accept() 调用以避免“群羊效应” on / off(默认 off 大量连接涌入时建议 on
backend_hostnameN / portN 后端节点主机名/IP 与端口 定义每个 PostgreSQL 实例
backend_weightN 负载均衡权重 1 读写分离时给主库更高权重
backend_flagN 节点故障转移策略 ALLOW_TO_FAILOVER
DISALLOW_TO_FAILOVER
ALWAYS_PRIMARY
控制节点可否做主或仅备用

3. 身份认证(AUTHENTICATION)

参数 说明 可选值 / 默认 典型场景
enable_pool_hba 使用 pool_hba.conf 代替 PostgreSQL 原生认证 on / off(默认) 集中管理连接白名单
pool_passwd 存放用户密码的文件 文件名 或 "" 禁用 MD5 认证时指定;SCRAM 推荐使用原生
authentication_timeout 客户端认证超时时间 1min / 0(无超时) 防止恶意挂起认证
allow_clear_text_frontend_auth 允许明文密码认证 on / off(默认) 内网或测试环境可临时开启

4. SSL 支持(SSL CONNECTIONS)

参数 说明 可选值 / 默认 典型场景
ssl 是否启用 SSL on / off 要求加密传输时开启
ssl_key / ssl_cert SSL 私钥 / 证书文件 文件路径 与客户端信任链匹配
ssl_ca_cert / ssl_ca_cert_dir CA 根证书文件 / 目录 文件或目录路径 验证客户端证书时使用
ssl_ciphers 允许的加密套件 OpenSSL 格式 遵循企业安全策略
ssl_prefer_server_ciphers 优先使用服务器的套件顺序 on / off 强制使用最安全算法

5. 连接池(POOLS)

参数 说明 可选值 / 默认 典型场景
process_management_mode 子进程管理模式 static / dynamic(默认) static:预 fork;dynamic:节省资源
process_management_strategy 动态模式下缩减策略 lazy / gentle(默认) / aggressive aggressive:快速回收空闲进程
num_init_children 最大并发连接数 32(示例) 根据硬件与并发需求调节
min_spare_children 动态模式下最小空闲进程数 5 保证突发连接快速响应
max_spare_children 动态模式下最大空闲进程数 10 防止资源过度占用
max_pool 每客户端连接的连接缓存数 4 高频短会话场景重用后端连接
child_life_time 子进程空闲后退出前最大存活时间 5min 限制长期空闲进程
child_max_connections 子进程最大处理连接数 0(无限) 长连接应用可调大;短连接保留默认
connection_life_time 后端连接空闲后自动关闭时间 0(永不关闭) 防止后端资源泄露
client_idle_limit 客户端空闲断开超时 0(永不断开) 限制客户端长时间挂起会话

6. 日志(LOGS)

参数 说明 可选值 / 默认 典型场景
log_destination 日志输出位置 stderr / syslog 生产环境建议 syslog
log_connections 记录连接建立 on / off(默认) 审计或故障排查
log_disconnections 记录连接断开 on / off(默认) 审计或故障排查
log_statement 记录所有 SQL on / off(默认) 调试或性能分析
log_per_node_statement 记录带节点信息的 SQL on / off(默认) 多节点定位问题
logging_collector 将 stderr 重定向到日志文件 on / off 生产环境建议开启
log_directory 日志文件目录 路径 与运维日志策略保持一致
log_filename 日志文件名模式 模式(含 %astrftime 按天或按实例分文件
log_rotation_age 时间驱动轮转间隔 1d 防止单文件过大
log_rotation_size 大小驱动轮转阈值 0(关闭) 根据磁盘与审计需求配置
log_error_verbosity 错误详情级别 terse / default / verbose 调试时可设 verbose
client_min_messages 客户端消息日志级别 notice(默认) 根据需求调节
log_min_messages 服务端日志级别 warning(默认) 生产环境建议 warning 或更高

7. 复制模式(REPLICATION MODE)

参数 说明 可选值 / 默认 典型场景
replicate_select 是否将 SELECT 语句也复制到所有节点 on / off 读写分离场景:复制只写,关闭此项
insert_lock 插入时锁定行或表以保证 SERIAL 字段一致性 on / off 多主写场景必需;单主写可关闭提高性能
replication_stop_on_mismatch 后端返回不一致时是否停止会话 on / off 数据一致性要求高时开启
failover_if_affected_tuples_mismatch UPDATE/DELETE 影响行数不一致时是否触发故障转移 on / off 防止数据分歧累积

8. 负载均衡(LOAD BALANCING MODE)

参数 说明 可选值 / 默认 典型场景
load_balance_mode 是否开启读写分离负载均衡 on / off 大量只读查询场景,分担主库压力
read_only_function_list 指定函数视为只读 列表 / 正则 UDF 只读场景,避免写库瓶颈
write_function_list 指定函数视为写 列表 / 正则 特殊写函数场景
disable_load_balance_on_write 写操作后负载均衡禁用策略 transaction(默认)
trans_transaction
dml_adaptive
always
控制事务内写后分流行为
statement_level_load_balance 是否按语句级别进行负载均衡 on / off 细粒度分流场景

9. 流复制检测(STREAMING REPLICATION MODE)

参数 说明 可选值 / 默认 典型场景
sr_check_period 流复制延迟检测间隔(秒),0 禁用 10 延迟敏感场景可缩短;非敏感可设 0
sr_check_user 执行延迟检测的用户 'nobody' 单独检测账户,权限最小化
sr_check_password 延迟检测用户的密码 '' 空串时从 pool_passwd 文件读取
sr_check_database 用于执行流复制延迟检测的数据库名称 'postgres' 健康检查时连接的数据库
delay_threshold 延迟阈值(字节),超过不发往从节点 0 高一致性场景设 >0
delay_threshold_by_time 延迟阈值(秒),超过不发往从节点 0 以时间为基准控制
prefer_lower_delay_standby 多从节点时优先选择延迟更低的备用节点 on / off 多从节点环境中优化读请求

10. 健康检查(HEALTH CHECK)

参数 说明 可选值 / 默认 典型场景
health_check_period 定期健康检查间隔(秒),0 禁用 0 自动剔除故障节点时开启
health_check_timeout 单次检查超时时间(秒) 20 网络不稳定时适当调高
health_check_user 健康检查使用的用户 'nobody' 专用账户,权限最小化
health_check_password 健康检查用户的密码 '' 空串时从 pool_passwd 文件读取
health_check_database 健康检查使用的数据库 ''(默认尝试 postgres) 指定数据库进行检查
health_check_max_retries 最大重试次数 0 提高容错需增大
health_check_retry_delay 重试间隔(秒) 1 控制重试频率
connect_timeout 与后端连接超时(毫秒),同时作用于健康检查 10000 短超时可快速剔除;慢网络适当增大

11. 故障转移与在线恢复(FAILOVER & ONLINE RECOVERY)

参数 说明 可选值 / 默认 典型场景
failover_on_backend_error 后端通信 socket 失败时触发故障转移 on / off 保证读写可用性
failover_on_backend_shutdown 后端进程退出时触发故障转移 on / off 自动剔除宕机节点
failover_command 故障转移后执行的脚本,可用占位符传参 '' VIP 切换、告警集成
auto_failback 故障恢复后是否自动回迁 on / off 小规模可自动;大规模建议人工确认
failback_command 自动回迁时执行的脚本 '' 回迁到原主节点
recovery_1st_stage_command 在线恢复第一阶段脚本 '' 拉取基础备份(如 pg_basebackup)
recovery_2nd_stage_command 在线恢复第二阶段脚本 '' 应用 WAL 或恢复配置
recovery_timeout 等待恢复完成的超时时间(秒) 90 防止无限等待
client_idle_limit_in_recovery 恢复期间客户端空闲断开超时 0 防止挂起阻塞恢复

12. Watchdog 高可用(WATCHDOG)

参数 说明 可选值 / 默认 典型场景
use_watchdog 启用 Watchdog 守护进程 on / off 多节点 Pgpool-II 集群必开
trusted_servers 网络连通性检测的可信服务器列表 'vm141,vm142,vm143' 指定多台主机做外部连通性检测
heartbeat_device0/1/2 Watchdog 心跳网络设备 'eth0' 指定网卡进行心跳通信
heartbeat_port0/1/2 Watchdog 心跳端口 9694 心跳信号通信端口
hostname0/1/2 Watchdog 集群各节点主机名 'vm141'/'vm142'/'vm143' 节点间仲裁使用
wd_port0/1/2 Watchdog 服务监听端口 9000 节点间仲裁服务端口
pgpool_port0 第一个节点 Pgpool-II 健康检查端口 9999 Watchdog 用于检测 Pgpool 主进程
wd_priority Watchdog 优先级,数值越小优先级越高 1/2/3 节点仲裁主选优先级
wd_authkey Watchdog 通信认证密钥 '' 集群节点间通信安全
wd_ipc_socket_dir Watchdog 本地进程间通信目录 '/var/run/postgresql' 本地 IPC 通信套接字路径
delegate_ip 虚拟 IP 地址 '' 主备切换时客户端透明访问 VIP
if_cmd_path if_up/if_down 脚本目录 '/sbin' 指定脚本路径
if_up_cmd / if_down_cmd 启用/禁用 VIP 的命令 脚本命令 网络环境匹配
arping_path / arping_cmd ARP 通知路径及命令 '/usr/sbin' 通知交换机更新 MAC 表

13. 其它与查询缓存(OTHERS & QUERY MEMORY CACHE)

参数 说明 可选值 / 默认 典型场景
relcache_expire / relcache_size 系统目录表缓存过期时间与条目数 0 / 256 系统表查询频繁时调整
check_temp_table 临时表检查方式 catalog / trace / none 无临时表环境可设 none
check_unlogged_table unlogged 表检查 on / off 确保主库一致性时开启
enable_shared_relcache 共享子进程间的关系缓存 on / off 提升缓存命中率
memory_cache_enabled 启用内存查询缓存 on / off 热点查询缓存
memqcache_method 缓存存储方式 shmem / memcached 分布式场景可选 memcached
memqcache_total_size 内存缓存总大小 64MB 根据查询量与可用内存调节
memqcache_max_num_cache 最大缓存条目数 1000000 控制缓存容量
memqcache_expire 缓存条目过期时间 0(无限) 热点变化快时设短期过期
memqcache_auto_cache_invalidation 自动失效触发:DDL/DML 操作后或过期时 on / off 保证缓存一致性
memqcache_maxcache 单次 SELECT 最大缓存大小 400kB 控制单次缓存块大小
memqcache_cache_block_size 缓存块大小 1MB 控制缓存块粒度

postgresql安装

由于rel7已经结束生命周期,所以rel7只能下载到PG15、pgpool-II-4.4。更高版本需要进行源码安装。

## 检查是否已经存在PGDG
rpm -ql pgdg-redhat-repo
yum remove -y pgdg-redhat-repo
userdel postgres 
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql15-server postgresql15-contrib  
sudo sed -i '/^\[.*\]/a exclude=pgpool*' /etc/yum.repos.d/pgdg-redhat-all.repo  ## PGDG中禁用pgpool包

创建归档目录
mkdir -p /var/lib/pgsql/archivedir
chown -R postgres:postgres /var/lib/pgsql/archivedir

pgpool安装

rpm -e pgpool-II-release
rpm -Uvh --force https://www.pgpool.net/yum/rpms/4.4/redhat/rhel-7-x86_64/pgpool-II-release-4.4-1.noarch.rpm
yum clean all
yum makecache
yum install -y pgpool-II-pg15 pgpool-II-pg15-extensions 
chown -R postgres:postgres /etc/pgpool-II/

初始化数据库

## 选用一个节点作为主节点进行初始化数据库
/usr/pgsql-15/bin/postgresql-15-setup initdb

cat >> /var/lib/pgsql/15/data/postgresql.conf << EOF
shared_buffers =300MB
wal_buffers = 16MB
max_wal_size=1GB
min_wal_size=250MB
wal_keep_size = 1GB
shared_preload_libraries = 'pg_stat_statements'
listen_addresses = '*'
port = 5432
superuser_reserved_connections = 20
unix_socket_permissions = 0700
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10
vacuum_cost_delay = 10
bgwriter_delay = 10ms
synchronous_commit = off
wal_writer_delay = 10ms
logging_collector = on
log_directory = 'log'
log_filename ='postgresql-%Y-%m-%d.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
wal_level = logical
wal_log_hints=on
checkpoint_timeout = 5min
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/archivedir/%f && cp %p /var/lib/pgsql/archivedir/%f'
max_wal_senders = 3
wal_level = hot_standby
max_wal_senders = 3
password_encryption = md5
EOF

##选用一个节点作为主节点修改白名单

## 由于postgresql采用的rpm安装 hba对于本地访问的链接 method采用的是peer。所以这里采用覆盖hba文件的方式
cat > /var/lib/pgsql/15/data/pg_hba.conf << 'EOF'
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host all postgres 10.0.0.141/32 trust
host all postgres 10.0.0.142/32 trust
host all postgres 10.0.0.143/32 trust
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all        0/0  md5
host	  all		 all        0/0     md5
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5
EOF

cat /var/lib/pgsql/15/data/pg_hba.conf

 systemctl start postgresql-15.service 
 systemctl status postgresql-15.service ## 集群不采用systdm的方式启动postgresql,这里启动只是才看是否启动正常。
 systemctl stop postgresql-15.service


image.png

配置postgres用户免密(所有节点执行)

cat >> /etc/hosts << EOF
10.0.0.141 vm141
10.0.0.142 vm142
10.0.0.143 vm143
EOF


cat >> ~postgres/.bash_profile << 'EOF'  
export PGPORT=5432
export PGDATA=/var/lib/pgsql/15/data/
export PGHOME=/usr/pgsql-15
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
export PGUSER=postgres
export PGDATABASE=postgres
EOF

选用一个节点作为主节点,创建集群管理相关用户和辅助插件,只需要在主节点

su - postgres 
pg_ctl start 
 psql -U postgres template1 -c "CREATE EXTENSION pgpool_recovery;CREATE EXTENSION pgpool_adm;" 
 psql -U postgres postgres  -c "CREATE EXTENSION pgpool_recovery;CREATE EXTENSION pgpool_adm;" 
psql -U postgres -d postgres 
set password_encryption = 'md5';
CREATE ROLE pgpool WITH LOGIN;
CREATE ROLE repl WITH REPLICATION LOGIN;
alter user postgres with password 'postgres';
alter user pgpool with password 'pgpool';
alter user repl with password 'repl';
GRANT pg_monitor TO pgpool;  

root 免密(所有节点同步执行)

rm -rf ~root/.ssh
mkdir ~root/.ssh
cd  ~root/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool

ssh-copy-id -i id_rsa_pgpool.pub root@vm141
ssh-copy-id -i id_rsa_pgpool.pub root@vm142
ssh-copy-id -i id_rsa_pgpool.pub root@vm143
chmod 600 ~root/.ssh/* 
chmod 644 ~root/.ssh/*.pub 
chmod 700 ~root/.ssh
##效验免密(所有节点同步执行)
ssh root@vm141  -i ~root/.ssh/id_rsa_pgpool    date
ssh root@vm142  -i ~root/.ssh/id_rsa_pgpool    date
ssh root@vm143  -i ~root/.ssh/id_rsa_pgpool    date

## 为postgres添加sudo权限

echo "postgres ALL=(ALL) NOPASSWD:ALL" | sudo EDITOR='tee -a' visudo
sudo grep "^postgres" /etc/sudoers

postgres 免密(所有节点同步执行)

##设置postgres密码
echo "postgres:postgres" |chpasswd 

su - postgres 
rm -rf ~postgres/.ssh
mkdir ~postgres/.ssh
chmod 700 ~postgres/.ssh
cd ~postgres/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool

ssh-copy-id -i id_rsa_pgpool.pub postgres@vm141
ssh-copy-id -i id_rsa_pgpool.pub postgres@vm142
ssh-copy-id -i id_rsa_pgpool.pub postgres@vm143
chmod 600 ~postgres/.ssh/* 
chmod 644 ~postgres/.ssh/*.pub 
chmod 700 ~postgres/.ssh

#效验免密(所有节点同步执行)
ssh postgres@vm141  -i ~postgres/.ssh/id_rsa_pgpool    date
ssh postgres@vm142  -i ~postgres/.ssh/id_rsa_pgpool    date
ssh postgres@vm143  -i ~postgres/.ssh/id_rsa_pgpool    date

配置pgpass(所有节点同步执行)

如果你是手工创建的postgres用户,其工作目录默认为/home/postgres,需要执行以下命令修改其postgres主目录。如果是安装postgresql是默认添加的用户,其postgres主目录为/var/lib/pgsql ,不需要修改。
usermod -d /var/lib/pgsql -m postgres ### 看情况操作

su - postgres 
cat > ~postgres/.pgpass << EOF
localhost:5432:replication:repl:repl
localhost:9999:postgres:pgpool:pgpool
localhost:5432:postgres:postgres:postgres
vm141:5432:replication:repl:repl
vm142:5432:replication:repl:repl
vm143:5432:replication:repl:repl
vm141:9999:postgres:pgpool:pgpool
vm142:9999:postgres:pgpool:pgpool
vm143:9999:postgres:pgpool:pgpool
vm141:5432:postgres:postgres:postgres
vm142:5432:postgres:postgres:postgres
vm143:5432:postgres:postgres:postgres

EOF

chmod 600 ~postgres/.pgpass

follow_primary.sh 脚本会使用到,执行PCP命令必须不输入密码, 创建 ~postgres/.pcppass (Pgpool-II用户的主目录运行为)。 ~postgres/.pcppass的格式为 “ hostname:port:username:password ”。在本例中,PCP用户 pgpool 密码为 pgpool 。

cat >  ~postgres/.pcppass  << EOF
localhost:9898:pgpool:pgpool
vm141:9898:pgpool:pgpool
vm142:9898:pgpool:pgpool
vm143:9898:pgpool:pgpool
EOF

chmod 600 ~postgres/.pcppass

chown -R postgres:postgres ~postgres

如果开启 watchdog 特性,为了区分哪个主机是哪个主机, 需要一个 pgpool_node_id 文件。 需要创建“ pgpool_node_id ”文件,并指定pgpool (watchdog)节点号 (例如0,1,2…)来唯一标识pgpool(watchdog )主机。

## vm141
echo 0 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

## vm142
echo 1 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

## vm143
echo 2 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

使用YUM安装Pgpool-II时, Pgpool-II配置文件 pgpool.conf 安装在 /etc/pgpool-II 。从Pgpool-II 4.2开始,所有配置参数都是 在所有主机上都一样,以下是pgpool.conf相关参数解析

pgpool配置demo


复用failover.sh.sample、follow_primary.sh.sample

cp -p /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh
cp -p /etc/pgpool-II/sample_scripts/follow_primary.sh.sample /etc/pgpool-II/follow_primary.sh
cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample /etc/pgpool-II/recovery_1st_stage
cp -p /etc/pgpool-II/sample_scripts/escalation.sh.sample /etc/pgpool-II/escalation.sh
cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample /var/lib/pgsql/15/data/pgpool_remote_start
chmod +x /var/lib/pgsql/15/data/pgpool_remote_start
chown postgres:postgres /var/lib/pgsql/ -R
chown postgres:postgres /etc/pgpool-II/ -R


cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample /var/lib/pgsql/15/data/recovery_1st_stage
cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample /var/lib/pgsql/15/data/pgpool_remote_start
cp -p /etc/pgpool-II/sample_scripts/escalation.sh.sample  /etc/pgpool-II/escalation.sh
cp /etc/pgpool-II/sample_scripts/failover.sh.sample  /etc/pgpool-II/failover.sh
cp /etc/pgpool-II/sample_scripts/follow_primary.sh.sample  /etc/pgpool-II/follow_primary.sh
chown -R postgres:postgres /var/lib/pgsql/15/data/{recovery_1st_stage,pgpool_remote_start}   ## postgres用户执行cp 无需再授权
chown -R postgres:postgres /etc/pgpool-II   ## postgres用户执行cp 无需再授权
chmod +x /etc/pgpool-II/*.sh
## 检查配置项目得核心变量是否准确
grep -HnE '^(PGHOME|ARCHIVEDIR|primary_conninfo|REPLUSER|PCP_USER|PGPOOL_PATH|PCP_PORT|REPL_SLOT_NAME|PGUSER_SUPER|PGUSER_SUPER_PWD|PGUSER_SUPER_DBNAME|PGUSER_REPLI|PGUSER_REPLI_PWD)' \
/etc/pgpool-II/failover.sh \
/etc/pgpool-II/follow_primary.sh \
/etc/pgpool-II/escalation.sh \
/var/lib/pgsql/15/data/recovery_1st_stage \
/var/lib/pgsql/15/data/pgpool_remote_start


## 确认与一下路径保持一致
## PGHOME=/usr/pgsql-15
## REPLUSER=repl
## PCP_USER=pgpool
## PGPOOL_PATH=/usr/bin
## PCP_PORT=9898
## ARCHIVEDIR=/var/lib/pgsql/archivedir
## REPLUSER=repl


image.png

## 检查备份参数正确
grep -HnE '/bin/pg_basebackup*' \
/etc/pgpool-II/failover.sh \
/etc/pgpool-II/follow_primary.sh \
/etc/pgpool-II/escalation.sh \
/var/lib/pgsql/15/data/recovery_1st_stage \
/var/lib/pgsql/15/data/pgpool_remote_start

为pg_basebackup 增加参数R
sed -i ‘s|/bin/pg_basebackup|/bin/pg_basebackup -R|g’
/etc/pgpool-II/follow_primary.sh
/var/lib/pgsql/15/data/recovery_1st_stage

检查.pgpass 目录正确

grep -HnE '*passfile*' \
/etc/pgpool-II/failover.sh \
/etc/pgpool-II/follow_primary.sh \
/etc/pgpool-II/escalation.sh \
/var/lib/pgsql/15/data/recovery_1st_stage \
/var/lib/pgsql/15/data/pgpool_remote_start


image.png
对于以上三个文件中得pg_basebackup指令 增加参数 R
image.png

配置escalation.sh

## 修改PGPOOLS、VIP、DEVICE参数值

sed -i 's/^VIP=.*/VIP=10.0.0.144/' /etc/pgpool-II/escalation.sh
sed -i 's/^DEVICE=.*/DEVICE=ens33/' /etc/pgpool-II/escalation.sh
sed -i 's/^PGPOOLS=.*/PGPOOLS=(10.0.0.141 10.0.0.142 10.0.0.143)/' /etc/pgpool-II/escalation.sh
cat  /etc/pgpool-II/escalation.sh

配置pool_hba.conf

cat >> /etc/pgpool-II/pool_hba.conf << EOF
host all postgres 10.0.0.141/32 trust
host all postgres 10.0.0.142/32 trust
host all postgres 10.0.0.143/32 trust
host    replication     all        0/0  md5
host	  all		 all        0/0     md5
EOF

cat  /etc/pgpool-II/pool_hba.conf 

使用PCP命令时,PCP用户名和md5加密密码必须为 在 pcp.conf 中声明 “ username:encrypted password ”。在本例中,我们将PCP用户名设置为“ pgpool ” 密码为“ pgpool ”。 使用pg_md5创建加密的密码条目 pgpool 用户如下所示:

pg_md5 -p -m -u postgres 
password:   ## (输入密码postgres)
pg_md5 -p -m -u pgpool 
password: (输入密码pgpool )

cat /etc/pgpool-II/pool_passwd

image.png

配置pcp.conf文件

echo 'pgpool:'`pg_md5 pgpool` >> /etc/pgpool-II/pcp.conf
cat /etc/pgpool-II/pcp.conf
## 指令的第二个postgres、pgpool为对应用户访问数据库的实际密码

配置pgpool.conf

cat > /etc/pgpool-II/pgpool.conf << 'EOF'
# [CONNECTIONS] 连接相关
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
backend_clustering_mode = 'streaming_replication'

# [BACKEND CONNECTION SETTINGS] 后端节点设置
backend_hostname0 = 'vm141'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/15/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'vm141'

backend_hostname1 = 'vm142'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/15/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'vm142'

backend_hostname2 = 'vm143'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/15/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'vm143'

# [AUTHENTICATION] 认证相关
enable_pool_hba = on
pool_passwd = '/etc/pgpool-II/pool_passwd'

# [LOGS] 日志设置
log_destination = 'stderr'
logging_collector = on
log_directory = '/etc/pgpool-II/log'
log_filename = 'pgpool-%d.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 100MB

# [STREAMING REPLICATION CHECK] 流复制健康检查
sr_check_user = 'postgres'
sr_check_password = ''
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R' 
# 如果使用 Pgpool-II 4.0 或更早版本,则无法指定这些字符。低版本中此参数名为follow_master_command,请注意区分

# [HEALTH CHECK] 健康检查设置
health_check_period = 5
health_check_timeout = 20
health_check_user = 'pgpool'
health_check_password = ''
failover_on_backend_error = on
health_check_max_retries = 3

# [FAILOVER AND FAILBACK] 故障切换与恢复
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'  
# %N 和 %S 是在 Pgpool-II 4.1 中添加的。 请注意,如果使用 Pgpool-II 4.0 或更早版本,则无法指定这些字符。
#Special values:
#%d = 故障节点的 ID
#%h = 故障节点的主机名
#%p = 故障节点的端口号
#%D = 故障节点的数据库集群路径
#%m = 新的主节点(主库)ID
#%H = 新的主节点主机名
#%M = 原主节点的 ID
#%P = 原主节点(Primary 节点)的 ID
#%r = 新主节点的端口号
#%R = 新主节点的数据库集群路径
#%N = 原主节点的主机名
#%S = 原主节点的端口号
#%% = 字符 % 本身

# [ONLINE RECOVERY] 联机恢复
recovery_user = 'postgres'
recovery_password = ''
recovery_1st_stage_command = 'recovery_1st_stage'

# [WATCHDOG] 看门狗设置
use_watchdog = on
hostname0 = 'vm141'
wd_port0 = 9000
pgpool_port0 = 9999
hostname1 = 'vm142'
wd_port1 = 9000
pgpool_port1 = 9999
hostname2 = 'vm143'
wd_port2 = 9000
pgpool_port2 = 9999
wd_ipc_socket_dir = '/tmp'

# [VIRTUAL IP CONTROL] 虚拟IP设置
delegate_ip = '10.0.0.144' ## VIP节点

# [ESCALATION SETTINGS] 主节点提升设置
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
wd_interval = 10
wd_escalation_command = '/etc/pgpool-II/escalation.sh'

# [LIFECHECK SETTINGS] 节点存活检测
wd_lifecheck_method = 'heartbeat'

# [HEARTBEAT MODE] 心跳模式参数
heartbeat_hostname0 = 'vm141'
fheartbeat_port0 = 9694
heartbeat_device0 = ''

heartbeat_hostname1 = 'vm142'
heartbeat_port1 = 9694
heartbeat_device1 = ''

heartbeat_hostname2 = 'vm143'
heartbeat_port2 = 9694
heartbeat_device2 = ''

# [INTERFACE SETTINGS] 网络接口设置
if_cmd_path = '/sbin'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:0' #注意修改网卡名
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33' #注意修改网卡名
arping_path = '/usr/sbin'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33' #注意修改网卡名

EOF

cat /etc/pgpool-II/pgpool.conf

启动pgpool服务(所有节点执行)

sudo systemctl start pgpool.service
sudo systemctl status pgpool.service
sudo systemctl enable pgpool.service

备份从节点(主节点执行)

su - postgres   

psql -h 10.0.0.144  -p 9999 -U pgpool postgres -c "show pool_nodes"
pcp_recovery_node -h 10.0.0.144 -p 9898 -U pgpool -W -n 2

psql -h 10.0.0.144  -p 9999 -U pgpool postgres -c "show pool_nodes"
pcp_recovery_node -h 10.0.0.144 -p 9898 -U pgpool -W -n 1

psql -h 10.0.0.144  -p 9999 -U pgpool postgres -c "show pool_nodes"

## 等价于
psql -U postgres template1 -c 'SELECT pgpool_recovery('recovery_1st_stage', 'vm142', '/var/lib/pgsql/15/data', '5432', 2, '5432', 'vm141');'
psql -U postgres template1 -c 'SELECT pgpool_recovery('recovery_1st_stage', 'vm142', '/var/lib/pgsql/15/data', '5432', 2, '5432', 'vm141');'
psql -h 10.0.0.144  -p 9999 -U pgpool postgres -c "show pool_nodes"
## 此时从节点会自动被拉起来

image.png

recovery之后会出现pgpool状态down 的情况  使用以下指令使其恢复
pcp_attach_node -h 10.0.0.144 -p 9898 -U pgpool -n 1
pcp_attach_node -h 10.0.0.144 -p 9898 -U pgpool -n 2

image.png

切换测试

## 当前主节点停库
pg_ctl stop 
## 几秒中之后可以看到切换成功
psql -h 10.0.0.144  -p 9999 -U pgpool postgres -c "show pool_nodes"

image.png

重新拉起旧主之后,旧的主并不会自动加入集群中,保持其停机状态,使用recovery让其恢复。

pcp_recovery_node -h 10.0.0.144 -p 9898 -U pgpool -W -n 0

plus

三节点为备库

测试过程中发现pcp检测到三个节点都为从库,实际上pg只有vm142(从)、vm141(主)互为主从。

## 拉取vm143加入集群
pcp_detach_node -h 10.0.0.144 -p 9898 -U pgpool  -n 2 -v  

psql -h 10.0.0.144  -p 9999 -U pgpool postgres -c "show pool_nodes"

image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论