-
当 primary segment 被 kill 时,mirror 会关闭接收primary 的 wal 的进程。当 master 节点的 fts 进程定期检查,检测到 primary 挂了,更新状态至 FTS_PROBE_FAILED 。
-
在 processResponse 中:在系统表 gp_configuration_history 插入 segment(primary) 与 mirror 的新角色(换角色)记录(这里不需要删除旧记录),并更新系统表索引。然后再更新内存中 ftsProbeInfo 中的节点状态。进入 FTS_PROMOTE_SEGMENT 状态。
-
在 ftsConnect 中开启一个与 mirror 的 GPCONN_TYPE_FTS 类型的连接(ftsConnectStart->connectDBStart)。
-
mirror 的 serverloop 中接收到这个连接请求,会启动一个子进程去处理这个请求 (BackendStartup)
-
在这个进程初始化 (BackendInitialize)时会响应master 的请求(ProcessStartupPacket),master 收到回复进入 FTS_RESPONSE_PROCESSED 状态(processResponse)。当读返回数据时(ftsConnect->PQconnectPoll->pqReadData)。mirror 收到回应,更新ps显示并进入主循环(PostgresMain)。
-
master 发送 “PROMOTE dbid=xxx contid=yyy” 的 query,走 HandleFtsMessage->HandleFtsWalRepPromote->SignalPromote 逻辑通知 postmaster 启动所有后台进程(sigusr1_handler),并回复 postmaster (SendFtsResponse),完成切换。
附:master上 fts 进程的主循环: