功能需求:这是一个可选功能,三节点的Patroni、PostgreSQL/Opengauss集群,当主备自动切换时,主节点要设置可读写的浮动IP,备节点要设置只读的浮动IP(也可以不设置)。
为了实现这个功能,也为了对Patroni的影响最小,不对 Patroni 原有代码进行修改,而是另写一个Python程序,与Patroni在同一个节点内,另起一个进程运行。
设计原理就是不断地通过 Patroni 的 REST API 查询本节点的状态。
当本节点的 role 为 master 时,设置本节的为可读写的浮动 IP,当本节的 role 为 replica 时,设置本节的为只读浮动 IP,当查询失败时(例如 Patroni 退出了)禁用这两种浮动 IP 地址。
程序只有一个主线程,以一个循环作为主体,接受patroni.yml作为配置文件,对这个程序的配置参数写在这个文件中。
每次循环查询 curl -s http://127.0.0.1:18008/master
这个程序是 Patroni 目录下的 vipmon.py,在每个节点上启动Patroni后启动。
还有一点要注意,运行 vipmon.py 的用户需要有执行 ifconfig设置ip地址的权限,一般都是给这个用户免密执行sudo ifconfig的权限。
patroni.yml中关于浮动IP的配置项:
mastervip 表示读写(主)节点的浮动 IP 地址,enable:true 表示使能主节点的浮动 IP,设置浮动IP需要三个参数,浮动IP地址、接口名、子网掩码,三个节点需要在一个网段内,浮动IP也只能在网段内浮动。
secondaryvip 表示只读(备)节点的浮动IP地址,enable:false表示禁用备节点浮动IP。