## 前言 FTS(Fault Tolerance Serve)是GreenPlum中的故障检测服务,是保证GP高可用的核心功能。GreenPlum的Segment的健康检测及HA是由GP Master实现的,GP Master上面有个专门的进程–FTS进程,它可以快速检测到Primary或者Mirror是否挂掉,并及时作出Primary/Mirror 故障切换。如果FTS挂掉了,Master将会重新fork出来一个FTS进程。 ![](https://oss.showapi.com/doc/2096/74/a9158515-1d40-421c-b1f2-bd3115f58a33.png) ## FTS实现原理 GP Master上面的FTS进程每隔60s(时间可以配置)向Primary或者Mirror发送心跳包,Primary和Mirror收到心跳包后返回它们的当前状态,FTS进程心跳包的发送状态和Segment返回状态更新元信息和作出故障切换。因为Segment可能很多,为了加快检测速度,FTS是多线程的,默认16个线程。 ![](https://oss.showapi.com/doc/2096/74/b7ec2868-e0d2-4fff-a3d3-b0487f53bdc7.png) 实现检测方法的源码大致如下: ~~~ while (!probeGetIpAddr(&probeInfo) || !probeOpenSocket(&probeInfo) || !probeMarkSocketNonBlocking(&probeInfo) || !probeConnect(&probeInfo) || !probeSend(&probeInfo) || !probeReceive(&probeInfo) || !probeProcessResponse(&probeInfo)) { probeClose(&probeInfo); if (retryCnt == gp_fts_probe_retries) { write_log("FTS: failed to probe segment (content=%d, dbid=%d) after trying %d time(s), " "maximum number of retries reached.", probeInfo.segmentId, probeInfo.dbId, retryCnt); break; } /* sleep for 1 second to avoid tight loops */ pg_usleep(USECS_PER_SEC); retryCnt++; //other code } ~~~ ## Segment检测及故障切换 GP Master首先会检测Primary状态,如果Primary不可连通,那么将会检测Mirror状态,Primary/Mirror状态总共有4种: 1. Primary活着,Mirror活着。GP Master探测Primary成功之后直接返回,进行下一个Segment检测; 2. Primary活着,Mirror挂了。GP Master探测Primary成功之后,通过Primary返回的状态得知Mirror挂掉了(Mirror挂掉之后,Primary将会探测到,将自己变成ChangeTracking模式),这时候更新Master元信息,进行下一个Segment检测; 3. Primary挂了,Mirror活着。GP Master探测Primary失败之后探测Mirror,发现Mirror是活着,这时候更新Master上面的元信息,同时使Mirror接管Primary(故障切换),进行下一个Segment检测; 4. Primary挂了,Mirror挂了。GP Master探测Primary失败之后探测Mirror,Mirror也是挂了,直到重试最大值,结束这个Segment的探测,也不更新Master元信息了,进行下一个Segment检测。 ![](https://oss.showapi.com/doc/2096/74/4ded9dbb-5c3b-43a2-bf23-21fba2ee761e.png) ## 参数配置 ### gp_fts_probe_threadcount 用来故障检测的线程数量,默认为16。 ### gp_fts_probe_interval 两次检测的时间间隔,默认为60s。如果一次检测时间使用10s,那么剩余50s将会sleep;如果超过60s,将会直接进入下一次检测。 ### gp_fts_probe_timeout 检测Segment超时时间,默认值: 20。 ### gp_fts_probe_retries 检测Segment失败重试次数,如果超过这个次数,将会认为当前节点挂掉,默认值: 5。 ### gp_segment_connect_timeout Prmary和Mirror文件同步允许连接Mirror最大超时时间,如果达到这个超时时间,Primary将会认为Mirror挂掉了,默认值: 180s。 ## 总结 通过GreenPlum FTS机制学习,可以了解部分MPP架构高可用原理。同时根据自身的业务,合理地配置FTS参数,保障GP高可用。