为什么需要leader选举
什么时候会出现leader选举
服务器初始化启动的时候.
小栗子: 回想你大一新生刚刚入学的时候, 是不是班级都会选举一个班长出来?
服务器运行期间无法和leader保持连接.
这个更简单了, leader挂掉了, 自然需要重新选举了.
选举的规则, 也就是说凭什么你当老大
服务器ID
比如有三台服务器, 编号分别是1,2,3
那么编号越大在选择算法中的权重越大. (很粗暴, 谁编号大谁就厉害)
数据ID
服务器中存放的最大数据ID
值越大说明数据越新, 在选举算法中权重越大.
超过半数投票者为leader
这就是选举的核心了, 只要有半数以上投票就是leader了, 后面的即便服务器ID比我高, 那你也只能是following了.
选举的状态
以一个小栗子说明整个选举的过程
假设有五台服务器组成的zookeeper集群, 它们的id从1-5, 同时它们都是最新启动的, 也就是没有历史数据 (所以我们就只需要考虑服务器ID即可, 不用考虑数据了). 假设这些服务器依序启动, 来看看会发生什么。
接下来我们来搭建一个三个节点的Zookeeper集群(伪集群)。什么是伪集群? 就是在一台服务器上不同端口的三个Zookeeper组成. 注意要不同端口.
上面几步就不在笔记中写了, 相信有一定linux基础的人都没有问题.
第一步: 上传Zookeeper安装包, 并解压缩
首先可以去官网上下载Zookeeper的安装包 http://mirrors.shu.edu.cn/apache/zookeeper/
也可以到这个网址 http://apache.fayea.com/zookeeper/
第二步: 将解压好的Zookeeper文件夹复制3份出来
第三步: 修改配置文件zoo.cfg 中端口和dataDir的目录
三个Zookeeper都修改一遍, dataDir分别对应自己的data目录, 端口分别为2181, 2182, 2183.
首先修改配置文件的名字为zoo.cfg
-------------------------------------------------
[root@simple01 zookeeper-1]# mkdir data
[root@simple01 zookeeper-1]# cd conf
[root@simple01 conf]# mv zoo_sample.cfg zoo.cfg
然后修改配置文件zoo.cfg 中端口和dataDir的目录
-------------------------------------------------
[root@simple01 conf]# vim zoo.cfg
第四步: 给每个Zookeeper一个自己的编号, 放在data目录下的myid文件中
[root@simple01 zookeeper-cluster]# echo 1 > /usr/local/zookeeper-cluster/zookeeper-1/data/myid
[root@simple01 zookeeper-cluster]# echo 2 > /usr/local/zookeeper-cluster/zookeeper-2/data/myid
[root@simple01 zookeeper-cluster]# echo 3 > /usr/local/zookeeper-cluster/zookeeper-3/data/myid
第五步: 在每个节点上配置整个集群的所有服务器IP列表
让所有节点都知道我这个服务器上有多少个节点.
在每个Zookeeper的conf/zoo.cfg配置文件末尾加
server.{编号}={服务器IP}.{Zookeeper之间相互通信的端口}.{Zookeeper投票选举的端口}
---------------------------------------------
server.1=192.168.179.133:2881:3881
server.2=192.168.179.133:2882:3882
server.3=192.168.179.133:2883:3883
第六步: 到这里我们就配置完成了, 接下来就可以测试了
进入Zookeeper的bin目录下, 启动即可
./zkServer.sh start
-------------------------------
可以查看状态
./zkServer.sh status
可以看到, 我们在启动2号Zookeeper的时候, 2号的状态已经是leader了.
安装Zookeeper集群还是挺简单的吧? 我们稍稍总结下我们都做了什么事情.
我们选择直接将leader给Stop掉, 模拟leader宕机的现象, 我们来看看是否还能正常工作呢?
进入编号为2的Zookeeper的bin目录中, 执行下面语句
./zkServer.sh stop
按照我们的思考, 当leader挂掉的时候会自动开始选举, 那么编号最大的3号Zookeeper应该成为leader, 那么我们就看下是否如此呢?
进入编号为3的Zookeeper中, 查看状态
./zkServer.sh status
我们看到了下面的结果:
很显然, 我们的3号Zookeeper成为了leader. 集群依然正常运行.
那么, 就有个问题了
问题一: 如果我再把3号Zookeeper停掉呢? 集群还能正常工作吗?
问题二: 在集群中, 有2n+1个节点, 最多允许多少个节点挂掉呢 ?