1 说明
软件版本:GlusterFS6.10
操作系统:CentOS Linux release 7.8.2003 (Core)
本文以2副本+1仲裁卷进行解释说明,卷参数配置如下:
Volume Name: vol1
Type: Replicate
Volume ID: dba77e5d-3e70-4ff5-98d9-de2583a05f62
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: 10.10.176.232:/c001_vol1
Brick2: 10.10.176.221:/c001_vol1
Brick3: 10.10.176.188:/c001_vol1_arbiter (arbiter)
Options Reconfigured:
performance.client-io-threads: off
nfs.disable: on
transport.address-family: inet
2 数据不一致的产生
2.1 数据写入
gluster副本卷会同时写入多个副本,每个基于写入的 FOP 都采用由 5 个阶段组成的写入事务模型:
- Lock 阶段 锁定正在修改文件,以便其他客户端的 AFR 在尝试同时修改同一文件时被阻止;
- Pre-op 阶段 在所有参与的 brick 上将 xattr (trusted.afr.dirty) 增加 1,作为即将发生 FOP 的指示;
- FOP 阶段 在所有 brick 上执行实际的 FOP(比如 setfattr)
- Post-op 阶段 在 FOP 成功的 brick 上将脏 xattr (trusted.afr.dirty) 减 1。此外,还要增加成功 brick 上的“待处理”xattr (trusted.afr.$VOLNAME-client-x) xattr,以识别 FOP 失败的 brick;
- Unlock 阶段 释放在阶段 1 中获得的锁。任何竞争客户端现在都可以继续自己的写入事务。
2.2 扩展属性说明
2.2.1 trusted.afr.dirty
trusted.afr.dirty 的前8个数字表示数据(data)的变化,接下来的8个数字表示元数据(metadata)的变化 最后8个数字表示目录项目(entry)的变化
不同的文件操作会导致扩展属性值变化:
FOP | Value after pre-op phase | Value after post-op phase |
---|---|---|
afr_writev | trusted.afr.dirty=0x00000001 00000000 00000000 | trusted.afr.dirty=0x00000000 00000000 00000000 |
afr_setattr | trusted.afr.dirty=0x00000000 00000001 00000000 | trusted.afr.dirty=0x00000000 00000000 00000000 |
afr_create | trusted.afr.dirty=0x00000000 00000000 00000001 | trusted.afr.dirty=0x00000000 00000000 00000000 |
因此,根据FOP的类型(即数据/元数据/目录项事务),dirty xattr的不同字节集会递增/递减,只有在某些brick上的FOP失败时,它才会在操作后增加。
2.2.2 trusted.afr.volname-client-subvolume-index
trusted.afr.volname-client-subvolume-index用来维护文件的changelog。该值是由glusterfs客户端(fuse或nfs服务器)进程计算的。
当glusterfs客户端修改文件或目录时,客户端会联系每个brick,并根据brick的响应更新扩展属性。
subvolume-index是在gluster volume info<volname>输出中的(brick number - 1),以我们的测试卷为例,对应的3个bri