主要观点:作者曾使用 Cockroach DB 做侧项目,因其许可证变更和免费版需强制收集遥测数据而寻找替代方案,最终选择 PostgreSQL,因其数据量不大且普通机器可处理。计划用 Jepsen 测试不同 PostgreSQL 的高可用(HA)解决方案,此系列博客重点关注 PostgreSQL 的 HA 而暂不讨论其必要性。
关键信息:
- 使用 Vagrant 创建 3 节点虚拟机集群并安装 Kubernetes,用于测试不同 HA 解决方案,方便创建 yaml 文件。
- Jepsen 是测试分布式系统正确性的工具,通过运行查询并在结束时检查数据一致性,同时引入内置故障。
- PostgreSQL 本身无原生 HA 解决方案,需借助复制等功能构建,文中以 Patroni 为例进行测试。
- Patroni 配置中关于复制模式的关键参数及其作用,如
synchronous_mode
、synchronous_mode_strict
、synchronous_node_count
等。 - 测试中发现 PostgreSQL 复制存在已知问题,导致在特定场景下违反读已提交隔离性,如事务在未完全复制时被视为已提交,主节点故障转移后会丢失数据。
- 测试中难以重现该问题,需调整连接关闭时机、nemesis 套件、工作负载等参数,且需一定运气,最终成功重现。
- 测试中发现当 3 节点集群仅丢失 1 个节点时,Patroni 无法自动恢复集群,即使满足
synchronous_mode_strict
条件,且经确认这是已知行为。 - 提出改进方式,如设置类似
synchronous_node_count
的选项以强制同步复制计数,根据节点可用性调整可能导致恢复问题。 - 发现 Patroni 文档中关于 Kubernetes Pod 角色标签的命令不准确,理论上可通过主 Pod 设置其他 Pod 的 k8s 标签来修复。
重要细节: - 测试代码位于github 仓库,包括不同的 PostgreSQL 配置和测试脚本等。
- 测试命令及参数的具体说明,如
lein run test
相关参数的作用及设置。 - 测试过程中遇到的各种问题及解决方法,如节点崩溃处理、网络接口名称调整等。
- 不同测试结果的展示及分析,如交易延迟图、测试失败的输出等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。