Zookeeper,一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
Zookeeper集群包含一个Leader、若干个follower,集群只要有半数以上节点存活Zookeeper集群就能正常服务。
- 集群全局数据一致;
- 更新请求顺序进行:来自同一个Client的更新请求按其发送顺序依次执行;
- 数据更新原子性:一次数据更新要么成功,要么失败。
- 实时性:在一定时间范围内,Client能读到最新数据。
Zookeeper安装
先将下载好的安装包解压
[root@hadoop102 software]# tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
安装包解压后,修改zoo_sample.cfg文件名称为zoo.cfg
[root@hadoop102 apache-zookeeper-3.5.8]# cd conf/
[root@hadoop102 conf]# mv zoo_sample.cfg zoo.cfg
修改该文件内容
[root@hadoop102 conf]# vim zoo.cfg
新建文件夹zkData,
修改dataDir为/opt/module/apache-zookeeper-3.5.8/zkData
启动Zookeeper
[root@hadoop102 apache-zookeeper-3.5.8]# bin/zkServer.sh start
内部原理
选举机制
- 半数机制:集群半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
- Zookeeper工作时,一个节点为Leader,其他为Follower,Leader是通过内部选举机制临时产生的。
- Zookeeper提供了三种方式LeaderElection、AuthFastLeaderElection、FastLeaderElection(最新默认),这里主要分析FastLeaderElection。
选举流程简述:
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
- 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
- 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
- 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
- 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
- 服务器5启动,后面的逻辑同服务器4成为小弟。
节点类型
Zookeeper服务器的节点Znode有两种类型:
-
短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除
-
持久(persistent):客户端和服务器端断开连接后,创建的节点不删除
Znode有四种形式的目录节点(默认是persistent )
-
持久化目录节点(PERSISTENT):客户端与zookeeper断开连接后,该节点依旧存在;
-
持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL):客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号;
-
临时目录节点(EPHEMERAL):客户端与zookeeper断开连接后,该节点被删除;
-
临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL):客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。
分布式部署
一共有三台机器102、103、104,在102上已经安装好了Zookeeper,同步文件到103、104
[root@hadoop102 module]# xsync zookeeper-3.4.10/
接着配置服务器编号,
新建文件
[root@hadoop102 zookeeper-3.4.10]# cd zkData/
[root@hadoop102 zkData]# touch myid
编辑
[root@hadoop102 zkData]# vim myid
里面写上2(对应的服务器号码),注意不能有其他空格。
拷贝文件到103、104
[root@hadoop102 zkData]# xsync myid
再分别修改103、104中文件内容为3、4。
修改文件,增加配置
[root@hadoop102 zookeeper-3.4.10]# vim conf/zoo.cfg
############cluster############
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
其中hadoop102是服务器ip(这里配置了域名),2888是这个服务器与集群中Leader服务器交换信息的端口,3888是执行选举时服务器相互通信的端口(万一Leader服务器挂了,就需要重新选举,这就会用到这个端口)。
然后拷贝该文件到其他服务器
[root@hadoop102 zookeeper-3.4.10]# xsync conf/zoo.cfg
分别在3个机器上启动Zookeeper
[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop104 zookeeper-3.4.10]# bin/zkServer.sh start
查看状态
[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh status
[root@hadoop104 zookeeper-3.4.10]# bin/zkServer.sh status
然后发现103成为了Leader、其他服务器是Follower。
现在可以进入客户端了
[root@hadoop102 zookeeper-3.4.10]# bin/zkCli.sh