Last updated
Was this helpful?
Last updated
Was this helpful?
GlusterFS是基于网络的分布式文件系统,具有多副本镜像的容灾能力,并且可以实现单个
机房网络(或服务器)故障时,不影响客户端访问。机房网络(或服务器)恢复时候,能够自动平衡恢复副本,对挂载GlusterFS的客户端(应用)是透明的容灾,无需用户干预处理。
但是,实际生产环境中,如果出现核心网络故障,会导致各个机房之间网络断开,此时所有机房都成为孤岛
。由于分布式文件系统是需要通过心跳来判断对方节点是否正常,这种孤岛
的网络故障会使得所有的GlusterFS认为自己节点是正常的,对方节点异常,此时继续提供存储服务的话,会导致各个机房的客户端写入冲突的数据,也就导致了脑裂
。
在这种多机房网络故障的情况下,我们希望做到自动停止GluserFS服务,等网络恢复以后再自动恢复服务。同时,如果只是个别机房(单个机房)故障,另外2个机房网络互通正常,我们仍希望通过正常的GlusterFS服务继续提供服务,实现服务高可用。
解决的方案是使用GlusterFS的quorum
功能:原理是服务器节点发现低于指定比率服务节点存活时停止工作
。
在3个机房部署跨机房3个副本的GlusterFS集群,并设置 quorum 为 51%
参考,默认并没有开启
cluster.server-quorum-type server
,只有开启了这个参数设置才能使得Quorum生效。
当一个机房和其他机房断开连接时,这个机房的服务器会判断自己机房的服务器节点数量只有1/3
,低于quorum阀值,就会停止工作。而另外两个机房相互之间通讯的节点2/3
,大于 51%
,可以继续提供服务。
如果3个机房同时出现通讯中断,则整个集群停止服务。
线下测试环境部署了3个节点
这里建立的卷名称是
mqha
,是一个共享队列
在3个节点上准备好brick
在一个节点上重建卷
注意:设置
cluster.server-quorum-ratio
需要全局,对all
设置,而设置cluster.server-quorum-type
需要对单个卷设置
启动卷
在3个节点上添加挂载配置/etc/fstab
在3个节点挂载
在其中一个节点上设置好目录权限
用iptables禁掉了两两之间的连接
此时在所有节点上使用 df -h
都会卡住,然后过一会,再使用df -h
,可以看到glusterfs的卷mqha
已经消失了
注意:这里可以看到一句日志
清除掉 192.168.2.55 和 192.168.3.55 上的iptables,模拟这两个机房恢复网络
此时观察这两个恢复节点的日志,可以看到
注意其中:有恢复卷的日志
此时,在这两个节点上,会自动重新挂载卷,用 df -h
可以看到
注意,这时候 192.168.1.55 网络尚未恢复,所以在这个节点还看不到挂载的卷
再在 192.168.1.55 清除掉iptables模拟最后一个机房恢复
很快这个节点也重新挂载上了卷 mqha,并且可以看到,在192.168.2.55 和 192.168.3.55前面恢复后,192.168.1.55恢复之前的文件也被同步回来。
上述实验验证了GlusterFS的Quorum设置:
单机房故障,正常工作的两个机房可以继续提供GlusterFS服务,对应用无影响(会有短暂的hang,默认最长41秒,可缩短时间)。当单机房故障恢复后,无需人工干预,自动平衡数据恢复到3个副本。这种故障情况下能够保持高可用。
当发生两两不能互通情况(所有3个机房成为孤岛),则glusterfs自动停止服务,避免脏数据影响产生脑裂。当机房恢复服务,GlusterFS也能自动恢复服务,无需人工干预。这种故障情况下,保证数据安全。