postgresql ⾄今都没有特别流⾏的⾼可⽤⽅案,之前介绍过两种⾼可⽤⽅案,如下:
pgpool-ii⽅案: postgresql 流复制 pgpool-ii 实现⾼可⽤ ha
keepalived⽅案:keepalived postgresql 流复制⽅式实现⾼可⽤ ha
以上两种⽅案都能实现基本的 postgresql ⾼可⽤,当主库宕机时,备库能正常接管,但存在⼀些不⾜。
pgpool-ii⽅案
故障切换时并不会判断备库与主库存在的数据差异,这块逻辑需要⾃定义。
性能下降明显,根据之前的只读场景测试,⼤概降幅有20%,详⻅pgpool-ii 流复制模式压⼒测试。
⾃动化程度不⾼,例如备库实例挂掉后不会⾃动拉起,主备切换后,需⼈⼯介⼊将⽼的主库进⾏⻆
⾊转换。
keepalived⽅案
程序移值性不好,不⽅便部署和安装。
⾃动化程度不⾼,例如备库实例挂掉后不会⾃动拉起,主备切换后,需⼈⼯介⼊将⽼的主库进⾏⻆
⾊转换。
patroni etcd ⽅案优点
最近在在看基于 patroni etcd 的⾼可⽤⽅案,此⽅案使⽤patroni管理本地库,并结合etcd作为数据存储
和主节点选举,具有以下优势:
健壮性: 使⽤分布式key-value数据库作为数据存储,主节点故障时进⾏主节点重新选举,具有很强
的健壮性。
⽀持多种复制⽅式: 基于内置流复制,⽀持同步流复制、异步流复制、级联复制。
⽀持主备延迟设置: 可以设置备库延迟主库wal的字节数,当备库延迟⼤于指定值时不做故障切换。
⾃动化程度⾼: 1)⽀持⾃动化初始postgresql实例并部署流复制; 2)当备库实例关闭后,⽀持⾃动拉
起; 3)当主库实例关闭后,⾸先会尝试⾃动拉起; 4)⽀持switchover命令,能⾃动将⽼的主库进⾏⻆⾊
转换。
避免脑裂: 数据库信息记录到 etcd 中,通过优化部署策略(多机房部署、增加实例数)可以避免脑
裂。
patroni 简介
patroni基于python开发的模板,结合dcs(例如 zookeeper, etcd, consul )可以定制postgresql⾼可⽤⽅
案。
patroni并不是⼀套拿来即⽤的postgresql⾼可⽤组件,涉及较多的配置和定制⼯作。
patroni接管postgresql数据库的启停,同时监控本地的postgresql数据库,并将本地的postgresql数据
库信息写⼊dcs。
patroni的主备端是通过是否能获得 leader key 来控制的,获取到了leader key的patroni为主节点,其它的
为备节点。
etcd 简介
etcd是⼀款基于raft算法和协议开发的分布式 key-value 数据库,基于go语⾔编写,patroni监控本地的
postgresql状态,并将相关信息写⼊etcd,每个patroni都能读写etcd上的key,从⽽获取外地postgresql
数据库信息。
当etcd的leader节点不可⽤时,etcd会⼀致性的选择⼀个合适的节点作为主节点,新的etcd主节点将获取
leader key,因此建议etcd集群为三个以上且为奇数的节点,不建议部署在同⼀个机房,有条件话尽量部
署在三个机房。
⼀个标准的3节点etcd集群,最⼤容许1个节点故障。
评论