主备切换是很多高可用性系统都必须解决的问题,方法有很多,象基于ZooKeeper的主备切换就是一个很好的选择。
在这里提供一种更简单但不完美的主备切换方法:
1) 假设A和B是集群中的主控(Master)节点
2) 1~7是工作节点(如HDFS中的DataNode)
3) 在每个工作节点上,都同时配置了A和B的IP,而且是对等的,无主备之分
所谓主:是指提供服务的主控,而备是指不提供服务的主控,当主故障时,由备接管其它服务,但因网络原因,可能主和备都未故障,这个是解决主备切换的关键问题所在。
选择A或B作为主的过程:
1) 未连接之前,如图1所示,A和B都不是主
2) 1~7随机选择连接到A或B
3) 这个时候可能会出现如图2所示的情况
4) (关键点)在指定的时间内(如1秒),不管是A还是B,发现到自己的连接数小于50%(这个值可修改)就主动切断连接,这个时候会将本来和自己建立连接的节点赶往另一边
5) 当A或B发现到自己的连接数超过60%(这个值可修改)时,就认为自己是主了,并保持连接
6) 这样当A或B有一个挂掉时,最终肯定会有一个满足作为主的条件
如果是网络原因,而不是A或B本身故障,则会出现一些可以连接到A但不能连接到B,而另一些可以连接到B但不能连接到A,甚至还有些可以同时连接A和B,但总是只有满足超过50%的才提供服务,这样就不会出现同时存在两个主的情况。所以,如果恰好是一半一半,那就无法提供服务,需要人工干预了,比如工作节点,平均分配在两个不同IDC,由于两个IDC间网络故障,问题就会出现。
图1
图2
图3
会不会导致A和B都是40%或50%了?这个会,但会触发重新竞争分配,只需要做一些策略调整,就可以解决这个问题,比如A是每1秒算一个间隔,B为2秒一个间隔。