GPDB - FTS机制 - FTS进程启动
作为GreenPlum高可用的核心功能,FTS(Fault Tolerance Server)进程负责故障检测。该进程是master上的一个子进程,可以快速检测到primary或者mirror是否宕机,并及时让primary/mirror进行故障切换。如果fts挂掉了,master还会再重新fork出一个。本文说说FTS进程是怎么启动的。
1、FTS进程的启动
FTS进程的入口函数是FtsProbMain。该进程是如何启动的呢?
1)服务启动后,会先开启一个startup进程,即恢复进程,通过StartupXLog回放WAL日志,可以看到当日志回放完退出StartupXLog函数后,会进程proc_exit函数,退出当前进程。
2)需要注意,proc_exit函数最终会调用exit函数,该函数会向主进程发送SIGCHLD(17)信号。这也是代码中发现不了发送SIGCHLD信号代码的原因。
3)主进程PostmasterMain最开始会注册SIGCHLD信号处理函数reaper。
4)reaper函数中通过LookupBackgroundWorkerFunction找到FTS进程入口FtsProbeMain,进入FTS主进程。
如何确定仅master节点才能加载FTS进程呢?
1)PostmasterMain函数调用process_shared_preload_libraries函数前,会调用load_auxiliary_libraries函数注册后台进程。
2)可以看到需要满足启动规则才会注册到BackgroundWorkerList中
3)FTS的启动规则是Gp_role为GP_ROLE_DISPATCH,即master端
这样,结合第一个逻辑图,PostmasterMain->reaper函数从BackgroundWorkerList中取需要启动的进程进行启动,完成FTS的进程启动。