功能需求:这是一个可选功能,三节点的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。