Patroni:复制模式
1. 异步与同步复制模式配置
Patroni 作为 PostgreSQL 高可用解决方案,提供了灵活的复制模式配置选项,包括异步复制和多种同步复制模式。这些模式在数据一致性、可用性和性能之间提供了不同的权衡选择。
1.1 异步复制模式
异步复制是 Patroni 的默认配置模式,它提供了最佳的性能但可能面临数据丢失的风险。在异步模式下,主节点确认事务提交后立即返回给客户端,而不等待备节点确认接收。
1.1.1 异步复制配置
在 Patroni 的 YAML 配置文件中,异步复制是默认行为,无需特殊配置。但可以通过以下参数优化异步复制行为:
bootstrap:
dcs:
maximum_lag_on_failover: 1048576 # 最大允许的WAL延迟(字节)
loop_wait: 10 # HA循环间隔(秒)
retry_timeout: 10 # 重试超时时间(秒)
ttl: 30 # 领导锁TTL(秒)
异步复制的工作流程如下:
1.1.2 异步复制特点
| 特性 | 描述 | 影响 |
|---|---|---|
| 低延迟 | 事务立即确认 | 最佳性能 |
| 数据风险 | 可能丢失已提交事务 | RPO > 0 |
| 故障转移 | 基于 WAL 位置选择最佳备节点 | 快速故障转移 |
| 网络容忍 | 对网络波动不敏感 | 高可用性 |
1.2 同步复制模式
Patroni 支持多种同步复制模式,确保数据在多个节点上持久化后才确认事务提交。
1.2.1 基本同步复制配置
要启用同步复制,需要在 Patroni 配置中添加以下参数:
bootstrap:
dcs:
synchronous_mode: true
synchronous_node_count: 1
synchronous_mode_strict: false
postgresql:
parameters:
synchronous_commit: "on"
synchronous_standby_names: "*"
1.2.2 同步复制模式类型
Patroni 支持三种同步复制模式:
- 标准同步模式 (synchronous_mode: true)
- 严格同步模式 (synchronous_mode_strict: true)
- 仲裁提交模式 (synchronous_mode: "quorum")
1.2.2.1 标准同步模式
bootstrap:
dcs:
synchronous_mode: true
synchronous_node_count: 1
在此模式下,Patroni 确保至少指定数量的备节点确认接收 WAL 后才提交事务。
1.2.2.2 严格同步模式
bootstrap:
dcs:
synchronous_mode: true
synchronous_mode_strict: true
synchronous_node_count: 1
严格模式下,如果没有可用的同步备节点,主节点将拒绝写入操作,确保绝对的数据一致性。
1.2.2.3 仲裁提交模式
bootstrap:
dcs:
synchronous_mode: "quorum"
synchronous_node_count: 2
仲裁模式需要指定数量的节点中的大多数确认事务,提供更好的性能和容错性。
1.2.3 同步复制配置参数
| 参数 | 描述 | 默认值 | 示例 |
|---|---|---|---|
synchronous_mode | 同步模式开关 | false | true,"quorum" |
synchronous_node_count | 同步节点数量 | 1 | 2,3 |
synchronous_mode_strict | 严格模式 | false | true |
maximum_lag_on_syncnode | 同步节点最大延迟 | -1 | 1048576 |
1.2.4 节点标签与优先级配置
Patroni 允许通过标签系统精细控制节点的同步行为:
tags:
nosync: false # 是否排除在同步候选外
sync_priority: 1 # 同步优先级(0-100)
nofailover: false # 是否禁止故障转移
replicatefrom: node1 # 指定复制源
1.2.5 同步节点选择算法
Patroni 使用以下算法选择同步节点:
1.2.6 配置示例对比
三节点集群异步配置
# postgres0.yml (主节点)
bootstrap:
dcs:
ttl: 30
loop_wait: 10
maximum_lag_on_failover: 1048576
postgresql:
parameters:
synchronous_commit: "local"
三节点集群同步配置
# postgres0.yml (主节点)
bootstrap:
dcs:
synchronous_mode: true
synchronous_node_count: 1
synchronous_mode_strict: false
postgresql:
parameters:
synchronous_commit: "on"
synchronous_standby_names: "FIRST 1 (node1, node2)"
tags:
sync_priority: 100
1.2.7 动态配置变更
Patroni 支持运行时动态修改同步配置:
# 启用同步模式
patronictl edit-config --force -s 'synchronous_mode=true' mycluster
# 修改同步节点数量
patronictl edit-config --force -s 'synchronous_node_count=2' mycluster
# 切换到仲裁模式
patronictl edit-config --force -s 'synchronous_mode=quorum' mycluster
1.3 监控与故障处理
1.3.1 同步状态监控
-- 查看同步复制状态
SELECT application_name, sync_state, sync_priority, replay_lag
FROM pg_stat_replication;
-- 查看同步提交状态
SELECT name, setting FROM pg_settings
WHERE name LIKE 'synchronous%';
1.3.2 常见问题处理
- 同步节点不可用
# 临时禁用严格模式
patronictl edit-config --force -s 'synchronous_mode_strict=false' mycluster
- 网络分区处理
# 检查集群状态
patronictl list mycluster
# 手动故障转移
patronictl failover mycluster --candidate node2
- 性能调优
postgresql:
parameters:
synchronous_commit: "remote_write" # 平衡性能与耐久性
wal_writer_delay: 10ms # 调整WAL写入延迟
1.3.3 最佳实践建议
- 生产环境部署
- 使用至少 3 个节点确保高可用性
- 配置 synchronous_node_count: 2 用于关键业务
- 启用 synchronous_mode_strict: true 确保数据一致性
- 混合模式配置
# 主节点配置
synchronous_mode: true
synchronous_node_count: 1
# 备节点差异化标签
tags:
- sync_priority: 100 # 优先同步节点
- sync_priority: 50 # 次级同步节点
- nosync: true # 异步节点
- 多数据中心部署
# 本地同步,远程异步
synchronous_standby_names: 'FIRST 1 (local_node1, local_node2)'
tags:
- sync_priority: 100 # 本地节点高优先级
- sync_priority: 1 # 远程节点低优先级
- nosync: true # 跨数据中心节点异步
通过合理配置异步和同步复制模式,Patroni 能够在数据一致性、系统可用性和性能之间找到最佳平衡点,满足不同业务场景的需求。