.glusterfs目录大小基本是等于当前brick中的所有文件大小,原因是里面主要存放的是brick中文件的硬链接。


    .glusterfs目录是3.3版本引入的一个新结构,它是用来做什么的呢?


什么是GFID?


    你可能知道,glusterfs将元数据信息存储在文件的扩展属性中。其中一个元数据就是trusted.gfid,这个就是inode号,在集群中,每个文件都有一个唯一的uuid号,这个在gluster 3.1和3.2版本工作的都很好,但是在文件自动修复(AFR)过程中经常会有一些误判。


    这个GFID用于建立.glusterfs这个目录结构,每个文件都对应一个硬链接放在.glusterfs目录中,存放规则是,前两个数字创建一个目录,接着两个数字创建一个目录,然后目录中存放是一个完整的uuid硬链接。


例如:

# getfattr -m . -d -e hex /data/glusterfs/d_home/stat.c
getfattr: Removing leading '/' from absolute path names
# file: data/glusterfs/d_home/stat.c
trusted.afr.home-client-10=0x000000000000000000000000
trusted.afr.home-client-11=0x000000000000000000000000
trusted.afr.home-client-9=0x000000000000000000000000
trusted.gfid=0xc62757554baf4a33bc7690c56dac23e0


会创建一个硬链接到:

/data/glusterfs/d_home/.glusterfs/c6/27/c6275755-4baf-4a33-bc76-90c56dac23e0


为什么要这样做?


    之前执行删除、重命名、建硬链接的几种方法是有缺陷的。如果一个连接到复制卷并执行了重命名操作的连接丢失,自动修复进程不知道是纯粹的删除或者是重命名等操作,这样会出现问题,可能产生重复的文件导致混乱。


    现在一个文件被删除,.glusterfs目录中对应的文件也会被删除,自动修复守护进程会在好的服务器上遍历,查看到文件是否被存在,由于对应的gfid文件被删除了,所以认为是真正被删除了,如果文件丢失,但对应的gfid文件存在,说明被重命名了,过期的服务器会删除文件名,但不会删除对应的gfid文件,一旦自动修复守护进程遍历到新的文件名,会直接创建到gfid文件的硬链接,因为数据仍然在服务器上,所以这样修复一个重命名文件就避免了数据传输。


    如果gfid文件是普通文件而不是硬链接,那基本上就完蛋了。最终会发生链接分离,原因是一个文件会过期,客户端没有办法知道一个文件和另一个具有相同的gfid,所以会重新创建一个,这样操作会创建大量不必要的重复文件,而使用硬链接后,每个gfid文件会对应一个文件,就不会出现空间浪费。


NFSv4支持

    很快,glusterfs会支持NFS v4,会使用匿名文件描述符。gfid文件允许在目录中创建gfid文件,但不在目录中创建对应的条目。


这对管理员来说有什么新要求吗?


    作为管理员,了解gfid机制对文件修复和裂脑修复是很用帮助,建议详细了解。


    首先,每个brick的根目录对应的gfid是00000000-0000-0000-0000-000000000001,这个文件放在 .glusterfs/00/00目录中,实际上是一个符号链接,连接到“../../..”,其他目录也会链接到这个目录下面。


    如果删除一个文件不删除对应的gfid文件,修复进程会修复该文件,如果gfid文件损坏,对应的文件也会损坏。



参考:

https://joejulian.name/blog/what-is-this-new-glusterfs-directory-in-33/

https://www.gluster.org/pipermail/gluster-users/2014-January/015494.html