检测失效的Segment

检测失效的Segment

如果启用了镜像,Greenplum数据库会在主Segment宕机后自动故障转移到一个镜像Segment上。由于每一部分数据只有一个Segment实例在线,用户可能不会意识到有一个Segment宕机了。如果故障发生时有一个事务正在进行中,该事务会回滚并且自动在重新配置好的Segment集合上重启。

如果整个Greenplum数据库系统由于一个Segment失效(例如,如果没有启用镜像或者没有足够的Segment在线以访问全部用户数据)而变得无法运转,用户在尝试连接到数据库时会看到错误。返回给客户端程序的错误可能表明失效。例如:

ERROR: All segment databases are unavailable

如何检测和管理Segment失效

在Greenplum数据库的Master主机上,Postgres的postmaster进程会派生一个故障探测进程ftsprobe。它有时也被称作FTS(容错服务器)进程。如果FTS失败,postmaster进程会重启它。

FTS运行在一个循环中,每两次循环之间有一个睡眠间隔。在每一次循环时,FTS会通过向Segment数据库建立一个TCP套接字连接来探测每一个主Segment数据库,连接时使用注册在gp_segment_configuration表中的主机名和端口。如果连接成功,Segment会执行一些简单的检查并且回报给FTS。这些检查包括在关键的Segment目录上执行一次stat系统调用以及检查Segment实例的内部故障。如果没有检测到问题,一个正面反馈会被发送给FTS并且不会为该Segment数据库采取行动。

如果无法建立连接或者在超时后没有收到一个回复,则会重试。如果失败的探测次数超过配置的最大次数,FTS会探测该Segment的镜像以确保它正常,然后更新gp_segment_configuration表标记主Segment为"down",并且设置该镜像作为主Segment运行。FTS会在gp_configuration_history中更新被执行的操作。

当只有一个活动的主Segment并且相应的镜像宕机时,该主Segment会进入到"Change Tracking Mode"。在这种模式中,对该Segment的更改会被记录,这样可以同步镜像而无需把主Segment的完整数据复制给镜像Segment。

gprecoverseg工具被用来把一个宕机的镜像恢复过来。默认情况下,gprecoverseg执行一次增量恢复,把该镜像置于resync模式中,这会开始把主Segment记录的更改在镜像上进行重放。如果不能完成增量恢复,恢复会失败并且应该重新以-F选项运行gprecoverseg来执行完全恢复。这会导致主Segment把所有的数据都复制给镜像。

gp_segment_configuration表中,对于每个Segment可以看到"change tracking"、"resync"或者"in-sync"三种模式,还可以看到"up"或"down"两种状态。

gp_segment_configuration表还有两个列rolepreferred_role。它们的值可以是表示主Segment的p或者表示镜像Segment的m.role列显示该Segment数据库的当前角色,而preferred_role显示该Segment的原始角色。在一个平衡的系统中,所有Segment的rolepreferred_role都是匹配的。当它们不匹配时,就可能有每台硬件主机上活动主Segment数量造成的倾斜。为了重新平衡该集群并且让所有的Segment回到它们的首选角色,可以用-r选项运行gprecoverseg命令。

这里是影响FTS行为的服务器配置参数集合:
gp_fts_probe_threadcount
用于探测Segment的线程数。默认:16
gp_fts_probe_interval
多长时间开始一次新的FTS循环,以秒计。例如如果设置是60并且探测循环本身需要10秒,FTS处理会睡眠50秒。如果该设置是60并且探测循环需要75秒,FTS进程睡眠0秒。默认值是60,最大值是3600。
gp_fts_probe_timeout
在Master和Segment之间的探测超时时长,以秒计。默认值是20,最大值是3600。
gp_fts_probe_retries
尝试探测一个Segment的次数。例如如果该设置是5,在第一次尝试失败后将会有4次重试。默认值:5
gp_log_fts
FTS的日志级别。值可能是"off"、"terse"、"verbose"或者"debug"。"verbose"设置可以被用在生产环境中为排查问题提供有用的数据。"debug"设置不应该被用在生产中。默认值:"terse"
gp_segment_connect_timeout
允许一个镜像做出响应的最大时间(以秒计)。默认:180

除了FTS执行的故障检查之外,如果一个主Segment无法把数据发送给其镜像,它可以把该镜像的状态改成down。主Segment把数据放在队列中,并且在经过了gp_segment_connect_timeout秒后(表示一个镜像失效)导致镜像被标记为down而且主Segment进入到变更追踪模式。