ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口.ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos做了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。
下载、安装
下载之前要在本地的机器上安装好java环境。 下载地址 https://dlcdn.apache.org/zookeeper/stable/ 下载之后的文件为tar包 (apache-zookeeper-3.8.4-bin.tar.gz) 解压apache-zookeeper-3.8.4-bin.tar.gz 解压之后的目录bin如下截图:
zookeeper选举算法源码分析梳理记录内容
配置文件(单机)
解压之后启动之前需要修改、增加相应的配置文件。 复制conf下的zoo_sample.cfg文件重命名为zoo.cfg。zoo.cfg中的配置项如下(重点修改下面标红的参数): tickTime=2000 initLimit=10 syncLimit=5 dataDir=e:/albc/albc_zk_data1 dataLogDir=e:/albc/albczk_data1/log clientPort=2182
配置文件参数说明:
tickTime=2000: tickTime这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳; initLimit=10: initLimit这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。 当已经超过10个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 102000=20 秒; syncLimit=5: syncLimit这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是52000=10秒; dataDir=e:/zk/zk/data dataDir是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里;也可以指定日志存放地方。 dataDir=e:/zk/zk/log dataLogDir是Zookeeper保存数据的目录 clientPort=2182 clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求
启动(单机)、连接
进入bin目录 执行zkServer.cmd| zkServer.sh –args args的选项 为:start|startforeground|stop|restart|status|upgrade|print-cmd 服务启动成功之后,在bin目录下执行 zkCli.cmd –server ip:port
配置集群
进入conf目录下,复制一份zoo_sample.cfg重命名为cluster.cfg cluster.cfg的配置内容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=../../zkdata/serverC/data
dataLogDir=../../zkdata/serverC/log
clientPort=2190
server.1=192.168.245.128:2888:3888
server.2=192.168.245.129:2889:4888
server.3=192.168.245.130:2880:5888
说明:server.A=B:C:D:
A是一个数字,表示这个是第几号服务器 B是这个服务器的ip地址C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口 D是在leader挂掉时专门用来进行选举leader使用的 设置服务器编号 进入dataDir指定的目录中,创建myid文件,文件内容为对应ip后面的那个数字。 进入bin目录 复制zkEnv.sh|zkEnv.cmd重命名为zkEnvCluster.sh|zkEnvCluster.cmd,修改zkEnvCluster中使用zoo.cfg改为cluster.cfg。
其他机器的配置类似,依次完成集群中所有机器的配置。
启动集群、连接
集群中所有机器配置完成之后,依次进入每台机器的bin目录下执行
zkServerCluster.cmd|zkServerCluster.sh –args
args的选项为: start|startforeground|stop|restart|status|upgrade|print-cmd
第一个启动的机器会报以下错误:
2023-11-25 16:16:58,388 - WARN [WorkerSender Thread:QuorumCnxManager@379] -
Can not open channel to 2 at election address /192.168.245.129:4888
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
2023-11-25 16:14:59,405 - WARN [WorkerSender Thread:QuorumCnxManager@379] - Can not open channel to 3
at election address /192.168.245.130:5888 java.net.ConnectException:
Connection refused: no further information at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
注:由于其他server还没有启动,所以会出现上面的报错信息,等剩下的两个server都启动后就不会报错了。
集群的连接与单机的连接一样。
讲了这么多,到底zookeeper可以做什么,哪些业务场景适合使用呢?
以上图片内容来自ProcessOn 模板社区,你可以点击此链接查看详情。如果你想要将自己的知识结构化记录下来,ProcessOn 是你的绝佳选择,提供多种专业图形的绘制工具和丰富的模板内容,支持工作、学习和生活各个方面的应用。