谈谈GlusterFs的脑裂

什么是脑裂呢

类似github的冲突,当github发现两个版本的分支不一样的时候,就会产生冲突。glusterfs发现一个文件的多个副本不一致的时候,就认为该文件处于脑裂状态,当然文件夹也会存在脑裂的(比如多个副本上的目录下的文件数量不一样)。

产生的原因

  • 网络分区。一个集群的多个节点处在不同的网络分区下时,不同的分区下的客户端都会操作改分区下的文件。当网络恢复的时候,glusterfs就会发现一个文件的多个副本是不一样的,此时该文件就会处于脑裂状态
  • glusterfs的进程出现问题:比如两个节点的集群server1和server2。(1)server1挂了,此时文件的操作时发生在server2上 (2)server1启动,server2挂掉了,此时文件的操作时发生在server1上 (3)server1和server2都启动了,此时两个节点上的副本就会不一样

减少脑裂的手段

对于glusterfs我们可以从客户端和服务端两个角度来说:

  • 服务端(Server-quorum):类似于zookeeper,只要大部分节点存活,集群才算存活。不过对于Server-quorum,这个百分比是可以调节的。比如两个节点的集群,我们把百分比调节成50%以上,这样当网络分区出现或者进程出现问题的时候,整个集群是不可以用的,也就不会出现文件脑裂的情况。
    不过对于下面的情况,仍会出现脑裂:
    我们在三个节点的集群中创建了一个两副本的卷,百分比调成51%:
    (1)server1和server3启动着,server2挂了,文件操作在server1上
    (2)server2和server3启动着,server1挂了, 文件操作在server2上
    (3)所有节点启动的时候,一个文件的两个副本不一样了,就出现了脑裂

当集群不满足server-quorum 时,整个集群是不可以用的

  • 客户端(Client-quorum):这种方式在写文件的时候,会检查一下集群是否符合条件,如果符合就会写文件,否则就不会写文件。检查的手段如下:
    (1)fixed类型:该状态下要先声明一个数字Number,处于活跃状态的存放副本的条带要大于等于Number
    (2)auto类型:(处于活跃状态的存放副本的条带)要大于等于(存放副本的条带/2,结果向下取整)。如果副本数是偶数,并且(处于活跃状态的存放副本的条带)要等于(存放副本的条带/2,结果向下取整),那么第一个条带必须存活。
    两副本的卷是不能既满足高可用又保持一致性的:
    (1)如果使用fixed,那么数值必须设置成2
    (2)如果使用auto,那么第一个节点必须存活

当集群不满足Client-quorum时,卷组变为只读

具体点

我们在实践的环境一般采用三副本或者仲裁盘结合Client-quorum来减少脑裂。

  • 三副本:三副本的情况下Client-quorum默认是auto。工作如下:
    (1)B1和B2存活,B3挂了,文件操作发生在B1和B2上
    (2)B3启动,B2挂了,文件操作发生在B1和B3上
    (3)B2启动,B1挂了,文件操作时发现B2和B3是存在不一样的版本,B2和B3不是up状态,不允许写文件,从而减少了进一步脑裂

只要有两个brick存活并且都允许写入,则此次操作就是成功的

  • 仲裁盘:具有减少脑裂的能力,相比三副本会省空间。仲裁盘所在的节点,是不会存储文件的内容的,只会存储文件的属性,所以会省空间。
    (1)如果仲裁盘和一个节点活着,并且中裁盘上的属性没有和这个节点上的副本有冲突,写操作就可以进行下去
    (2)如果中裁盘挂了,其他的两个节点活着,这时候是可以写文件的

除了有两个brick存活并且都允许写入以外,还要满足仲裁盘不会和另外的节点起冲突这个条件,此次操作才能成功


上文都是个人理解,有不到位的地方,请多多指点,请进QQ群630300475,大家聊聊

你可能感兴趣的:(乱七八糟)