检测故障的Segment
如果启用了镜像,Greenplum数据库会在主Segment宕机后自动故障转移到一个镜像Segment上,镜像Segment承担
主Segment的角色和职能,故障主Segment变成镜像,用户感觉不到segment产生了故障。当故障出现时,正在进行中
的事务会回滚并在新的segment上自动重新开始。[gpstate](../../../utility_guide/admin_utilities/gpstate.html#topic1)
工具可以用来分辨故障segment。该工具显示的系统表信息包括[gp_segment_configuration](../../../ref_guide/system_catalogs/gp_segment_configuration.html)
。
如果整个Greenplum数据库系统由于一个Segment故障(例如,如果没有启用镜像或者没有足够的Segment在线 以访问全部用户数据)而变得无法运转,用户在尝试连接到数据库时会看到错误。返回给客户端程序的错误可能表明 失效。例如:
ERROR: All segment databases are unavailable
segment故障如何被监测和管理
在Greenplum数据库master主机上,Postgres的postmaster
进程会创建一个错误侦测子进程
ftsprobe
。该进程也被称为FTS (Fault Tolerance Server)进程。如果FTS进程出现故障,
postmaster
会重启该进程。
FTS进程循环执行,每个循环之间会停顿一会。每一个循环中,FTS都会从gp_segment_configuration
系统表中获取每一个主segment实例的主机名和端口号,并通过与其建立TCP套接字连接的方式连接segment实例
来侦测segment的状态。如果成功连接,segment会执行一些简单的检查并报告给FTS。该检查包括在关键的segment
目录上执行一个stat
系统调用,并且会检查segment实例的内部错误。如果没有检测到问题,FTS会
收到一个积极的反馈信号,被检查的正常segment也不会采取任何附加操作。
如果不能建立连接,或者在超时时间内没有得到反馈,FTS会尝试重新连接segment实例。
如果达到了FTS的最大重试次数,FTS会去检测该segment的镜像看其是否在线,如果在线它就会修改
gp_segment_configuration
表,将原来的主segment标记为"down"并设置
镜像承担主segment的角色。FTS会把执行过的操作更新到
[gp_configuration_history](../../../ref_guide/system_catalogs/gp_configuration_history.html)
表中。
当系统中只有主segment正常,其对应的镜像故障时,主segment会进入not synchronizing 状态并继续记录数据库日志变化,一旦镜像修复,便可以将这些变化继续同步,而不用从主segment执行一个完整的拷贝。
运行gpstate
工具并带有-e
选项可以展示单个主segment和镜像segment实例
的任何问题。gpstate
的另外一些选项也能显示所有主segment或镜像segment实例的信息,例如
-m
(镜像实例信息)、-c
(主segment和镜像segment配置信息),另外也可以
显示主segment和镜像segment的问题。
您也可以从系统表gp_segment_configuration
查看当前模式:
s
(同步状态)n
(非同步状态),还有当前状态
u
(在线) or d
(离线)。
[gprecoverseg](../../../utility_guide/admin_utilities/gprecoverseg.html)
工具可以用于将离线的镜像segment重新加入集群。默认情况下,
gprecoverseg
会执行增量恢复,首先将镜像放入同步模式,接下来会重放主segment上
记录下来的日志变化到镜像segment。如果增量恢复失败,整个恢复便会失败。此时可以执行gprecoverseg
并带有-F
选项,以执行一个全量恢复,该操作会复制主segment上的所有数据到镜像segment上。
segment实例恢复后,gpstate -e
命令可以列出所有切换了的主segment和镜像segment实例信息。
该信息表示系统目前处于不均衡状态(主实例和镜像实例不在他们的初始配置角色)。如果系统目前处于不均衡状态,在segment
主机系统上可能存在活动主segment实例分布不均匀的结果。
系统表gp_segment_configuration
包含列role
和
preferred_role
。该列上的值为p
代表主segment,m
代表镜像segment。role
列展示segment实例当前角色,preferred_role
列展示segment实例原来的角色。
在一个平衡的系统中,所有segment实例的role
和preferred_role
列都是对应一致的。当某一个列存在不一样的情况时,表明系统是不平衡的。为了重新平衡集群并将所有的segment恢复到他们
本来的角色,可以运行gprecoverseg
命令并带有-r
选项。
简单的故障转移和恢复示例
本例子已经假设一个单独的主-镜像segment实例对中主segment故障并切换到镜像segment。
以下表格展示在恢复到正常的主segment之前,segment实例在gp_segment_configuration
表中的本来角色, 当前角色, 模式, 和状态:
也可以通过执行gpstate -e
来显示主segment和镜像segment的状态信息
本来角色 |
当前角色 |
模式 |
状态 |
|
---|---|---|---|---|
Primary | p (primary) |
m (mirror) |
n (not synchronizing) |
d (down) |
Mirror | m (mirror) |
p (primary) |
n (not synchronizing) |
u (up) |
segment实例不在他们原来的最佳角色,主segment故障。镜像segment上线成为主segment,目前为非同步模式,
因为他的镜像(之前失败的主segment)处于故障状态。当修复了故障问题后,使用gprecoverseg
重新将失败的实例拉起并在主segment和镜像segment之间同步差异数据。
一旦gprecoverseg
操作完成,segment的状态如下表展示,主segment和镜像segment
转换成为他们之前的最佳角色。
本来角色 |
当前角色 |
模式 |
状态 |
|
---|---|---|---|---|
Primary | p (primary) |
m (mirror) |
s (synchronizing) |
u (up) |
Mirror | m (mirror) |
p (primary) |
s (synchronizing) |
u (up) |
gprecoverseg -r
命令通过将segment的角色切换回他们之前的最佳角色来重新平衡
整个集群系统。
本来角色 |
当前角色 |
模式 |
状态 |
|
---|---|---|---|---|
Primary | p (primary) |
p (primary) |
s (synchronized) |
u (up) |
Mirror | m (mirror) |
m (mirror) |
s (synchronized) |
u (up) |
配置FTS行为
有一系列的服务器配置参数会影响FTS行为: 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", or "debug"。 "verbose"设置可以用在生产上,能为问题定位提供一些有用的数据。"debug" 设置不能用在生产上。默认为:"terse"。
gp_segment_connect_timeout 允许镜像响应的最大时间,以秒为单位。默认为:600(10分钟)
除了可以使用FTS执行错误检查外,不能发送数据到其镜像segment的主segment可以改变镜像的状态为down。
主segment会将同步数据暂时排队处理,如果gp_segment_connect_timeout
时间超时,
此时意味着镜像故障,系统会标记镜像为down并将主segment变为变化追踪(change tracking)模式。
Parent topic: 启用高可用和数据持久化特征