从Segment故障中恢复

从Segment故障中恢复

Segment主机故障通常会导致多个Segment故障:在该主机上的所有主Segment或者镜像Segment都被标记为“down” 并且不可操作。如果没有启用镜像并且一个Segment宕掉,系统会自动变成不可操作。

segment实例可能会因为很多原因产生故障。例如主机故障,网络故障或磁盘故障。当segment实例故障时,它的 状态在系统表中被标记为down,它的镜像切换到change tracking模式。为了将故障segment实例 修复并重新进入可操作状态,您必须首先修复导致故障的问题,然后使用gprecoverseg工具 恢复该故障实例。

如果一台segment主机不可恢复,此时您已经失去了一个或多个segment实例,那么您可以尝试从它的镜像segment 来恢复该segment实例。详见当一台Segment主机不可恢复时。 您也可以从备份文件重新创建Greenplum数据库。详见备份和恢复数据库

在启用了镜像的情况下恢复

  1. 确保可以从Master主机连接到该Segment主机。例如:
    $ ping failed_seg_host_address
  2. 排查解决妨碍Master主机连接到Segment主机的问题。例如,主机可能需要被重启或者替换。
  3. 在主机上线并且能连接到它后,从Master主机运行gprecoverseg工具来重新激活故障的Segment实例。 例如:
    $ gprecoverseg
  4. 恢复过程会启动失效的Segment并且确定需要同步的已更改文件。该过程可能会花一些时间, 请等待该过程结束。在此过程中,数据库的写活动会被禁止。
  5. gprecoverseg完成后,系统会进入到Resynchronizing 模式并且开始复制更改过的文件。这个过程在后台运行,而系统处于在线状态并且能够接受数据库请求。
  6. 当重新同步过程完成时,系统状态是Synchronized。运行gpstate工具来验证重新同步进程的状态:
    $ gpstate -m

要让所有Segment返回到它们的首选角色

当一个主Segment宕掉后,镜像会激活并且成为主Segment。在运行gprecoverseg之后, 当前活动的Segment仍是主Segment而失效的Segment变成镜像Segment。这些Segment实例并没有回到在系统 初始化时为它们指定的首选角色。这意味着,如果Segment主机上的活动Segment数量超过了让系统性能最优的 数量,系统可能处于一种潜在地非平衡状态。要检查非平衡的Segment并且重新平衡系统,运行:

$ gpstate -e

所有Segment都必须在线并且被完全同步以重新平衡系统。在重新平衡过程中,数据库会话保持连接,但正在 进行的查询会被取消并且回滚。

  1. 运行gpstate -m来确保所有镜像都是 Synchronized
    $ gpstate -m
  2. 如果有任何镜像处于Resynchronizing模式,等它们完成。
  3. 运行gprecoverseg工具并带有-r选项, 让Segment回到它们的首选角色。
    $ gprecoverseg -r
  4. 在重新平衡之后,运行gpstate -e来确认所有的Segment都处于 它们的首选角色。
    $ gpstate -e

从双重故障中恢复

在双重故障中,主Segment和它的镜像都宕掉。如果在不同的Segment主机上同时发生硬件失效,就有可能发生 这种情况。如果发生双重故障,Greenplum数据库会变得不可用。从一次双重故障中恢复的步骤如下:

从双重故障中恢复

  1. 处理引起双重故障的问题原因并解决,确保segment主机可操作并且可以从master主机访问。
  2. 重启Greenplum数据库。gpstop工具带有-r参数执行时,会停止并重新启动Greenplum 数据库系统。
    $ gpstop -r
  3. 在系统重启后,运行gprecoverseg重新激活故障segment实例:
    $ gprecoverseg
  4. gprecoverseg完成后,使用 gpstate检查所有镜像状态,确保segment实例的状态从Resynchronizing 模式变成模式:
    $ gpstate -m 
  5. 如果仍有Segment处于change tracking模式,运行gprecoverseg 并带有-F选项执行一次完整恢复。
    Warning: 一个完整的恢复会在从活动segment实例(当前主实例)复制数据前, 删除离线segment实例的数据目录。在执行全量恢复前,确保segment失败不会引起数据损坏, 任何主机的segment磁盘问题都已经被修复。
    $ gprecoverseg -F
  6. 如果需要,将segment实例的角色恢复到它们的最佳角色。详见要让所有Segment返回到它们的首选角色

在没有启用镜像的情况下恢复

  1. 确保能够从Master主机连接到该Segment主机。例如:
    $ ping failed_seg_host_address
  2. 排查解决妨碍Master主机连接到Segment主机的问题。例如,主机可能需要被重新启动。
  3. 在主机在线之后,验证能够连接到它并且重启Greenplum数据库。 gpstop带有-r选项可以停止并重启系统:
    $ gpstop -r 
  4. 运行gpstate工具来验证所有的实例都在线:
    $ gpstate