zookeeper集群下,有3种角色,分别是领导者(Leader)、跟随着(Follower)、观察者(Observer)。接下来我们分别看一下这三种角色的作用。
领导者(Leader):
事务请求(写操作)的唯一调度者和处理者,保证集群事务处理的顺序性;
集群内部各个服务器的调度者。对于create、setData、delete等有写操作的请求,则要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为事务。
跟随着(Follower)
处理客户端非事务(读操作)请求(可以直接响应)。
转发事务请求给Leader。
参与集群Leader选举投票。
观察者(Observer)
对于非事务请求可以独立处理(读操作)。
对于事务性请求会转发给leader处理。
Observer节点接收来自leader的inform信息,更新自己的本地存储,不参与提交和选举投票。通常在不影响集群事务处理能力的前提下提升集群的非事务处理能力。
如何配置观察者:
在配置文件zoo.cfg写集群配置时需要后面写observer
#配置一个ID为1的观察者节点 server.1=192.168.31.5:2888:3888:observer
Observer应用场景:
提升集群的读性能。因为Observer和不参与提交和选举的投票过程,所以可以通过往集群里面添加observer节点来提高整个集群的读性能。
跨数据中心部署。 比如需要部署一个北京和香港两地都可以使用的zookeeper集群务,并且要求北京和香港客户的读请求延迟都很低。解决方案就是把香港的节点都设置为observer。
leader节点可以处理读写请求;
follower只可以处理读请求,follower在接到写请求时会把写请求转发给leader来处理。
Zookeeper数据一致性保证:
- 全局可线性化(Linearizable )写入∶先到达leader的写请求会被先处理,leader决定写请求的执行顺序。
- 客户端FIFO顺序∶来自给定客户端的请求按照发送顺序执行。
本节介绍的一主两从的集群搭建。
准备三台虚拟机
192.168.31.5
192.168.31.176
192.168.31.232
每台机器根据单机环境先进行单机环境的搭建 ;
注意:根据单机环境搭建集群的每个节点时,先不要启动,继续按照一下后续步3.2骤修改完文件以及3.3创建myid文件后再启动。否则启动集群节点时可能会出现状态是standalone的问题,解决看3.4启动时遇到的问题进行解决。
单机环境搭建参考:Zookeeper特性与节点数据类型详解-CSDN博客中的Zookeeper单机搭建。
修改每台机器中zookeeper的zoo.cfg文件
vim zoo.cfg
#修改数据存储目录 dataDir=/app/zookeeper/data #文件末尾追加配置内容 server.1=192.168.31.5:2888:3888 server.2=192.168.31.176:2888:3888 server.3=192.168.31.232:2888:3888
集群配置内容含义:
server.Number=IP:port1:port2
Number 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 dataDir目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个server。
IP 是这个服务器的地址;
port1 是这个服务器Follower与集群中的Leader服务器交换信息的端口;
port2 是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
vim myid
启动前需要关闭防火墙(生产环境需要打开对应端口)
分别启动三个节点的zookeeper的server
#启动节点 bin/zkServer.sh start #查看节点状态 bin/zkServer.sh status
如列图所示,我依次启动了192.168.31.5、192.168.31.176、192.168.31.232服务器中zk的节点,每次都是启动后直接查看状态,他们的状态都是follower。
待三台机器都启动完成后,我再次差看个节点的状态,192.168.31.5这台机器zk的节点变为了leader。
所以,三个节点启动后状态是leader或者follower才表示集群启动成功了。
集群启动时有可能会失败,一般情况就是zoo.cfg配置错误或者防火墙没有关闭(生产环境端口没有开放)
#centos7
# 检查防火墙状态
systemctl status firewalld
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
解决:
1. 检查zoo.cfg文件中有书写错误是否有误;
2. 如果这台机器上有单机版的zookeeper启动,关闭之前的zookeeper,重新启动;(我的单机版的zk改配置,变为集群节点时就遇到的是这个问题。)
在启动zookeeper时,报zkServer.sh权限不足,当时没有截图记录,但和下述截图中zkCli.sh权限不足一样,明明有root权限,但是就是提示权限不足。
接下来,以解决zkCli.sh权限不足为例,解决该问题,如遇到zkServer.sh权限不足,可参考这个解决方法;
进去zookeeper的bin目录后,执行以下指令
chmod a+xwr zkCli.sh
再次执行
./zkCli.sh
客户端执行成功了