您的位置:首页 > 其它

GlusterFS之文件系统扩展属性

2012-08-21 23:05 906 查看
扩展属性是现代文件系统最不为人知的属性之一,可以采用一种完全的特性将扩展属性添加到文件。其表现形式是key-value对,可以通过操作get/set扩展属性。GlusterFS就大量使用了扩展属性--xattrs,来完成集群工作(复制、条带、分布式),所以说,扩展属性对GlusterFS至关重要。

这里有个关键,get/set扩展属性会触发与之关联的所有服务器,这样的话,就可以通过setxattr或者getxattr来向服务器传递信息。这种伎俩实际上就是一种RPC机制,在GlusterFS中被大量使用。例如,rebalance代码会通过一个magic xattr触发layout的重新计算,layout决定了文件被存储到哪个服务器。Quick-read Translagtor使用一个magic xattr来模拟open/read/close序列,对小文件这将节省2/3的开销。在GlusterFS中,还有很多这样的xattr,接下来重点集中在两个xattr:trusted.glusterfs.dht
xattr(DHT Translator使用)和trusted.afr.* xattr(AFS Translator使用)

DHT

DHT,指分布式集群,采用一致性哈希。文件被哈希后获取到一个哈希值,然后在一个哈希表中进行查找。哈希表描述了每个存储节点(brick)分配到的hash range,hash range被唯一的分配给某个存储节点。这种对应关系,或者说分配关系,是在每个目录被创建时建立的。新创建的目录会在当前集群的所有可用存储节点上被同时创建,也就是说,每个存储节点上都会有新建目录的一份拷贝。其中,每份拷贝有不同的扩展属性:trusted.glusterfs.dht xattr,描述了当前拷贝负责的hash range.
当目录被创建后,在此目录下新建的文件和/或目录,就会根据当前目录的哈希表进行哗然分布。

可以看出,这是目录级别的哈希。

当目录被查找时,要做的工作是:收集这些xattrs,并根据它们的hash range生成一张哈希表(描述存储节点和其对应hash range的映射关系)。

而当存储节点被添加或移除时,xattrs需要重新计算。这些都会影响到系统的扩展性,需要更好的解决。但在当前的系统中,这些机制暂时运行的很好。

AFR

也就是raid1,指复制集群。AFR中xattr的使用,要比DHT中复杂的多。这里主要是指trusted.aft.* xattrs, *是复制集群中除了xattr所在的当前存储节点之外的所有其它存储节点,,也就是说,在一个replica组内,某存储节点中当前目录的扩展属性,记录了此复制组内其它存储节点中相同目录的操作信息,相互记录。

这样做的原因,是为了错误恢复。因此,操作的状态不能只记录在一个地方,一次失败可能会同时清除操作和状态记录。所以,可靠的方法是,操作在一个节点执行,同时将此操作记录在多个节点。

Xattr记录中的计数可以看作是等待中的操作的数目,是一个32位整数,记录了3种操作类型:

1)数据操作。主要是写,也包括截断

2)元数据操作。像chmod/chown/chgrp,还有xattrs

3)名字空间操作。create/delete/rename

对文件系统修改时,首先更新所有节点中保存的对应目录的扩展属性中的计数器。事实上,为了支持AFR,GlusterFS还额外定义了几个xattr操作(像原子增加计数等)。只有当所有的计数器都被增加,实际操作都会发送到所有副本。当每个节点完成操作时,分布到其它副本节点的对应于此操作的计数器会被递减。最终,所有的计数器都会归0. 如果节点X在操作中失效,或者没有办法开始,其它所有节点对应此操作的计数器就会保持非零。在下一次获取此计数器时,通过比较,此非零状态能容易地被检测出来。根据所有计数器的关系,通常能指示哪个节点失效了,自我修复就能正确、及时的恢复集群状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: