集群
# 角色
集群中不同的机器可能存在不同的分工,这样才能保障集群的稳定运行(意见不一致时听谁的),与读写策略的实施(如读写分离等)。
ZooKeeper 集群中有三个角色/分工:
- 领导者 Leader:负责处理事务请求(写操作),并在事务请求结束后将数据同步给别的服务器。同时也负责调度集群内部的各个服务器
- 跟随者 Follower:负责处理非事务请求(读操作),并在收集到事务请求后转发给 Leader 服务器。且参与 Leader 的选举投票
- 观察者 Observer:只负责处理非事务请求和对事务请求的转发,不参与 Leader 的选举投票
# 选举
leader 在掉线后,所有的 follower 会重新选举出一个 leader ,选举有两个权重:
- ServerId:机器编号,编号越大权重越高
- ZxI:数据编号,编号越大说明数据越新,权重越高
一台机器被选举为 leader 需要集群中超过半数的机器的投票,如果一个集群中已存在一个 leader,那么后续再添加到这个集群中的节点都会认定此节点为 leader
# 搭建过程
首先在 配置启动文章中的安装部分 我们所安装的文件夹要装三份,正常来说应该是三台主机各一份的,这里拿同一个主机做三个进程来演示(变更的只有 ip 部分,下面遇到了会说明)。
这里将它们分别命名为了 zookeeper1、zookeeper2、zookeeper3 代表三台服务端。
在你的 zookeeper* (*是你要设置的那个服务端)下的 conf/zoo.cfg 内写上如下内容
dataDir=<这里写上你的zookeeper*的绝对路径>/data
clientPort=218*
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
2
3
4
5
288* 是一个默认的服务端通信的端口,集群内的多台机器用它进行通信
388* 是一个默认的投票端口,这些机器用这个端口进行投票
然后要在 <你的zookeeper*路径>/data/myid
这个文件内容写为 *
,也就是你如果是 zookeeper1 那么就设置它的内容为 1
接下来将这三台机器分别进入 bin/zkServer.sh 进行启动
启动后用 zkServer.sh status
分别检测每一台机器的运行状态
若最后一行出现 Mode: follower
或者 Mode: leader
的字样,就说明集群启动成功了,Mode 对应的是集群的角色
# 异常情况
集群在 follower 的机器被停掉后,只要不超过半数,别的机器就正常提供服务。
一旦整个集群内超过半数的机器挂掉后,别的机器就会一起停止提供服务(注意这里进程不会连带崩溃,只是机器不提供服务了)。
而这样因为半数宕机而无法提供服务的集群,若宕掉的机器重新开启超过半数,则它们会恢复服务提供。
若集群 leader 停掉后,集群内会重新选举出一个新的 leader 向外提供服务。