GBase 8a集群,在节点数据出现不可恢复故障时,可以设置为unavailable状态,该状态下不再记录数据后续的主备不一致event,也不能直接切换回normal状态,只能节点替换。本文介绍,如果由于手误,将错误的节点设置成了unavailable,强行恢复的方法。
数据不可恢复故障包括:磁盘物理损坏,RAID卡损坏,文件系统损坏等情况,都需要重做RAID或者文件系统,导致该节点所有数据均丢失。
目录导航
注意:
由于unavailable后就不再记录主备不一致的event,所以发现的越早,对系统影响越小。
如期间已经有部分表发生标动,则在后续对该表操作中,可能出现结果错误,DML报错的情况。如果严格的不允许这种情况发生,那节点替换是唯一选择。
如果操作时数据库已经处于readonly状态,或者业务,包括定时任务,处于停止状态,系统无DDL,DML操作,则无影响。
另,本操作期间,集群对外服务要停止,请谨慎判断是否要继续。
名词
- 管理服务 = gcware
- 调度服务 = coordinator
- 数据服务 = gnode + syncserver
整体步骤介绍
- 停掉所有调度和数据服务。
- 刷新2次管理服务快照
- 停掉所有管理服务
- 备份所有管理服务数据
- 编辑所有管理服务下,所有快照的数据,恢复状态
- 重启除了故障节点外的管理服务,确认状态
- 如果恢复正常的CLOSE, 然后再启动故障节点管理服务
- 如果还是UNAVAILABLE,则转到2,刷新后再次编辑。
- 启动所有停调度和数据服务
停掉所有调度和数据服务
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,刷新快照重新修改即可。
启动所有调度和数据服务
恢复服务,手工恢复完成。系统可正常对外提供服务了。