GlusterFS 3.x 脑裂处理方法

概述

我们在用户环境中部署了一套Gluster分布式存储文件系统,由于近期他们的数据中心计划外停电一次,通电后虚拟机无法开启成功,后台查看发现是虚拟机磁盘input/output error,确定gluster脑裂无疑。

脑裂这个问题一般出现在复制份数是双数的时候,我们使用的是2份,不要问我为什么不用3份。。。当时太年轻。。。

由于我使用的版本无法指定brick进行修复,所以只能使用setfattr的方式进行修复。

处理过程

我们的volume名称是QXN-Volume, 大家根据自己的volume名称替换

  1. 查看当前脑裂状态

在随意一台存储机器上执行 gluster volume heal QXN-Volume info

  1. 确定两个文件的属性

进入到两台服务器上的数据实际存储目录,我这里是每台机器的/hd1文件夹,对脑裂的文件进行查询

使用命令: getfattr -d -m . -e hex 58a8a3b7-f0e5-450f-9e94-64e5b33cde91

发现两个文件中的trusted.afr不同,正常值应该为全0

找到其中client-0不为全0的文件,上例中为Node2的数据

  1. 对其中一个文件进行修改

修改Node2中的数据修改为0x000000000000000100000000:

setfattr -n trusted.afr.QXN-Volume-client-0 -v 0x000000000000000100000000 58a8a3b7-f0e5-450f-9e94-64e5b33cde91

重新查询,确定修改成功:

  1. ls一下volume文件,触发存储更新集群

ls /opt/1ec45744-8242-4a70-83e0-9ed48eaba3c1/QXN-Volume/

  1. 等待同步完成

原split-brain变更为Possibly undergoing heal,根据冲突大小,决定修复时间,一般来说断电触发的脑裂大概在1分钟左右修复成功

  1. 查看脑裂状态是否恢复正常

gluster volume heal QXN-Volume info

会发现之前脑裂的文件已经不在这个列表中,说明恢复正常

  1. 正常启动虚拟机后使用fsck进行全盘错误校验

正常在界面上开启虚拟机,然后进入控制台,如果操作系统进行恢复模式,使用root密码登录后执行fsck,全部y同意,修复完成后reboot系统即可

总结

使用分布式存储,处理脑裂只是事后解决方案,应在第一时间进行脑裂的预防,建议使用3副本的模式,无视客户和现场实施人员的磁盘空间利用率低的抱怨,不然出了事情,客户的埋怨已经不是抱怨一下的程度了。

处理的方式要看以哪一份作为源数据进行恢复,一般按最后修改时间和数据大小进行判断,恢复错了可能会导致数据部分丢失。

GlusterFS版本应尽量使用较新版本,通过升级测试没有问题的,应为用户进行升级。

PS

如果能使用指定brick的方式修复,上述问题会比较简单,逻辑会更清晰:

假设文件在两个brick上出现了脑裂,根据各brick上文件的修改时间和大小确定了需要恢复的brick源,使用下边的命令就能触发自动修复:

gluster volume heal [volume] split-brain source-brick [brick]

例:

gluster volume heal vol1 split-brain source-brick 10.1.104.221:/brick1

这样就能以brick1的数据为基础进行同步修复了

祝好~

About the author

liuyuhang

View all posts

发表评论