部署高可用的PostgreSQL一直都是一个比较麻烦的事情,因为官方或者社区并没有一个official的解决方案。由于项目需要,所以花了一些时间去调研并且实践了一些关于PostgreSQL的主流HA方案,包括:Crunchy, Stolon 和 Patroni, 还有就是pgpool+repmgr这种方案。看到网上关于Stolon的blog有一篇,但是那篇其实是翻译人家老外的,结果被到处转发(说明我们还是懒喜欢别人汉化的)。在国内外暂时还没找到Patroni在Kubernetes上部署的Blog。所以这里就简单分享一下,以便大家以后有遇到问题可以相互帮助。
方案选型
几种方案简单比较一下:
- 首先repmgr这种方案的算法有明显缺陷,非主流分布式算法,直接pass;
- Stolon和Patroni相对于Crunchy更加Cloud Native, 后者是基于pgPool实现。
- Crunchy和Patroni相对于Stolon有更多的使用者,并且提供了Operator对于以后的管理和扩容
根据上面简单的比较,最终我选择了Patroni,其实我内心上是更想使用Stolon的,因为它是golang写的,可以顺便学习一下人家的代码。但是其实学golang看kubernetes的源码非常足够了,另外Patroni还可以用operator部署,后期扩展更方便。
架构规划
总体框架是如上图所示,是比较简单的,利用haproxy来做服务发现和代理。PostgreSQL节点之间通过Streaming Sync进行同步。Patroni作为daemon进程用来管理PostgreSQL集群并且定期更新TTL至Kubernetes(也可以使用ETCD作为DCS)。
在我本机上我规划一个Kubernetes集群(1 master和1 minion), 有时候实在是卡,所以就把所有的资源尽量减少了。由于在家没连公司VPN,受限于大天朝墙的影响,直接找了一篇K8S国内的部署方法。具体流程网上都很多教程了,就不介绍了,有问题可以交流。