当前位置: 首页 > 科技观察

如何在两地部署奇数个三中心节点?

时间:2023-03-17 17:51:36 科技观察

文完本文转载自微信公众号“小姐姐的味道”,作者小姐姐养的狗。转载本文请联系味觉小姐公众号。两地三中心是有钱的公司。为了保证数据安全和高可用,这是一个普遍的需求,通常指的是“同城双活,异地备份”。2+1=3。从描述中我们知道,它们之间还有类属性。异地备份的机房自然要比同城的两个机房低一个档次,不然也不会沦为备胎。辩证地看待这个问题,我们就可以从容应对感情上同舟共济的问题。1、部署结构为了描述方便,我们将同城的两个机房称为A、B,把差的备份机房称为C机房,同城的两个机房自然距离更近距离。我们可以用图表直观地表示这种距离差异。所以这个备用机房是很不存在的。其实它也很有自知之明,只把自己放在一个备份的场景下,可以接受非常大的请求延迟和比较长的数据不一致窗口。这样就只剩下A和B陪你玩了,这叫双活。2、奇数节点的意义Hyperactive是指两个机房必须同时对外提供服务。不同机房运行的服务有两种,一种是有状态的,一种是无状态的。一个无状态的服务,由于本身不存储数据,只是作为一个麦克风,处理起来自然流畅,所以没有什么值得讨论的。棘手的部分是有状态服务。即使它像鱼一样只有5秒的内存,这部分内存仍然对整个系统提出了很高的标准---我们需要一个集中的地方来存储这些数据。大家都是搞技术的,就举几个常用的组件吧。ZookeeperZoo需要做集中配置中心或者分布式协调工作RedisCluster需要处理一些全局缓存数据ElasticSearch用于数据存储无数案例告诉我们,要部署这些服务,必须部署奇数个节点。为什么不能部署偶数?因为有一个脑损伤的问题,就是脑裂。我们以Zookeeper为例。如果我们部署6个节点,那么你需要两个集群可用,至少需要4个才能存活。如果你把它设置为3,那么它就会有问题。如下图所示,在6个节点的场景下,A机房和B机房的网络出现断断续续的情况。A机房的三个节点发现无法再连接到B机房的节点,于是自己组成一个集群,写了两条数据a=100,b=300;同理,B机房也成立了一个局,写了两条记录a=100和b=600。而且都写成功了。一个集群变成了两个,写入了不同的数据。那么我基于谁的数据呢?这真的要了我的命。这就是裂脑问题。我们不能把集群需要的最小节点数设置为3个,至少4个。所以可以看到无论是ES还是raft协议,无论是paxos还是zab,都建议部署奇数个节点,然后设置最小可用集群节点数为(n/2+1)---据说超过半数的节点投票实现,具有更好的容错性。3.如何部署奇数个节点如何解决这个问题?如果是三个同城住,那么我们只需要在每个机房部署一个节点即可。但是就算是双活,公司也只有非常有钱才买得起。现在做三份工作,你很可能会赢得老板心虚的目光。当然也可以采用2+2+1的模式。找不到专门的机房部署一套集群,但是找几个第三方服务器部署几个我们的服务节点是可以的。听起来不错,但实际上并没有做到。因为这些第三方服务器对带宽、延迟、安全、稳定性都有很高的要求。老老实实打两个中锋吧。野花野草闻起来很香,但大概率是有毒的。事实上,A和B总是有些不同,即使她们是姐妹。只要不把A和B太平等对待,问题就好办了。如上图,A机房部署了3个节点,B机房部署了2个节点,只要你这样部署,在你的脑海里,A需要比B高一级,即使您声称它们是相同的。就像你在两条船上,你和两个人说你爱他。但是一旦两者发生冲突,你还是会毫不犹豫的选择一个。这就是考验。让我们切换回上图,看看几种情况。在这种部署情况下,当发生脑裂时,B机房的两个节点都无法提供服务,所以不会有数据异常进入。当B机房出现问题时,A机房仍然可以正常运行。当A整个机房出现问题时,此时B机房只有2个节点,不满足最少3个节点。这个时候怎么办?是的,我们手动启动一个。可以看到节点6的边界是一条虚线,代表它处于待机状态,随时准备转正,完全接管A的工作。这也是有代价的,毕竟,A是你心中的No.1。Ta离开了你,给你带来了麻烦。自己的选择,哪怕眼里含着泪水,也要把B推上去。相信我,这只是一个小小的痛苦,很快你就会再次进入主动主动的世界。到时候不管你拿B当No.1,还是继续换回A,都没有问题。而这个选择是没有意义的。比起谁的等级高,你要双活的根本原因就是你谁都不信。所以,把未来留给薛定谔的猫——它让你成为一个多情多疑的程序员。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。