Repmgr功能概述
Repmgr作为由第二象限开发的一款流复制管理工具,具有非常轻量级的使用特性。具体表现为:
配置操作简单,可一键式完成相关部署操作;
支持Auto Failover和Manual Switchover;
分布式管理集群节点,易扩展,可在线增删集群节点;
Repmgr流复制管理系统有repmgr和repmgrd两个命令。其中repmgr命令实现对集群节点的管理,如注册主/备节点、Clone节点,Promote节点,Follow节点以及Switchover操作等;repmgrd命令用来启动repmgr系统的守护进程,用以对集群节点的监控。
下图是Repmgr实现架构图。
Repmgr流复制管理工具对集群节点的管理是基于一个分布式的管理系统。每个节点都有自己的repmgr.conf配置文件,用来记录本节点的ID,节点名称,连接信息,数据库PGDATA目录等配置参数。在配置好这些参数后,就可以通过repmgr命令实现对集群节点的“一键式”部署。
部署完成后,每个节点都有自己的元数据表,记录所有集群节点的信息;每个节点都有自己的repmgrd守护进程来监控节点数据库状态。其中主节点守护进程主要用来监控本节点数据库服务状态,备节点守护进程主要用来监控主节点和本节点数据库服务状态。在发生Auto Failover时,备节点在尝试N次连接主节点失败后,repmgrd会在所有备节点中选举一个候选备节点(选举机制参考以下Tips)提升为新主节点,然后其他备节点去Follow到该新主上,至此,形成一个新的集群状态。
Repmgr高可用功能优化
Repmgr作为流复制管理工具,在高可用方面还有一些不足之处:
内部没有提供对Virtual IP的管理和支持
高可用场景的完善优化
1. Virtual IP的支持
Virtual IP作为应用程序连接集群的“纽带”,是需要绑定在主节点上的,且在集群发生failover时,能够“漂移”到新主节点上。
经过优化后的Repmgr可以提供以下对Virtual IP的支持:
注册主节点时,会绑定Virtual IP
Failover时,原主解绑Virtual IP,新主重新绑定
集群节点重启时,会识别主接点然后绑定Virtual IP
Switchover时,Virtual IP会随主节点进行漂移
针对主节点出现故障,应用程序不能连接数据库服务,可以分为以下三种场景:
网络断开
系统掉电
外部存储掉线
当集群主节点网络断开(网线被拔掉或者网卡坏掉)后, Repmgr原来的机制是:备节点会有N次(配置参数)尝试机会去连接主节点,如果N次连接还是不成功,则Repmgr系统会认为主节点出现故障,开始进行failover。failover过程中,系统会选举一个备节点提升为新主节点,该过程中,Virtual IP也会漂移到新主上去,其他备节点随后去Follow该新主节点。
但是现在需要注意的问题是:如果原来主节点网络恢复后,则它会以一个“非法”的主节点继续存在集群中。
针对该问题对Repmgr进行优化后:
在完成failover过程后,如果原来主节点网络恢复,则repmgrd守护进程会对原来主节点进行降级成备节点,然后重新“node rejoin”到集群里,即原来主节点会变成备节点角色重新加入集群,保证在Failover后,继续维持集群的节点数量。
该场景应用在将数据库数据存储在挂载的外部存储上。当外部存储光纤掉线后,repmgrd守护进程通过检测$PGDATA目录出现故障(只读或写hang住)后,会先停掉当前数据库服务($PGDATA出现问题后,数据库服务依然处于活动状态),以为failover过程做准备。当数据库服务停掉后,failover过程就如掉电等过程一样。
当存储重新挂载或重启系统恢复正常后,原主节点同样会降级成备节点重新加入集群中去。
同异步转换场景的完善
在一主一备集群场景中,把备节点设置为同步备节点能够保证数据的安全可靠性,但是如果备节点如果出现断网或服务停掉的问题,则主节点写操作会hang住。为了解决上述问题,保证业务的连续性,增加了同异步转换的功能。
在备节点出现断网或停服务后,主节点通过walsend进程的状态判断同步备节点是否还正常(如果是断网问题,主节点会等待wal_sender_timeout之后做出判断),在判断备节点出现问题后,repmgrd会再预留timeout时间检测备节点状态。超过timeout备节点没有恢复正常,主节点会通过修改synchronous_standby_names并reload,来完成从同步模式转换为异步模式的过程。
在同步转异步后,如果备节点又恢复正常了,此时会进行恢复为原来的同步模式。具体实现为:在备节点恢复正常后,在catchup主节点的LSN延迟达到一个比较小的值时,主节点同样通过修改synchronous_standby_names参数并reload,这样主节点就完成了从异步模式转换为同步模式的过程。