- Zookeeper = 文件系统 + 通知机制
特点
- Zookeeper:一个领导者(Leader),多个跟随者(Follower),组成的集群。
- 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。
- 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
- 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行。
- 数据更新原子性,一次数据更新要么成功,要么失败。
- 实时性,在一定时间范围内,Client能读到最新数据。
应用场景
- 统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡
相关命令
#zk启动
[wmj]$ bin/zkServer.sh start
#停止Zookeeper
[wmj]$ bin/zkServer.sh stop
#查看进程是否启动
[wmj]$ jps
#查看状态 进入到 zookeeper-3.4.**目录下
[wmj]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: ****/bin/../conf/zoo.cfg #使用的配置文件
Mode: leader #他是一个leader
#启动客户端
[wmj]$ bin/zkCli.sh
#退出客户端
[zk: localhost:2181(CONNECTED) 0] quit
#停止zk
[wmj]$ bin/zkServer.sh stop
#客户端命令行操作
#启动客户端
[wmj]$ bin/zkCli.sh
#显示所有操作命令
[zk: *** 1] help
#查看当前znode中所包含的内容
[zk: *** 1] ls /
#查看当前节点详细数据
[zk: *** 1] ls2 /
#分别创建2个普通节点
[zk: *** 1] create /sanguo "jinlian"
#获得节点的值
[zk: *** 1] get /sanguo
[zk: *** 1] get /sanguo/shuguo
#创建短暂节点
[zk: *** 1] create -e /sanguo/wuguo
#创建带序号的节点
[zk: *** 1] create -s /sanguo/weiguo/xiaoqiao "jinlian"
#修改节点数据值
[zk: *** 1] set /sanguo/weiguo "simayi"
#节点的值变化监听
[zk: *** 1] get /sanguo watch
#节点的子节点变化监听(路径变化)
[zk: *** 1] ls /sanguo watch
#删除节点
[zk: *** 1] delete /sanguo/jin
#递归删除节点
[zk: *** 1] rmr /sanguo/shuguo
#查看节点状态
[zk: *** 1] stat /sanguo
#退出客户端
[zk: *** 1] quit
配置参数解读
-
进入到zoo.cfg中有以下几个关键参数
# 通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒 tickTime=2000 # LF初始通信时限,集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。 initLimit=10 # LF同步通信时限,集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。 syncLimit=5 # 数据文件目录+数据持久化路径 dataDir=/opt/module/zookeeper-3.4.10/zkData # 客户端连接端口 监听客户端连接的端口。 clientPort=2181 # server.A=B:C:D。 # A是一个数字,表示这个是第几号服务器; # 集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。 # B是这个服务器的ip地址; # C是这个服务器与集群中的Leader服务器交换信息的端口; # D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。 server.2=hadoop102:2888:3888 server.3=hadoop103:2888:3888 server.4=hadoop104:2888:3888
选举机制
- 半数机制:集群中半数以上机器存活,集群可用。所以 Zookeeper 适合安装奇数台服务器。例如,5台服务器有3台存活,集群可用,而只有2台存活,集群不可用。
- Zookeeper 虽然在配置文件中并没有指定 Master 和 Slave。 但是, Zookeeper 工作时,是有一个节点为 Leader,其他则为 Follower, Leader 是通过内部的选举机制临时产生的。
- 例子:5台机器依次启动,1启动,选举无法完成;2启动未达到半数,选举无法完成;3启动,超过半数,3为Leader,1、2为Follower,4、5为Follower。
监听器原理
-
首先要有一个main()线程
-
在main线程中创建Zookeeper客户端, 这时就会创建两个线程, 一个负责网络连接通信( connet ), 一个负责监听( listener )。
-
通过connect线程将注册的监听事件发送给Zookeeper。
-
在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
-
Zookeeper监听到有数据或路径变化, 就会将这个消息发送给listener线程。
-
listener线程内部调用了process()方法。
写数据流程
- Client 向 ZooKeeper 的Server1 上写数据,发送一个写请求。
- 如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server, 比如Server1和Server2,各个Server会将该写请求加入待写队列,并向Leader发送成功信息。
- 当Leader收到半数以上 Server 的成功信息, 说明该写操作可以执行。Leader会向各个Server 发送提交信息,各个Server收到信息后会落实队列里的写请求, 此时写成功。
- Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。