简介
在greenplum数据库中master节点有一个专属进程Fault Tolerance Service (FTS: 容错服务),其主要功能是检测所有segment节点的健康信息,如果其检测到segment节点的primary出现异常[硬件故障/宕机],会在第一时间将其对应的mirror提升为新的primary,以保证系统业务的不断运行,实现高可用。[ greenplum架构知识:greenplum架构介绍。
实现原理
FTS进程不断轮询每个segment上的primarry,向其发送探活消息,如果在规定的时间内收到对应primary的ACK响应,则表明其在线==健康;如果没有收到ACK相应,则会进行重发,超过尝试次数后仍未果,则会将对应的mirror 提升为primary以保证服务的不间断运行,最后会更新系统 表gp_segment_configuration元数据信息,因为 Dispatcher会根据此信息创建gangs ,segment上的执行计划由primary来完成,而gang 是不同segment 上同一个slice的集合。
正常情况下,FTS通过读取系统表 gp_segment_configuration获取集群所有QE中每一对primary-mirror 的健康状态信息,以表明是否在线或者下线, 信息如下图:
工作流程
1 FTS在每次轮询中会经历如下四个步骤(源码后期讲解):
- ftsConnect()
- ftsPoll()
- ftsSend()
- ftsReceive()
- processRetry()
- processResponse()
FTS进程通过TCP/IP方式与每个segment的primary(或mirror 发生故障迁移)节点进行连接。然后发送请求已等待响应。一旦接收到响应会跟系统表 gp_segment_configuration 和gp_configuration_history相关信息,同时也会更新相应的内存数据结构。
2 FTS
在PostgresMain 循环中,
- Probe // 探活
- Sync // 同步
- Promote // 提升
3 触发FTS探活途径
1 )探活时长超过配置参数 gp_fts_probe_interval 会触发新的探活周期 internal
2 )查询分发器 Dispatcher触发,即下发执行计划生成gang internal
3 )用户手动执行 gp_request_fts_probe_scan() 函数命令 external
4 轮询图解
Two main scenarios to consider:
1) Allowing multiple probes both internal and external to reuse the same results
when appropriate (ie: piggybacking on previous results). This is depicted as
requests 1, 2, and 3 which should share the same results since they request
before the start of a new fts loop, and after the results of the previous probe
- that is in the lower portion.
在特定场合内部途径和外部途径会重用相同结果,如图中的request1,request2和request3,因其均为在
同一term的loop请求。
2) Ensuring fresh results from an external probe. This is depicted as request
4 incoming during a current probe in progress. This request should get fresh
results rather than using the current results (ie: "piggybacking").
可以通过外部手段获取实时系统转态信息,图中的request4便会完整的执行完整个探活过程,因此获取的
segment健康状态信息是实时准确的
Our implementation addresses these concerns with a probe start tick and probe
end tick. We send a signal requesting fts results, then wait for a new loop to
start, and then wait for that current loop to finish.