关于 Patroni 的 Jepsen 测试:一种 PostgreSQL 高可用性解决方案 | 王斌

主要观点:作者曾使用 Cockroach DB 做侧项目,因其许可证变更和免费版需强制收集遥测数据而寻找替代方案,最终选择 PostgreSQL,因其数据量不大且普通机器可处理。计划用 Jepsen 测试不同 PostgreSQL 的高可用(HA)解决方案,此系列博客重点关注 PostgreSQL 的 HA 而暂不讨论其必要性。
关键信息

  • 使用 Vagrant 创建 3 节点虚拟机集群并安装 Kubernetes,用于测试不同 HA 解决方案,方便创建 yaml 文件。
  • Jepsen 是测试分布式系统正确性的工具,通过运行查询并在结束时检查数据一致性,同时引入内置故障。
  • PostgreSQL 本身无原生 HA 解决方案,需借助复制等功能构建,文中以 Patroni 为例进行测试。
  • Patroni 配置中关于复制模式的关键参数及其作用,如synchronous_modesynchronous_mode_strictsynchronous_node_count等。
  • 测试中发现 PostgreSQL 复制存在已知问题,导致在特定场景下违反读已提交隔离性,如事务在未完全复制时被视为已提交,主节点故障转移后会丢失数据。
  • 测试中难以重现该问题,需调整连接关闭时机、nemesis 套件、工作负载等参数,且需一定运气,最终成功重现。
  • 测试中发现当 3 节点集群仅丢失 1 个节点时,Patroni 无法自动恢复集群,即使满足synchronous_mode_strict条件,且经确认这是已知行为。
  • 提出改进方式,如设置类似synchronous_node_count的选项以强制同步复制计数,根据节点可用性调整可能导致恢复问题。
  • 发现 Patroni 文档中关于 Kubernetes Pod 角色标签的命令不准确,理论上可通过主 Pod 设置其他 Pod 的 k8s 标签来修复。
    重要细节
  • 测试代码位于github 仓库,包括不同的 PostgreSQL 配置和测试脚本等。
  • 测试命令及参数的具体说明,如lein run test相关参数的作用及设置。
  • 测试过程中遇到的各种问题及解决方法,如节点崩溃处理、网络接口名称调整等。
  • 不同测试结果的展示及分析,如交易延迟图、测试失败的输出等。
阅读 10
0 条评论