确定GlusterFS数据损坏的原因

将数据写入已在两台服务器上configuration的复制GlusterFS卷时,我遇到了数据损坏。

我设置的configuration如下:

  • 服务器运行Ubuntu 16.04和GlusterFS v3.10.6
  • 客户端运行Ubuntu 14.04和GlusterFS v3.10.6
  • GlusterFS中已经configuration了两个卷,每个都在每个服务器上分配两块砖。
  • 每个砖块都是带有EXT4 / LUKS文件系统的MDADM RAID5arrays。
  • 每个卷都configuration了默认选项,再加上滴滴涕检测。 这些如下:

    features.scrub: Active features.bitrot: on features.inode-quota: on features.quota: on nfs.disable: on 

当大型目录从其中一个客户端机器上的本地文件系统复制到configuration的GlusterFS卷中的任一个时,数据损坏就会显示出来。 当为复制的文件和源文件计算md5校验和,并比较两者时,校验和的数目会有所不同。

手动触发GlusterFS卷上的自愈function,显示没有识别出用于修复的文件。 此外,查看gluster volume bitrot <volname> scrub status的输出以及/var/log/glusterfs/bitd.log/var/log/glusterfs/scrub.log的输出日志,似乎没有发现任何错误。

这些问题只是performance出来,最近大约一周之后,大约10个客户使用了这两个卷。

我已经尝试了卷离线,并已经testing直接通过底层的本地文件系统写入数据到每个砖,并没有能够重现的问题。

为了进一步debugging这个问题,我在VirtualBox的虚拟机上configuration了一个类似的设置,并且没有能够重现这个问题。 对于这些错误的原因,我相当不知所措。

任何意见,我可以采取进一步的debugging步骤或已知问题与GlusterFS和我的configuration,将不胜感激。

如果Gluster说没有腐败,那么你的卷上可能没有任何可察觉的腐败。 然而,从你所描述的那里没有数据复制品在这些gluster卷超过1.没有多个repicas(理想情况下三个完整或2n + a),我们不能确定是否一个节点已损坏其数据,因为它没有其他副本比较自己。

解决这个问题的一个方法是启用bitrot检测守护进程,默认情况下它是禁用的。 这将允许使用文件校验和进行数据清理。 这可以使用gluster volume bitrot VOLNAME enable 。 检测到的错误logging在/var/log/glusterfs/bitd.log和/var/log/glusterfs/scrub.log

这些都不涉及空中腐败。

如果上面没有任何东西出现,您可能会检查客户端本身,以及来自客户端和服务器的任何相关日志。 您也可能需要testing您的networking,客户端或服务器硬件沿此path,以确定确切发生此损坏的位置。 希望你不必走得太远。