从Poxos算法说说zookeeper的选举和容错机制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq32933432/article/details/96331517

什么是Poxos算法

Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法。这个算法被认为是类似算法中最有效的。

Poxos算法有什么用

Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。

Poxos算法推导

内容较多,本文不做探讨,可以看这篇文章

zookeeper中关于Poxos算法的应用

其实严格来说zookeeper中的选举算法并不是Poxos算法,可以算作是Poxos算法的变种。叫做什么ZAB协议。
关于ZAB协议的介绍可以看这篇文章
关于区别可以看这篇文章
那么zookeeper的选举算法又是怎样的呢?在zookeeper中,每一个节点都会有一个zxid和一个myid。其中zxid代表事务ID,而myid代表这个节点的ID。那么什么是事务ID呢,我们可以简单理解每一次操作,这个事务ID就会加1.比如添加数据,删除数据等。那么也就是说,zxid越大,代表这个节点的数据版本越新。也就是权重更高。而当zxid一样的情况下,myid越大权重越高,myid就是我们在配置文件中配置的id

举个栗子

假设有这样三个zk节点,经过选举,由于zxid是一样的,而节点3的myid最大为3,所以选中节点3为leader在这里插入图片描述
假设有下面这样三个zk节点,经过选举,由于节点2的zxid最大为89,所以选中节点2为leader.
在这里插入图片描述

为什么zk建议节点数量为奇数台

我们清楚zk的选举算法,下面来说说为什么zk建议的节点数量为奇数台。
这是因为zk里面有个限制,就是集群中存活的节点数必须要超过总节点数的半数才能继续提供服务,那么这是什么意思呢?
比方数我们有3台服务器的时候,其中一台坏了,存活节点为2,2>3/2.所以能继续提供服务,而当集群中两台出现故障,存活数就为1了,1<3/2,所以就不能对外提供服务了。
而当我们集群中有4台服务器,坏了1台,存活数为3,3>4/2.所以能继续提供服务,而当两台出现故障,存活数就为2. 2=4/2。zk中规定的是必须要大于半数,所以就不能提供服务了。
那么也就是说,集群中3台和4台你的容灾能力是一样的,都只能坏一台。那么你为什么要多装一台呢浪费资源呢?当然,如果是为了查询效率多装一台,其实也未尝不可的。
那么我们再说说,为什么zk要有集群中存活的节点数必须要超过总节点数的半数才能继续提供服务,这个规定呢?其中最主要的问题,是为了避免脑裂。

为什么zk规定集群中存活数要大于总数的一半?

现在很多公司为了容灾,机房都是分开部署,可能一个在上海,一个在昆明,我们设想一个场景,比如有两个机房,上海的机房有3台服务器,昆明的机房有2台服务器,这9台服务器构成了一个集群。在正常情况下,这个集群是没有问题的,一个leader,4个follow。但是如果当有一天电缆被挖怀了,上海的机房和昆明的机房没法连通了,会存在什么情况呢?
昆明的3台服务器会把票投个其中一台,那么这台有3票,总服务器为5台。3>5/2,所以这个机房能继续提供服务,而对于上海的,2<5/2.所以上海的是不能继续提供服务的,也就是说,即使出现这种故障,也只会有一个leader对外服务,不会存在昆明一个leader,上海一个leader.这样的话就不会存在脑裂的问题,我们设想一下如果没有这个规定,当出现故障的时候就可能会存在多个leader,而这是很致命的。
在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页