Patroni:复制模式

31 阅读4分钟

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(秒)

异步复制的工作流程如下:

mermaid

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同步模式开关falsetrue,"quorum"
synchronous_node_count同步节点数量12,3
synchronous_mode_strict严格模式falsetrue
maximum_lag_on_syncnode同步节点最大延迟-11048576
1.2.4 节点标签与优先级配置

Patroni 允许通过标签系统精细控制节点的同步行为:

tags:
  nosync: false           # 是否排除在同步候选外
  sync_priority: 1        # 同步优先级(0-100)
  nofailover: false       # 是否禁止故障转移
  replicatefrom: node1    # 指定复制源
1.2.5 同步节点选择算法

Patroni 使用以下算法选择同步节点:

patroni 复制-2

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 常见问题处理
  1. 同步节点不可用
# 临时禁用严格模式
patronictl edit-config --force -s 'synchronous_mode_strict=false' mycluster
  1. 网络分区处理
# 检查集群状态
patronictl list mycluster

# 手动故障转移
patronictl failover mycluster --candidate node2
  1. 性能调优
postgresql:
  parameters:
    synchronous_commit: "remote_write"  # 平衡性能与耐久性
    wal_writer_delay: 10ms              # 调整WAL写入延迟
1.3.3 最佳实践建议
  1. 生产环境部署
    • 使用至少 3 个节点确保高可用性
    • 配置 synchronous_node_count: 2 用于关键业务
    • 启用 synchronous_mode_strict: true 确保数据一致性
  2. 混合模式配置
# 主节点配置
synchronous_mode: true
synchronous_node_count: 1

# 备节点差异化标签
tags:
  - sync_priority: 100  # 优先同步节点
  - sync_priority: 50   # 次级同步节点  
  - nosync: true        # 异步节点
  1. 多数据中心部署
# 本地同步,远程异步
synchronous_standby_names: 'FIRST 1 (local_node1, local_node2)'

tags:
  - sync_priority: 100    # 本地节点高优先级
  - sync_priority: 1      # 远程节点低优先级
  - nosync: true          # 跨数据中心节点异步

通过合理配置异步和同步复制模式,Patroni 能够在数据一致性、系统可用性和性能之间找到最佳平衡点,满足不同业务场景的需求。