☰
PostgreSQL流复制+pgpool高可用部署实战指南
2026/11/4 3:00:33 网站建设 项目流程

简介:本资源是一份面向数据库运维工程师与PostgreSQL高可用架构实践者的完整技术方案文档,聚焦PostgreSQL主从流复制与pgpool-II协同构建生产级高可用数据库集群。内容系统覆盖流复制原理(WAL日志实时同步、同步/异步模式对比)、pgpool-II核心能力(连接池管理、自动故障切换、读写分离与负载均衡)及全链路部署实操,包含环境准备、主备库配置、pgpool参数调优、健康检查与故障模拟等关键环节。资源为单个773KB的Word文档(.docx),结构清晰,含四章二十余节,含版本控制表、详细目录、hosts与sysctl配置示例、防火墙与SELinux关闭指引等实用细节,便于按步骤复现和工程落地。目前已有472人学习下载,适合中高级DBA快速掌握PostgreSQL高可用架构设计与实施要点。

1. PostgreSQL主从流复制+pgpool高可用方案:一套跑不通就等于没装的生产级组合

你不是在装两个工具,而是在搭一条数据生命线——主库一宕,备库秒切;读请求暴增,自动分流;误删表?归档日志+时间点恢复兜底。这套「PostgreSQL流复制 + pgpool-II」组合,在某高校核心教务系统、某实验室科研数据平台、某跨平台系统中已稳定运行超3年。但现实很骨感:90%的人卡在第6章“配置流复制”——pg_hba.conf少写一行host replication,主从连不上;剩下10%栽在pgpool启动后show pool_nodes;始终显示down,查日志只看到no pg_hba.conf entry for host,却死活找不到是哪个节点的pg_hba.conf漏配了。更玄学的是:CentOS 7.5上用pgpool-II 4.1.1跑得好好的,换到RHEL 8.4,watchdog模块直接报bind: Address already in use,因为systemd默认占了9000端口。这不是配置文档能救的,是血泪经验堆出来的路径。本文不讲原理,只讲你手抖按错一个参数、文件权限少加一个-R、recovery.signal和standby.signal混用版本时,怎么快速定位、回滚、重来。适合正在部署生产环境、被客户催着上线、且不允许试错三次以上的运维/DBA/全栈工程师。

2. 环境准备与系统调优:先让Linux“松开手脚”,再谈数据库

装PostgreSQL和pgpool前,操作系统得先“点头同意”。很多翻车不是数据库配错了,而是Linux拦住了它——SELinux静默拒绝socket绑定、防火墙吞掉9000(pgpool)和5432(PostgreSQL)端口、ulimit -n太小导致连接池撑不住200个并发。这一章干三件事:关掉所有可能挡路的默认策略、把资源上限调到够用、确保主备节点时间差<1秒。别跳,跳了后面pgpool watchdog心跳失败、walsender连接超时全是这儿埋的雷。

2.1 关闭防火墙与SELinux:生产环境也得“裸奔”一次

提示:这是临时调试手段。生产环境应改用firewalld放行端口(5432, 9000, 9898, 11000),而非直接关闭。但首次部署,关掉最省心。

# 永久关闭firewalld(CentOS 7+/RHEL 7+) sudo systemctl stop firewalld sudo systemctl disable firewalld # 永久关闭SELinux(修改配置文件后必须重启) sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # ⚠️ 注意:此操作需重启生效,当前会话仍为enforcing,但后续启动即disabled

为什么必须关?
pgpool-II的watchdog进程需要在节点间通过UDP广播心跳(默认端口9000),SELinux默认策略会拦截udp_socket的name_bind操作;而firewalld若未显式放行9898(pcp服务端口)和11000(health check端口),pgpool集群状态永远是down。我一般会在/etc/hosts配好主机名后,立刻执行getenforce确认返回Disabled,再继续。

2.2 网络与时间同步:主备之间不能有“时差”

主备节点网络必须互通,且/etc/hosts要双向解析——这点极易被忽略。比如主库IP是192.168.10.10,主机名pg-master;备库IP是192.168.10.11,主机名pg-standby。那么两台机器的/etc/hosts都必须包含:

192.168.10.10 pg-master 192.168.10.11 pg-standby

时间同步必须用chrony而非ntpd(RHEL/CentOS 7+默认):

# 主节点作为chrony server echo "bindcmdaddress 127.0.0.1" | sudo tee -a /etc/chrony.conf echo "bindcmdaddress ::1" | sudo tee -a /etc/chrony.conf echo "allow 192.168.10.0/24" | sudo tee -a /etc/chrony.conf sudo systemctl restart chronyd # 备节点指向主节点 sudo sed -i '/^server/d' /etc/chrony.conf echo "server pg-master iburst" | sudo tee -a /etc/chrony.conf sudo systemctl restart chronyd

验证是否同步成功:

chronyc tracking # 查看偏移量(Offset),理想值 < 10ms chronyc sources -v # 查看源状态,*号表示当前同步源

为什么不用ntpdate?
ntpdate是单次校准,无法持续纠偏;而chronyd支持平滑调整时钟,避免时间跳变导致WAL日志序列错乱——这在流复制中是致命伤。

2.3 内核参数调优:给PostgreSQL“松绑”

PostgreSQL对共享内存和信号量极其敏感。默认kernel.shmmax(最大共享内存段)常为32MB,而PostgreSQL 12+建议至少2GB。不调?初始化数据库时直接报could not create shared memory segment。

# 编辑 /etc/sysctl.conf,追加以下参数 echo "kernel.shmmax = 2147483648" | sudo tee -a /etc/sysctl.conf echo "kernel.shmall = 524288" | sudo tee -a /etc/sysctl.conf echo "kernel.sem = 250 32000 100 128" | sudo tee -a /etc/sysctl.conf echo "vm.swappiness = 1" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.tcp_keepalive_time = 600" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.tcp_keepalive_intvl = 30" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.tcp_keepalive_probes = 10" | sudo tee -a /etc/sysctl.conf # 生效配置 sudo sysctl -p

参数说明:

  • shmmax=2147483648:2GB,足够PostgreSQL 12+的shared_buffers设为1GB
  • sem:信号量数组,250 32000 100 128对应SEMMSL SEMMNS SEMOPM SEMMNI,满足高并发连接需求
  • vm.swappiness=1:强制Linux尽量不使用swap,避免PostgreSQL内存页被换出导致性能雪崩

2.4 用户与目录权限:postgres用户不是“摆设”

PostgreSQL要求postgres用户拥有数据目录的完全控制权,且不能是root。常见错误是chown -R postgres:postgres /data/pg12后忘了chmod 700——备库pg_basebackup会因权限不足拒绝写入。

# 创建postgres用户(若不存在) sudo useradd -r -m -U -d /var/lib/pgsql -s /bin/bash -c "PostgreSQL Server" postgres # 创建数据目录并赋权(以/data/pg12为例) sudo mkdir -p /data/pg12 sudo chown -R postgres:postgres /data/pg12 sudo chmod 700 /data/pg12 # 验证:切换用户后能进入目录 sudo -u postgres ls -ld /data/pg12 # 应输出 drwx------. 2 postgres postgres ...

关键细节:

  • -r参数创建系统用户,UID<1000,符合PostgreSQL安全规范
  • 数据目录绝对不能放在/home或/tmp下,前者可能被userdel误删,后者在重启后清空
  • 权限必须是700,755会导致pg_basebackup报错could not open file "global/pg_control"

3. PostgreSQL安装与初始化:主库和备库的“同源基因”

PostgreSQL主从流复制的核心前提是:主库和备库必须是同一套二进制、同一份数据快照的“克隆体”。这意味着——主库安装完,备库不能自己再编译一遍,而是用pg_basebackup从主库拉取。本章只装主库,但会提前规划备库路径,确保二者结构一致。版本选PostgreSQL 12.2(文档指定)而非13+,因为pgpool-II 4.1.1对13+的pg_stat_replication视图兼容性有坑。

3.1 依赖安装与源码编译:离线环境的“自给自足”

文档强调“客户RHEL环境不能联网”,因此必须提前下载所有RPM依赖。PostgreSQL 12.2在RHEL 7.5上需以下基础包:

# RHEL 7.5必备依赖(离线安装包列表) # gcc gcc-c++ make zlib-devel readline-devel openssl-devel perl-ExtUtils-Embed # libxml2-devel libxslt-devel python3-devel tcl-devel # 若已下载RPM包到/tmp/rpms,批量安装 sudo rpm -ivh /tmp/rpms/gcc-*.rpm /tmp/rpms/gcc-c++-*.rpm /tmp/rpms/make-*.rpm \ /tmp/rpms/zlib-devel-*.rpm /tmp/rpms/readline-devel-*.rpm /tmp/rpms/openssl-devel-*.rpm \ /tmp/rpms/perl-ExtUtils-Embed-*.rpm

为什么不用yum install?
因为客户环境无外网,yum install会失败。必须用RHEL安装环境获取脚本(文档附件)提前缓存所有依赖RPM,再离线安装。我一般会把rpm -qa | grep -E "(gcc|readline|zlib)"结果存为deps-list.txt,作为下次打包依据。

3.2 源码编译安装:可控、可审计、可复现

PostgreSQL官方推荐源码安装,尤其在生产环境。二进制包常含多余组件,而源码可精准裁剪。

# 下载postgresql-12.2.tar.gz到/opt/src,解压 cd /opt/src tar -xzf postgresql-12.2.tar.gz cd postgresql-12.2 # 配置编译选项(关键:--prefix指定安装路径,--with-openssl启用SSL) ./configure --prefix=/usr/local/pgsql12 \ --with-openssl \ --with-python \ --with-perl \ --with-tcl \ --with-libxml \ --with-libxslt \ --enable-dtrace # 编译并安装(-j$(nproc)加速) make -j$(nproc) sudo make install # 创建软链接,方便后续升级 sudo ln -sf /usr/local/pgsql12 /usr/local/pgsql

参数深挖:

  • --with-openssl:必选!否则流复制无法启用SSL加密传输(虽非强制,但生产环境必须)
  • --enable-dtrace:启用动态追踪,便于后续性能分析(如pg_stat_statements深度监控)
  • --prefix=/usr/local/pgsql12:版本化路径,避免与系统自带PostgreSQL冲突

3.3 环境变量设置:让postgres用户“认得清家门”

PostgreSQL的pg_ctl、psql等命令必须在PATH中,且PGDATA必须指向数据目录。这些必须对postgres用户生效,而非仅当前shell。

# 编辑postgres用户的~/.bash_profile echo 'export PATH=/usr/local/pgsql/bin:$PATH' | sudo tee -a /var/lib/pgsql/.bash_profile echo 'export PGHOME=/usr/local/pgsql' | sudo tee -a /var/lib/pgsql/.bash_profile echo 'export PGDATA=/data/pg12' | sudo tee -a /var/lib/pgsql/.bash_profile echo 'export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH' | sudo tee -a /var/lib/pgsql/.bash_profile # 生效配置(切换用户后验证) sudo -u postgres source /var/lib/pgsql/.bash_profile sudo -u postgres which psql # 应返回 /usr/local/pgsql/bin/psql

为什么不用/etc/profile?
因为pgpool进程常以postgres用户启动,它读取的是用户级profile,而非系统级。/etc/profile对sudo -u postgres无效。

3.4 初始化数据库:主库的“第一次心跳”

初始化生成global/pg_control文件,这是PostgreSQL的“DNA”。必须由postgres用户执行,且PGDATA目录必须为空。

# 切换用户并初始化 sudo -u postgres /usr/local/pgsql/bin/initdb -D /data/pg12 -E UTF8 --locale=C -U postgres # 验证初始化结果 sudo -u postgres ls -l /data/pg12/global/pg_control # 应存在且大小约8KB

关键参数释义:

  • -D /data/pg12:指定数据目录,必须与PGDATA环境变量一致
  • -E UTF8:数据库默认编码,中文环境必选UTF8
  • --locale=C:避免区域设置导致索引排序异常(如zh_CN.UTF-8在某些场景下引发复制延迟)
  • -U postgres:指定超级用户,后续流复制用户将从此用户派生

4. PostgreSQL流复制配置:主库“发号施令”,备库“唯命是从”

流复制的本质是主库的walsender进程向备库的walreceiver进程实时推送WAL日志。配置分三步:主库开放复制通道、备库拉取初始数据、双方建立信任连接。12.x版本后,备库不再需要recovery.conf,所有配置收归postgresql.conf——这是新手最容易混淆的点。

4.1 主库配置:打开“数据闸门”

主库的postgresql.conf需开启WAL归档、设置复制参数,并允许远程连接。注意:修改后必须重启,pg_reload_conf()不生效。

# 编辑 /data/pg12/postgresql.conf(用postgres用户) sudo -u postgres vi /data/pg12/postgresql.conf

在文件中取消注释并修改以下参数:

# ----------------------------- # WRITE AHEAD LOG # ----------------------------- wal_level = replica # 必须为replica(12.x)或logical(需逻辑复制) archive_mode = on # 启用归档(为pg_rman备份铺路) archive_command = 'cp %p /data/pg12/archive/%f && chmod 644 /data/pg12/archive/%f' # 归档命令 max_wal_senders = 10 # 最大walsender进程数,主从各需1个,留余量 wal_keep_segments = 64 # 保留64个WAL段,防备库断连时日志被覆盖 # ----------------------------- # REPLICATION # ----------------------------- listen_addresses = 'localhost,pg-master' # 必须包含主机名,供备库连接 port = 5432 max_connections = 200 # 主库连接数需大于pgpool连接池总和 superuser_reserved_connections = 5 password_encryption = scram-sha-256 # 强制SCRAM加密,兼容pgpool认证 # ----------------------------- # CLIENT AUTHENTICATION # ----------------------------- # 此处不配,由pg_hba.conf统一管理

为什么wal_level=replica?
replica模式提供物理复制所需的所有WAL信息,而hot_standby=on(备库参数)依赖于此。logical模式用于逻辑复制,与本方案无关。

4.2 主库访问控制:pg_hba.conf是“门禁系统”

pg_hba.conf定义谁能在何时以何种方式连接。流复制需要两类连接:一是replication用户连接主库拉取WAL,二是postgres用户连接执行管理命令。

# 编辑 /data/pg12/pg_hba.conf,追加以下规则(放在local规则之后) # TYPE DATABASE USER ADDRESS METHOD host replication repuser 192.168.10.11/32 scram-sha-256 host all all 192.168.10.0/24 scram-sha-256 host all all 127.0.0.1/32 scram-sha-256

关键点:

  • 第一行专为流复制:replication数据库名是固定关键字,repuser是待创建的复制用户,192.168.10.11是备库IP
  • scram-sha-256是PostgreSQL 10+默认密码加密方式,pgpool 4.1.1完全兼容;若用md5,pgpool连接时会报password authentication failed
  • 所有规则必须/32精确匹配,/24网段规则仅用于应用连接,不可用于复制

4.3 创建复制用户:repuser不是“普通用户”

复制用户需REPLICATION权限,且密码必须用SCRAM加密存储。

# 启动主库(首次) sudo -u postgres /usr/local/pgsql/bin/pg_ctl -D /data/pg12 -l /data/pg12/logfile start # 连接并创建用户 sudo -u postgres psql -c "CREATE USER repuser WITH REPLICATION ENCRYPTED PASSWORD 'RepPass123!';"

验证用户权限:

sudo -u postgres psql -c "\du repuser" # 输出中应含 "Replication"

4.4 备库初始化:pg_basebackup是“克隆手术刀”

备库不能自己initdb,必须从主库拉取完整数据快照。此过程会自动创建standby.signal文件(12.x+),取代旧版recovery.conf。

# 在备库机器上执行(确保备库已安装相同版本PostgreSQL二进制) # 先创建空数据目录 sudo mkdir -p /data/pg12 sudo chown -R postgres:postgres /data/pg12 sudo chmod 700 /data/pg12 # 从主库拉取(-h指定主库主机名,-U指定复制用户,-D指定备库数据目录) sudo -u postgres /usr/local/pgsql/bin/pg_basebackup \ -h pg-master -U repuser -D /data/pg12 \ -P -X stream -R -C -S pg-standby

参数详解:

  • -P:显示进度
  • -X stream:流式传输WAL,避免归档延迟
  • -R:自动生成standby.signal和postgresql.auto.conf(含primary_conninfo)
  • -C:在主库创建复制槽(replication slot),防止WAL被过早清理
  • -S pg-standby:复制槽名称,必须唯一,建议用备库主机名

执行后,备库/data/pg12/postgresql.auto.conf内容应类似:

primary_conninfo = 'user=repuser password=RepPass123! host=pg-master port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any' primary_slot_name = 'pg-standby'

4.5 备库配置:只需微调,静待同步

备库的postgresql.conf只需确保hot_standby=on(允许只读查询),其他参数继承自主库快照。

# 编辑备库的/data/pg12/postgresql.conf sudo -u postgres vi /data/pg12/postgresql.conf

确认以下参数已设置(通常pg_basebackup -R已写入):

# ----------------------------- # STANDBY SERVERS # ----------------------------- hot_standby = on # 允许备库接受SELECT查询 max_standby_streaming_delay = 30s # 流复制延迟超30秒则取消查询,防长事务阻塞

为什么max_standby_streaming_delay=30s?
避免备库上长时间运行的SELECT阻塞WAL应用,导致主从延迟飙升。生产环境建议30-60秒。

5. 常见问题排查:主从连不上、状态down、WAL堆积的3个血泪现场

流复制配置后,ps aux | grep wal看不到walsender或walreceiver进程?pgpool show pool_nodes;显示down?别急着重装,先看这三条高频翻车路径。每条都是我亲手踩过、救过火的真问题。

5.1 现象:pg_basebackup报错could not connect to server: Connection refused

原因:
主库postgresql.conf中listen_addresses未包含pg-master,或pg_hba.conf未放行备库IP,或主库根本没启动。

解决:

  1. 在主库执行sudo -u postgres netstat -tlnp | grep 5432,确认LISTEN状态且Address为*:5432或pg-master:5432
  2. 检查/data/pg12/postgresql.conf中listen_addresses是否含pg-master(不是IP!)
  3. 检查/data/pg12/pg_hba.conf中host replication repuser 192.168.10.11/32是否在local规则之后,且无拼写错误
  4. sudo -u postgres pg_ctl -D /data/pg12 status确认主库运行中

5.2 现象:备库pg_stat_replication视图为空,ps aux | grep walreceiver无进程

原因:
备库standby.signal文件缺失或损坏,或primary_conninfo中的密码错误,或主库防火墙拦截了5432端口。

解决:

  1. ls -l /data/pg12/standby.signal确认文件存在(12.x+必需,10.x用recovery.conf)
  2. cat /data/pg12/postgresql.auto.conf | grep primary_conninfo,检查password=后的值是否与主库创建repuser时一致(注意特殊字符需转义)
  3. 在备库执行telnet pg-master 5432,若连接失败,则主库防火墙或listen_addresses配置错误
  4. 查看备库日志tail -f /data/pg12/logfile,搜索FATAL,常见如password authentication failed for user "repuser"

5.3 现象:主库WAL日志堆积在pg_wal/目录,pg_ls_waldir()显示大量000000010000000000000001等文件

原因:
备库宕机或网络中断,主库因wal_keep_segments不足或复制槽(replication slot)未启用,导致WAL无法被回收。

解决:

  1. 首先确认备库是否存活:ps aux | grep postgres | grep startup(备库应有startup进程)
  2. 若备库宕机,立即在主库执行SELECT * FROM pg_replication_slots;,确认active列为f(不活跃)
  3. 紧急清理:SELECT pg_drop_replication_slot('pg-standby');删除失效槽位,WAL将被自动回收
  4. 重启备库后,重新执行pg_basebackup(加-C参数重建槽位)
  5. 长期方案:增大wal_keep_segments至128,并监控pg_replication_slots的restart_lsn是否滞后

6. pgpool-II安装与配置:让应用“看不见”主从切换

pgpool-II是整个方案的“大脑”,它隐藏主从拓扑,对外提供单一连接入口。安装本身简单,但配置pgpool.conf是成败关键——参数错一个,show pool_nodes;就永远是down。本章聚焦4.1.1版本(文档指定),避坑点:backend_hostname必须用/etc/hosts解析的主机名,health_check_period不能设为0,sr_check_period必须小于health_check_period。

6.1 pgpool-II安装:源码编译,版本锁死

pgpool-II 4.1.1需匹配PostgreSQL 12.x头文件,必须用相同源码编译。

# 下载pgpool-II-4.1.1.tar.gz到/opt/src,解压 cd /opt/src/pgpool-II-4.1.1 # 配置(--with-pgsql-includedir指向PostgreSQL头文件) ./configure --prefix=/usr/local/pgpool41 \ --with-pgsql-includedir=/usr/local/pgsql/include \ --with-pgsql-libdir=/usr/local/pgsql/lib \ --with-openssl \ --enable-watchdog # 编译安装 make -j$(nproc) sudo make install # 创建软链接 sudo ln -sf /usr/local/pgpool41 /usr/local/pgpool

为什么--enable-watchdog?
watchdog是pgpool集群的“心跳监护人”,负责检测节点存活、触发VIP漂移。无此选项,多节点高可用形同虚设。

6.2 主库安装pgpool函数:让pgpool“读懂”PostgreSQL

pgpool需要在PostgreSQL中安装一组管理函数,如failover_callback、follow_master_command。这些函数必须在主库执行,且需postgres用户权限。

# 切换到pgpool源码目录(含sql文件) cd /opt/src/pgpool-II-4.1.1/src/sql # 在主库执行安装脚本 sudo -u postgres psql -f pgpool-recovery.sql template1 sudo -u postgres psql -f pgpool-regclass.sql template1 sudo -u postgres psql -f pgpool-regclass.sql postgres

验证安装:

sudo -u postgres psql -c "\df *pgpool*" # 应列出pgpool_recovery, pgpool_regclass等函数

6.3 pgpool环境变量:让pcp命令“找到家”

pcp是pgpool的管理命令,必须配置PCPPASSWORD环境变量才能免密操作。

# 编辑postgres用户~/.bash_profile echo 'export PATH=/usr/local/pgpool/bin:$PATH' | sudo tee -a /var/lib/pgsql/.bash_profile echo 'export PCPPASSWORD="PcpPass123!"' | sudo tee -a /var/lib/pgsql/.bash_profile # 生效 sudo -u postgres source /var/lib/pgsql/.bash_profile

为什么PCPPASSWORD?
pcp_node_info、pcp_detach_node等命令需连接pgpool的PCP服务(默认9898端口),密码明文存储在~/.pcppass不安全,环境变量更可控。

6.4 pgpool主配置:pgpool.conf是“宪法文件”

pgpool.conf是pgpool的核心,4.1.1版本中backend_hostname、health_check_period、sr_check_period三者关系是灵魂。

# 复制模板并编辑 sudo cp /usr/local/pgpool/etc/pgpool.conf.sample /usr/local/pgpool/etc/pgpool.conf sudo vi /usr/local/pgpool/etc/pgpool.conf

关键参数(主库配置):

# ----------------------------- # CONNECTIONS # ----------------------------- listen_addresses = 'localhost,pg-master' # 必须含主机名,供应用连接 port = 9999 # pgpool监听端口,应用连接此端口 pcp_listen_addresses = '*' # PCP服务监听所有地址 pcp_port = 9898 backend_hostname0 = 'pg-master' # 节点0主机名(必须与hosts一致) backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/data/pg12' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = 'pg-standby' # 节点1主机名 backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/data/pg12' backend_flag1 = 'ALLOW_TO_FAILOVER' # ----------------------------- # HEALTH CHECK # ----------------------------- health_check_period = 10 # 每10秒检查节点健康 health_check_timeout = 20 health_check_user = 'postgres' health_check_password = 'your_postgres_password' # 主库postgres用户密码 # ----------------------------- # STREAMING REPLICATION # ----------------------------- sr_check_period = 5 # 每5秒检查流复制状态(必须 < health_check_period) sr_check_user = 'postgres' sr_check_password = 'your_postgres_password' # ----------------------------- # FAILOVER & FAILOVER CALLBACK # ----------------------------- failover_command = '/usr/local/pgpool/failover.sh %H %R %P %D %m %M %H %h %r %t %s %p %c %C %N %n %S %s %T %t %U %u %V %v %W %w %X %x %Y %y %Z %z' follow_master_command = '/usr/local/pgpool/follow_master.sh %H %R %P %D %m %M %H %h %r %t %s %p %c %C %N %n %S %s %T %t %U %u %V %v %W %w %X %x %Y %y %Z %z' # ----------------------------- # WATCHDOG # ----------------------------- use_watchdog = on trusted_servers = 'pg-master,pg-standby' wd_hostname = 'pg-master' wd_port = 9000 wd_priority = 100

参数逻辑链:

  • health_check_period=10:每10秒ping节点
  • sr_check_period=5:每5秒查pg_stat_replication确认主从同步状态
  • failover_command:主库宕机时执行的脚本,负责VIP漂移、更新pgpool.conf等
  • wd_hostname:本节点watchdog服务绑定的主机名,必须与/etc/hosts一致

7. pgpool-II启动与验证:从show pool_nodes;到VIP漂移的全流程

装完不等于跑通。本章带你走完最后一步:启动pgpool、验证节点状态、模拟故障、观察VIP漂移。重点不是“能不能连”,而是“故障时会不会自动切”——这才是高可用的终极检验。

7.1 启动pgpool并检查进程

pgpool必须以postgres用户启动,且pgpool.conf路径需明确指定。

# 创建日志目录 sudo mkdir -p /var/log/pgpool sudo chown -R postgres:postgres /var/log/pgpool # 启动pgpool(-n前台运行,-f指定配置文件,-D守护进程模式) sudo -u postgres /usr/local/pgpool/bin/pgpool -n -f /usr/local/pgpool/etc/pgpool.conf -F /usr/local/pgpool/etc/pcp.conf > /var/log/pgpool/pgpool.log 2>&1 & # 检查进程 ps aux | grep pgpool # 应看到 pgpool, pgpool_child, watchdog 进程

验证watchdog是否启动:

# 查看watchdog日志 sudo -u postgres tail -f /var/log/pgpool/pgpool.log | grep watchdog # 正常输出应含 "watchdog started" 和 "other watchdog is alive"

7.2 连接测试:用psql验证pgpool代理能力

应用连接pgpool的9999端口,而非直接连PostgreSQL的5432。

# 在任意客户端(如主库机器)执行 psql -h pg-master -p 9999 -U postgres testdb # 在pgpool中执行 testdb=# show pool_nodes; node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | last_status_change ---------+-----------+------+--------+-----------+---------+------------+-------------------+-------------------+--------------------- 0 | pg-master | 5432 | up | 0.500000 | primary | 12 | true | 0 | 2023-10-01 10:00:00 1 | pg-standby| 5432 | up | 0.500000 | standby | 8 | false | 0 | 2023-10-01 10:00:00 (2 rows)

关键字段解读:

  • status=up:节点健康
  • role=primary/standby:角色正确
  • load_balance_node=true:只有true的节点会接收SELECT查询

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询