关键字:KingbaseES、人大金仓、集群故障
1.1、对失效节点的自动恢复流程图:(备库恢复由主库的repmgrd来实现)
主机repmgrd服务监控到节点失效后,会对失效的节点执行自动恢复。如下是备机节点的恢复流程图。
故障节点恢复代码主要流程:
- main():repmgrd启动时候的主函数
- MonitorLoop():监控的Loop函数,在该函数中才最终确定监控的模式是primary、standby还是witness
- MonitorStreamingPrimary():根据数据库节点角色在while中选择合适的监控函数(此处角色是primary)
- while中不断循环监控节点状态:在特定的监控模式下循环监控节点,监控的主要逻辑在该函数中
- CheckOtherNodes():检查其它standby的存活状态,每一轮的监控都会检查本地节点与其它节点的状态。
- pthread_create():如果发现有standby节点出现故障,创建线程去恢复故障的节点
- AutoRecoveryThreadMain():线程执行恢复的主函数
- MonitorStreamingPrimary():根据数据库节点角色在while中选择合适的监控函数(此处角色是primary)
- MonitorLoop():监控的Loop函数,在该函数中才最终确定监控的模式是primary、standby还是witness
RecoveryFailedNode():恢复故障的节点
DoRemoteCommand():在故障服务器上执行具体的恢复命令,真正对故障节点进行恢复
1.2、主机故障后的自动故障恢复
备机repmgrd服务持续监控主机数据库的状态,主机故障后可自动完成故障的转移。每个节点的repmgrd之间是没有通信的,服务监控的对象是Kingbase实例。执行主节点的故障恢复由kbha第三方守护进程来实现。
故障主节点恢复代码主要流程:
- main():kbha的函数入口:对命令进行解析后,根据action的类型调用switch对应的函数
- KbhaActionRunningDaemon():该函数对应的action是KBHA_DAEMON,即守护模式
- while中进行循环守护的监控
- IsKESRunning():判断节点primary是否还存活,如果故障则执行恢复
- RecoveryClusterOnAllFails():执行故障节点的恢复,仅恢复故障的primary节点
- StartDatabase():启动本地的数据库,和恢复standby节点不同,不需要连接到远程服务器后再执行恢复操作。
- KbhaActionRunningDaemon():该函数对应的action是KBHA_DAEMON,即守护模式
总结:需要注意的是,standby节点的故障恢复是由primary节点服务器上的repmgrd守护进程来实现,而primary节点的故障是由kbha第三方守护进程来实现。在kbha监控的每一轮循环中,都会去尝试启动repmgrd(启动的时候会检测该进程是否存在,如果不存在则启动,否则直接返回)。