GBase8a集群应急处理:将节点IP弄错,设置为unavailable的恢复方法

GBase 8a集群,在节点数据出现不可恢复故障时,可以设置为unavailable状态,该状态下不再记录数据后续的主备不一致event,也不能直接切换回normal状态,只能节点替换。本文介绍,如果由于手误,将错误的节点设置成了unavailable,强行恢复的方法。

数据不可恢复故障包括:磁盘物理损坏,RAID卡损坏,文件系统损坏等情况,都需要重做RAID或者文件系统,导致该节点所有数据均丢失。

注意:

由于unavailable后就不再记录主备不一致的event,所以发现的越早,对系统影响越小。

如期间已经有部分表发生标动,则在后续对该表操作中,可能出现结果错误,DML报错的情况。如果严格的不允许这种情况发生,那节点替换是唯一选择。

如果操作时数据库已经处于readonly状态,或者业务,包括定时任务,处于停止状态,系统无DDL,DML操作,则无影响。

另,本操作期间,集群对外服务要停止,请谨慎判断是否要继续。

名词

  • 管理服务 = gcware
  • 调度服务 = coordinator
  • 数据服务 = gnode + syncserver

整体步骤介绍

  1. 停掉所有调度和数据服务。
  2. 刷新2次管理服务快照
  3. 停掉所有管理服务
  4. 备份所有管理服务数据
  5. 编辑所有管理服务下,所有快照的数据,恢复状态
  6. 重启除了故障节点外的管理服务,确认状态
    1. 如果恢复正常的CLOSE, 然后再启动故障节点管理服务
    2. 如果还是UNAVAILABLE,则转到2,刷新后再次编辑。
  7. 启动所有停调度和数据服务

停掉所有调度和数据服务

gcluster_services all stop

刷新2次管理服务快照

编写如下python脚本:flushstatement.py

注意其中的flush_statemachine是2次

import gcware
gcware.flush_statemachine()
gcware.flush_statemachine()

执行

 python flushstatement.py

停掉所有管理服务

gcware_services all stop

备份所有管理服务数据

在修改管理节点服务前,先备份一份数,避免误操作。每个节点都分别备份。

数据文件位于:安装目录/XX.XX.XX.XX/gcware/data/gcware/

编辑所有管理服务下所有快照的数据,恢复状态

将快照下的如下2个文件内,对应nodestate值从3改成1。

SNAPSHOT的后缀一般有多组,全部要修改

[gbase@gbase_rh7_005 gcware]$ vi SNAPSHOT.AAA.BBB/statemachine/COORDINATORSTATE
[gbase@gbase_rh7_005 gcware]$ vi SNAPSHOT.XXX.YYY/statemachine/COORDINATORSTATE
[gbase@gbase_rh7_005 gcware]$ vi SNAPSHOT.AAA.BBB/statemachine/vc00001/DATACLUSTERSTATE
[gbase@gbase_rh7_005 gcware]$ vi SNAPSHOT.XXX.YYY/statemachine/vc00001/DATACLUSTERSTATE

提示:如果被错误设置为unavailable下的节点,没有如下的nodestate":3,【可以不修改】。

修改样例如下

COORDINATORSTATE

如下的"nodestate":3, 表示该节点为unavailable状态

如果有多个节点为unavailable, 需要找到对应nodeid的部分,不要改错了。

nodeid可以用gccli登录集群,运行show nodes命令获得对应IP的nodeid。南大通用GBase 8a查看每个节点的编号 nodeid

{
  "version":139672312498104,
  "epoch":139672312498104,
  "coordinatornodes":[
    {
      "nodeid":1728184330,
      "nodestate":1,
      "gclusterstate":1,
      "gcwarestate":1
    },
    {
      "nodeid":1744961546,
      "nodestate":3,
      "gclusterstate":2,
      "gcwarestate":1
    },
    {
      "nodeid":1761738762,
      "nodestate":1,
      "gclusterstate":1,
      "gcwarestate":1
    }
  ],
  "coordinatorlist_entries":3
}

改成1

{
  "version":139672312498104,
  "epoch":139672312498104,
  "coordinatornodes":[
    {
      "nodeid":1728184330,
      "nodestate":1,
      "gclusterstate":1,
      "gcwarestate":1
    },
    {
      "nodeid":1744961546,
      "nodestate":1,
      "gclusterstate":2,
      "gcwarestate":1
    },
    {
      "nodeid":1761738762,
      "nodestate":1,
      "gclusterstate":1,
      "gcwarestate":1
    }
  ],
  "coordinatorlist_entries":3
}

DATACLUSTERSTATE

与COORDINATORSTATE修改内容相同,注意事项相同。

{
  "version":1,
  "epoch":0,
  "dataservernodes":[
    {
      "nodeid":1744961546,
      "nodestate":3,
      "gnodestate":2,
      "syncserverstate":2
    },
    {
      "nodeid":1728184330,
      "nodestate":1,
      "gnodestate":1,
      "syncserverstate":1
    },
    {
      "nodeid":1761738762,
      "nodestate":1,
      "gnodestate":1,
      "syncserverstate":1
    }
  ],
  "dataserverlist_entries":3
}

修改成

{
  "version":1,
  "epoch":0,
  "dataservernodes":[
    {
      "nodeid":1744961546,
      "nodestate":1,
      "gnodestate":2,
      "syncserverstate":2
    },
    {
      "nodeid":1728184330,
      "nodestate":1,
      "gnodestate":1,
      "syncserverstate":1
    },
    {
      "nodeid":1761738762,
      "nodestate":1,
      "gnodestate":1,
      "syncserverstate":1
    }
  ],
  "dataserverlist_entries":3
}

重启除了故障节点外的管理服务,确认状态

gcware_services all start

如果恢复正常的CLOSE, 然后再启动故障节点管理服务

由于调度和数据服务还未启动,状态为CLOSE就是正常的。

最后将错误设置状态的管理节点服务启动,会自动从其它节点同步数据。

gcware_services all start

如果还是UNAVAILABLE,则转到2,刷新后再次编辑。

大概率是一些节点忘记修改,或者SNAPSHOT没有修改导致,转到2,刷新快照重新修改即可。

启动所有调度和数据服务

恢复服务,手工恢复完成。系统可正常对外提供服务了。