此篇文章我们会简单讲解一下zookeeper的下载,启动,配置文件解析,集群配置方式以及角色的分工
一、下载并启动
下载地址: https://zookeeper.apache.org/releases.html 建议下载历史版本,就算查找问题也容易点
下载解压后
解压好了之后我们首选先把conf目录下的zoo_sample.cfg备份一份,然后修改名字为zoo.cfg(此时为单机模式)
此时的zoo.cfg才是我们真正需要的配置文件
然后让我们打开这个文件,修改一个配置:dataDir
这个dataDir是我们存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。
同时建议建议同时添加配置参数dataLogDir(此配置默认无), 事务日志的写性能直接影响zk性能。
由于我是windows机 所以将它配置为:dataDir=D:/Install/study/zookeeper/data
同时我的zookeeper放在了 D:/Install/study/zookeeper/
配置好了,然后让我们来启动
进入bin目录,同时在当前目录打开cmd。输入zkServer.cmd(windows双击 zkServer.cmd ; linux下使用 zkServer.sh start )
启动成功如下
检测是否连接成功:windows下双击 zkCli.cmd linux下使用 zkCli.sh start
二、Zoo.cfg配置信息
化简后的配置文件
tickTime=2000 // 心跳时间,同时session最小超时时间是该时间的二倍
initLimit=10 // follower启动后会同步leader同步最新数据,然后确定自身对外服务状态。leader允许 follower在initLimit时间内完成此次工作。如果zk集群过大,可能会考虑增加字段大小
syncLimit=5 // 发出心跳后的最大响应时间
dataDir=/tmp/zookeeper // 存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。
clientPort=2181 // 客户端连接server的端口,即对外服务端口。
加下来的不是默认添加的
dataLogDir // 事务日志输出目录。未配置则使用 dataDir
maxClientCnxns //单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那 么表明不作任何限制。
三、ZK集群搭建
由于是单机情况下 我们需要使用不同的端口来模拟集群
首选复制三个zookeeper,同时每个配置文件内容不一致
三个文件除端口号以及dataDir路径了不同以外,全部一致
然后分别创建好配置文件中的dataDir
并且在三个文件夹中 各自创建一个文件 命名为 myid 注意 没有后缀!!! 同时此字段大小非常重要,会在leader选举中占据很大作用!!!
在文件中分别写入 1 2 3 请注意 此文件中的内容,应该与上面配置文件中server.后面的名称一致!!!!
然后我们就可以启动zk了
我们首先启动第一个zk,我们会发现,zk在疯狂的报错,我们也可以通过启动 zkCli.cmd 来判断是否启动成功。
然后不要慌,我们在启动下一个zk,然后我们就会发现 两个ZK都已经成功启动,如下图,是我们的客户端启动后成功连接
以此启动三个zk,代表我们集群已经搭建成功。
至于我们为什么刚才只启动一台,启动失败,原因是zk的过半原则,由于只启动一台,少于我们配置三台的一半,所有无法启动成功。
注:
1、我们可以通过执行 zkServer.sh status 来判断当前zk的状态,是leader还是follower(linux下)
2、集群配置文件中的 server.1=localhost:2887:3887 其中第一端口代表leader和leaner中间数据同步使用的端口,第二个端口,代表选举中的投票阶段使用的端口。
四、角色
ZK里面有四种角色:
leader(领导者):投票的发起者和决议者,以及最终更新节点状态。
follower(跟随者):接受客户请求,读请求自身处理,写请求转发给leader,leader发起投票,follower参与投票,返回ask。
observer(观察者):接受客户请求,读请求自身处理,写请求转发leader,leader发起投票,但是observer不参与投票!!!
leaner(学习者):与leader保持状态同步的统称为学习者,以上follwer和leaner均为学习者。
总体的说一下这个流程:
每当一个zk启动的时候,整个集群将进入恢复模式(Zab协议),投票选举出一个leader。
每当有请求请求到集群后,读请求自身处理,写请求如果是follower,会将请求转发给leader,leader则发起投票,接收每个返回的ack,如果超过一半的同意此次投票,然后将执行写操作,并将数据同步给所有的leaner。
observer不参与投票,他的作用是减少投票压力,同时由于不参与投票,所以observer不会受到过半原则的影响导致zk集群无法启动。同时obsever是在配置文件里提前写好的,需要在你想要设置为observer的地址后面拼接 :observer 请注意使用冒号拼接的
zk中有两个主要任务,一个是客户端请求处理,二是投票。当我们的集群过大的时候,由于投票需要时间变长,所以我们的写操作的效率也会变得下降,所以zk引入了observer,他不参与投票,增加投票效率,所以能增加写操作的效率。