一、Patroni集群介绍
patroni是一款运用etcd集群来集群信息、主备状态与配置,通过patroni来检测并且实现自动切换的软件。
运用haproxy+keepalived保持在主备切换或者节点故障后,访问地址、端口对上层不变。使用一套模板化的配置文件来自动搭建初始化数据库流复制集群以及配置数据库。
patroni高可用集群由PostgreSQL、patroni、etcd、haproxy、keepalived组成。
二、组件说明
组件分别的作用(不包括pg数据库):
1.patroni
通过参数文件来配置自动初始化数据库搭建流复制(配置pg参数文件、创建用户、可以配置预加脚本),指定etcd节点等。负责通过一个api接口连接到dcs(分布式存储系统:etcd集群),向其插入键值记录patroni参数、数据库参数、主备信息以及连接信息。平时通过对etcd中信息存储、读取来判断集群的健康状态。在主备切换或者做恢复时通过向etcd读取主备信息来判断各节点的状态进行切换。
2.etcd
最少需要三个节点且为奇数来进行leader选举(脑裂发生时etcd集群会僵死等待恢复,不会发生都认为自己是主的情况)。在各个节点上同步健康状态信息以及数据库节点的主备状态与连接、配置信息。平常会对其余etcd节点做时间同步检测。
3.haproxy&keepalived
haproxy可以代理主库节点,并统一由其所在节点的5000端口发出。Keepalived负责产生虚拟ip和虚拟ip漂移,数据库发生主备切换或者节点故障后,访问地址对上层不变。
三、Patroni流程

Patroni自动创建主备流复制集群并且通过api接口往etcd读取以及更新键值
Etcd进行时间同步检测与存储键值信息
patroni通过连接etcd读取信息对其它节点做检测,每loop_wait(参数)秒一次
patroni通过连接到etcd集群,向其插入键值记录patroni参数、数据库参数、主备信息以及连接信息。进行数据库的主备切换时通过向etcd拿取键值中储存的主备信息来判断各节点的状态来切换。各节点会在data目录下生成recovery.done(与recovery.conf一样,里面的primary_conninfo记录是上一次主节点的连接信息),原主节点发生切换时自动改变后缀为recovery.conf,原备节点会删除掉自身的recovery.conf文件,再通过pg_rewind来快速恢复节点,不需要做基础备份。
异步流复制时主从之间延时:主从之间wal日志延时超过maximum_lag_on_failover(byte)的大小,主备有可能会重启但不会发生切换。数据丢失量通过maximum_lag_on_failover,ttl,loop_wait三个参数控制。最坏的情况下的丢失量:maximum_lag_on_failover字节+最后的TTL秒时间内写入的日志量(loop_wait/2 在平均情况下)。
haproxy+keeplived保持对外的访问ip端口不变
四、优点
自动检测主备状态进行切换
统一模板配置
在上图最基本的架构中,任意down一个etcd节点或者任意一个patroni节点、数据节点,通过转换都能使集群继续运行下去。测试中有针对于三个etcd网络互不通做了脑裂测试,故障发生后etcd集群会僵死等待恢复,不会发生都认为自己是主的情况。主库会变成只读状态,恢复网络后,主、备继续用etcd的数据信息恢复到故障前的状态,etcd也恢复正常。
在线添加etcd、patroni节点以及数据节点
支持同步异步流复制,级联流复制
异步流复制可设置最小丢失数据量
使用pg_rewind进行恢复,缩短恢复时间
haproxy+keeplived可以保持在主备切换或者节点故障后,实现ip漂移。对外的ip+端口不变
五、限制
需要至少三个以上且为奇数的etcd节点
底层基于的是流复制
大部分参数都需要通过更改etcd中键值来修改
因故障发生的未提交的事物会回滚,会话需要客户端重新发起连接
扫码关注了解更多文章





