明白了,您希望第一篇文章的所有内容合并在一起,不分段输出。以下是修改后的第一篇文章完整版:
PostgreSQL 高可用集群核心配置参数全解:从原生流复制到 Patroni 企业级方案
PostgreSQL(常简称 PG/psql)的高可用集群,核心基础是物理流复制主从架构,逻辑和 Redis 主从高度相似:主节点负责所有写操作,生成 WAL 预写日志(相当于每一笔账务流水);从节点实时接收并重放 WAL,保持和主节点数据一致,同时可承接只读查询。原生 PG 仅支持手动故障切换,生产级自动高可用通常配合 Patroni+etcd/consul 实现。下面分两部分逐参数详解,每个参数都讲清作用、默认值、配置建议和大白话含义。
一、原生 PostgreSQL 流复制核心配置(高可用基础)
所有核心参数都在postgresql.conf中配置,PG 12 及以后版本取消了独立的recovery.conf,原恢复类参数全部整合进postgresql.conf,通过数据目录下的standby.signal空文件标识从节点身份。
(一)主节点核心配置
主节点是 WAL 日志的产生方,配置决定了复制能力、一致性级别和容灾兜底能力。
1. WAL 日志基础配置(复制的前提)
这是开启主从复制的基础门槛,参数配错复制根本跑不起来。
wal_level:作用为设置 WAL 日志的记录级别,级别越高日志里的信息越全,支持的功能越多。可选值为minimal/replica/logical,默认值为replica(PG 10+)。配置建议为物理流复制高可用必须设为replica;如果需要做表级逻辑复制,设为logical。大白话理解:相当于账本的详细程度。minimal只记最精简的内容,没法用来对账复制;replica足够支持完整的主从同步;logical还额外记录表结构信息,支持单表同步。
wal_buffers:作用为 WAL 日志的内存缓冲区大小,写操作先写缓冲区,再刷到磁盘。默认值为自动计算(通常为shared_buffers的 1/32,最小 32KB)。配置建议为高并发写场景建议设为 16MB~64MB,减少磁盘 IO。大白话理解:相当于总监手边的临时便签本,写的账先记在便签上,攒一批再抄到正式账本里。
full_page_writes:作用为开启后,每次检查点后第一次修改页面时,会把整个数据页写入 WAL,防止数据库崩溃时出现 “部分写” 导致数据损坏。默认值为on。配置建议为高可用场景必须保持开启,是数据可靠性的基础保障。
2. 复制发送能力配置
控制主节点能支持多少个从节点、保留多久的日志、超时判定规则。
max_wal_senders:作用为主节点最多同时运行的 WAL 发送进程数,也就是最多支持多少个并发的从节点 / 备份客户端。默认值为10。配置建议为至少设置为「从节点数量 + 预留备份用数量」,比如一主两从建议设为 5,留有余量。大白话理解:相当于总监手下有多少个专门负责给助理传流水的通讯员,每个助理对应一个通讯员。
max_replication_slots:作用为最大复制槽数量。复制槽是 PG 的核心机制,它会记录从节点当前同步到的位置,保证主节点不会删掉从节点还没收到的 WAL 日志。默认值为10。配置建议为至少等于从节点数量,建议比实际从节点数多 2~3 个预留。大白话理解:相当于给每个助理单独开一个 “流水专属账户”,总监绝对不会扔掉助理还没收到的流水单,哪怕助理请假好几天。比固定保留日志量更精准,是高可用强烈推荐开启的机制。
wal_keep_size:作用为主节点在 pg_wal 目录中保留的 WAL 日志总大小,用于应对从节点短暂断连后补数据。默认值为0(不额外保留,仅满足检查点需求)。配置建议为普通场景设为 1GB~4GB;网络不稳定、从节点经常短暂断连的场景可以设到 8GB。版本说明:PG 13 之前对应参数是wal_keep_segments,按段计数,每段默认 16MB。大白话理解:总监手头保底保留最近的一堆流水单,助理短时间离开回来还能补上。但如果离开太久,流水单超出保留量,就只能重新复印整本账本(全量备份重建)。
max_slot_wal_keep_size:作用为单个复制槽最多允许占用的 WAL 空间,防止从节点长期下线导致主节点 WAL 日志堆积爆盘。默认值为-1(不限制)。配置建议为生产环境建议设为 8GB~16GB,超过阈值后复制槽会失效,避免磁盘占满。大白话理解:给每个助理的 “专属账户” 设上限,助理请假太久不领流水,就不再无限期保留,防止把仓库堆满。
wal_sender_timeout:作用为主节点多久没收到从节点的心跳反馈,就断开连接释放资源。默认值为60s。配置建议为网络差的环境可以适当调大,避免频繁断连重连。
3. 数据一致性与同步模式配置
这是高可用的核心参数,直接决定了 “主节点宕机会不会丢数据” 和 “写入性能” 的权衡。
synchronous_commit:作用为事务提交时,需要等待到哪个阶段才给客户端返回成功,决定了复制是异步还是同步。可选值按可靠性从低到高、性能从高到低分别为:off(不等 WAL 刷盘就返回,性能最高,宕机可能丢数据,不建议生产用)、local(只等主节点本地 WAL 刷盘就返回,默认值,异步复制标准配置)、remote_write(等主节点本地刷盘 + 从节点收到 WAL 并写入操作系统缓存就返回)、on(等主节点本地刷盘 + 从节点 WAL 刷盘完成才返回,标准同步复制级别)、remote_apply(等主节点本地刷盘 + 从节点 WAL 重放完成、数据可查才返回,一致性最高,延迟最大)。配置建议为普通业务优先用默认local(异步复制),性能最好,极端情况丢极少量数据;金融、支付等零数据丢失场景,设为on或remote_apply,配合同步从节点使用。大白话理解:相当于总监给客户回执的时机——异步模式:总监自己记完账就说 “办妥了”,助理那边慢慢同步;同步模式:必须等助理也把账记到自己本子上,总监才说 “办妥了”,绝对不会丢账,但慢一点。
synchronous_standby_names:作用为指定哪些从节点作为同步从节点,和synchronous_commit配合实现同步复制。语法示例为FIRST 1 (standby1, standby2)表示选列表里第一个健康的从节点当同步节点。默认值为空(全部为异步从节点)。配置建议为同步复制场景下,至少指定 1 个同步从节点,其余为异步从节点,兼顾可靠性和性能。
4. 归档兜底配置(容灾必备)
流复制是实时同步,归档是离线兜底,用于极端故障下的时间点恢复。
archive_mode:作用为开启 WAL 归档模式,将写满的 WAL 段文件复制到归档目录。默认值为off。配置建议为高可用集群必须开启,作为流复制之外的第二重数据保障。
archive_command:作用为具体的归档命令,PG 会自动把 WAL 文件通过该命令复制到指定位置。示例为archive_command = 'cp %p /data/pg_archive/%f'。配置建议为归档目录建议放在独立磁盘或对象存储上,不要和数据目录同盘。
5. 基础网络与权限配置
listen_addresses:作用为指定 PG 监听的 IP 地址,默认只监听本地,从节点无法连接。配置建议为高可用场景设为*或指定业务网段 IP,同时配合防火墙控制访问。
pg_hba.conf复制权限:作用为控制哪些 IP 可以用复制用户连接主节点,是很多新手容易遗漏的配置。必须添加的条目为host replication replicator 192.168.1.101/32 md5,其中replicator是专门创建的复制用户,需要授予REPLICATION权限。
(二)从节点核心配置
从节点的核心职责是连接主节点、接收并重放 WAL、对外提供只读服务。
1. 身份标识(PG 12+)
在从节点的数据目录下创建一个空文件standby.signal,PG 启动时检测到这个文件,就会以从节点(备用模式)运行。当从节点被提升为主节点时,该文件会自动删除。注:PG 11 及更早版本通过recovery.conf文件中的standby_mode = on标识,新版本已废弃。
2. 主库连接配置
primary_conninfo:作用为从节点连接主节点的连接字符串,包含主库地址、端口、复制用户名、密码等信息。示例为primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=xxx application_name=standby1'。大白话理解:告诉助理 “总监的办公室在哪、进门密码是什么、你叫什么名字”。
primary_slot_name:作用为指定从节点使用的复制槽名称,需要和主节点上创建的复制槽对应。配置建议为开启复制槽的高可用集群必须配置,避免主节点误删 WAL 导致同步中断。
3. 热备只读配置
hot_standby:作用为开启后,从节点在恢复过程中也能对外提供只读查询服务,是读写分离的基础。默认值为off。配置建议为高可用集群必须开启,让从节点承接读流量,提升整体性能。大白话理解:相当于助理一边同步记账,一边还能给大家查账,不用等全部同步完才干活。
4. 复制冲突与超时配置
max_standby_streaming_delay:作用为当从节点上的查询和 WAL 重放发生冲突时(比如查询正在读某行,主节点删了这行),最多等待多久再取消查询。默认值为30s。配置建议为从节点查询多、长 SQL 多的场景可以调大,比如 300s,减少查询被中断的概率,但会增加同步延迟。大白话理解:助理正在帮人查账,这时总监发来了新的修改命令。可以等查询完再改,但不能无限等,超时了就先打断查询,优先同步新数据。
wal_receiver_timeout:作用为从节点多久没收到主节点的 WAL 数据,就判定主节点失联,尝试重连。默认值为60s。配置建议为和主节点的wal_sender_timeout匹配即可。
5. 故障切换与特殊场景配置
recovery_target_timeline:作用为指定恢复的时间线,故障切换后新主节点会生成新的时间线。默认值为latest。配置建议为保持默认latest,确保从节点能自动跟随故障转移后的新主节点。
promote_trigger_file:作用为指定一个触发文件,当从节点检测到该文件被创建时,自动提升为主节点,用于手动故障切换。示例为promote_trigger_file = '/data/pgdata/trigger_failover'。大白话理解:给助理留一个 “升职暗号”,看到这个文件,就自动升级成新总监。
recovery_min_apply_delay:作用为设置从节点延迟重放 WAL 的时间,比如延迟 1 小时。默认值为0(无延迟)。配置建议为用于防误操作场景,比如主库误删表,延迟从节点还没同步,可以快速恢复数据。属于特殊高可用兜底配置。
6. 归档恢复配置
restore_command:作用为从节点从归档目录拉取 WAL 文件的命令,当流复制跟不上时,会先从归档补数据。示例为restore_command = 'cp /data/pg_archive/%f %p'。配置建议为开启归档的集群建议配置,作为流复制的补充,减少全量重建的概率。
二、生产级自动高可用:Patroni 核心配置参数
原生 PG 主从只能手动切换主节点,故障时写服务会中断,不算真正的高可用。企业级方案 90% 以上采用Patroni + etcd/consul 架构:etcd 负责分布式选主,Patroni 负责监控 PG 状态、自动故障检测、秒级主从切换。Patroni 配置文件为 YAML 格式,核心参数如下:
1. 集群基础标识:name: pg-node1表示当前节点名称,集群内唯一;scope: pg-ha-cluster表示集群名称,同一个集群所有节点必须一致;namespace: /service/表示在etcd中的存储路径前缀。
2. 分布式协调(DCS)配置:以 etcd 为例,用于节点间状态同步和领导者选举。配置示例为etcd: hosts: [192.168.1.10:2379, 192.168.1.11:2379, 192.168.1.12:2379]。生产环境 etcd 必须至少 3 节点,保证半数以上存活即可选主。
3. 故障检测与切换时效(RTO 核心参数):这三个参数直接决定了主节点宕机后多久触发自动切换。loop_wait为 Patroni 主循环检测间隔,默认 10 秒,每 10 秒检查一次 PG 健康状态。ttl为主节点在 etcd 中锁的有效期,默认 30 秒,主节点超时未续租就会被判定失效,触发重新选主。retry_timeout为操作 etcd 和 PG 的重试超时,默认 10 秒。必须满足的公式为loop_wait + 2 * retry_timeout <= ttl,否则会出现误判和频繁切换。primary_start_timeout为主节点故障后等待多久确认无法恢复再触发切换,默认 300 秒,设为 0 则检测到故障立即切换,RTO 最低但可能误切换。大白话理解:相当于考勤制度,每隔 10 分钟查一次岗(loop_wait),总监 30 分钟没签到(ttl)就默认缺席,立刻选新总监。
4. 主从选举规则(RPO 核心参数):maximum_lag_on_failover单位为字节,参与主节点选举的从节点最大允许的同步延迟,超过这个值的从节点不能被选为新主,防止切换后丢太多数据。配置建议为异步复制场景建议设为 1MB~10MB,平衡切换成功率和数据丢失量。
5. 同步复制模式:synchronous_mode为是否开启同步复制模式,可选off/on/quorum,开启后 Patroni 会自动管理synchronous_standby_names,保证同步节点数量。synchronous_mode_strict为严格同步模式,没有可用同步从节点时阻塞主节点所有写入,保证零数据丢失。synchronous_node_count为同步从节点的数量,默认 1 个。
6. PostgreSQL 实例管理:配置示例为postgresql: listen: 0.0.0.0:5432; connect_address: 192.168.1.100:5432; data_dir: /data/pgdata; pg_ctl: /usr/pgsql-15/bin/pg_ctl; authentication: replication: {username: replicator, password: xxx}; superuser: {username: postgres, password: xxx}。Patroni 会自动管理 PG 的核心参数、复制槽和主从关系,无需手动配置。
三、高可用配置最佳实践
- 异步复制优先,按需用同步:绝大多数业务异步复制足够,性能好、运维简单;只有强一致性要求的核心业务才开同步复制。
- 复制槽必开,配合上限保护:复制槽能大幅减少同步中断概率,但一定要设置
max_slot_wal_keep_size,防止从节点离线打爆主节点磁盘。 - 归档是最后一道防线:无论主从做的多完善,WAL 归档一定要开,配合定期全量备份,应对删库、数据损坏等极端场景。
- 故障切换时效按需调整:核心业务可以调小
ttl和loop_wait加快切换,但要注意网络波动可能导致误切换;非核心业务可以调大,提升稳定性。