1 glusterfsreplica脑裂分析
1.1 glusterfs replica io流程
glusterfs通过对replica卷的所有子卷写相同的数据实现冗余功能。当glusterfs的客户端对replica卷有任何写操作(包括数据与元数据)时,glusterfs通过对所有的子卷加锁进行同步。
glusterfs的client每次对server端做操作,都需要经过多层translator,若client端完成一次完整的处理需要向server端发送多次不同的逻辑请求,而由于glusterfs的translator采用异步回调机制,导致不可能在同一个上下文顺序的向server端发送多次不同的逻辑请求,所以只能采用在当前请求的callback函数中处理下一个请求的方法。图6-1简要描述了上述过程
图6-1
下面对glusterfs replica卷的基本流程进行分析。
1.1.1 glusterfs replica 创建文件
1. glusterfsreplica卷创建文件的基本流程:
1) 对每个up(正常工作的子卷)的子卷加非阻塞entry锁,只有所有up的子卷加锁成功,才算加锁成功。
2) 如果非阻塞锁失败,则加阻塞锁。
3) 对每个加锁成功的子卷对应的扩展属性设置changelog(扩展属性相应区域加1)。
4) 在所有up的子卷上创建文件。
5) 当所有up的子卷创建文件之后,对这些子卷对应的扩展属性清除changelog(扩展属性相应区域减1)
6) 对所有up的子卷解锁。
2. glusterfsreplica卷创建文件的详细流程:如图6-2所示
图 6-2
1.1.2 glusterfs replica 写文件
1. glusterfsreplica卷写文件的基本流程如下:
1) 对每个up(正常工作的子卷)的子卷对应文件加非阻塞inode锁,只有所有up的子卷加锁成功,才算加锁成功。
2) 如果非阻塞锁失败,则加阻塞锁。
3) 对每个加锁成功的子卷对应文件扩展属性设置changelog(扩展属性相应区域加1)。
4) 向所有up的子卷上对应文件写数据。
5) 当所有up的子卷写完数据后,对这些子卷对应文件扩展属性清除changelog(扩展属性相应区域减1)