第一部分:zookeeper的简介
Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式 协调 服务 service
包含一个简单的原语集,分布式应用程序可以基于它实现:
开源领域 首屈一指
特点:
zkfc是zk的客户端,就hdfs来说,zkfc连接这zk和NN。
节点启动后第一步在zk集群里完成注册。创建节点。 当某个NN挂掉后,
一个集群,zk中有三个事要做,1.注册(创建目录树) 2.事件监听(通知) 3.回调函数(回调zkfc客户端执行方法,让节点提升一个节点下降,回调方法由zkfc自己执行的)
leader有执行事务的权限,其他的从节点只是负责接受客户端发来的请求,如果越过了从节点的范围,从节点会请示leader,然后leader通过过半的follower的同意反馈后发送号令给每一个follower执行某个操作(通过消息队列的方式)。达到最终一致性。
zookeeper的谦让选举模式
leader挂掉后,选举新的leader。首先zxId(事务Id/版本Id)(节点服务器编号)。然后如果版本相同情况下,再参考serverId(myId)大的选。
角色模型
- 集群状态
- 选举模式 安其内
- 广播模式 壤其
- Server状态
- LOOKING:当前Server不知道leader是谁,正在搜寻
- LEADING:当前Server即为选举出来的leader
- FOLLOWING:leader已经选举出来,当前Server与之同步
主从分工
- 领导者(leader)
- 负责进行投票的发起和决议,更新系统状态
- 学习者(learner)
- 包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票
- 领导者(leader)
Observer
- 可以接受客户端连接,将写请求转发给 leader,但observer不参加投票过程,只同步leader 的状态,observer的目的是为了扩展系统,提高读取 速度
客户端(client)
请求发起方
- 可以接受客户端连接,将写请求转发给 leader,但observer不参加投票过程,只同步leader 的状态,observer的目的是为了扩展系统,提高读取 速度
第二部分:zookeeper的搭建
准备三个节点,node01,node02,node03
- 1.准备3个节点 java 安装
- 2.所有集群节点创建目录: mkdir opt/jw
- 3.zk压缩包解压在其他路径下::
tar xf zookeeper-3.4.6.tar.gz -C /opt/jw/
- 4.进入conf目录,拷贝zoo_sample.cfg zoo.cfg 并配置
dataDir,集群节点。 - 5.单节点配置环境变量、并分发 ZOOKEEPER_PREFIX,共享模式读取profile
- 6.共享创建 /var/jw/zk目录,进入各自目录 分别输出1,2,3 至文件 myid
echo 1 >> /var/jw/zk/myid - 7.共享启动zkServer.sh start 集群
- 8.启动客户端 help命令查看
第4步(修改加粗部分即可):
tickTime=2000
dataDir=/var/jw/zk
dataLogDir=/Users/zdandljb/zookeeper/dataLog clientPort=2181
initLimit=5 syncLimit=2
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888
tickTime
:发送心跳的间隔时间,单位:毫秒
dataDir
:zookeeper保存数据的目录。
clientPort
:客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客
户端的访问请求。
initLimit
: 这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连 接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5 个心跳的 时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表 明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit
:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4
server.A=B:C:D:其 中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一 集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这 个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是 一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号
客户端操作:
启动:
zkCli.sh
可通过help来查看如何使用。
比如创建节点。create /jw abc
获取节点信息:get /jw
abc
cZxid = 0x2400000018
ctime = Tue Mar 20 19:46:21 CST 2018
mZxid = 0x2400000018
mtime = Tue Mar 20 19:46:21 CST 2018
pZxid = 0x2400000018
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
如果:set /jw chenx
chenx
cZxid = 0x2400000018
ctime = Tue Mar 20 19:46:21 CST 2018
mZxid = 0x2400000019 // 线性增长
mtime = Tue Mar 20 19:51:21 CST 2018
pZxid = 0x2400000018
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
如果在新增目录机构。pZxid会增加。
create -s / jw xxx
-s表示用序列来创建。同一个jw节点可反复创建,只是会自动按序列命名。
Znode有两种类型,短暂的(ephemeral)和持久的(persistent)
- Znode支持序列SEQUENTIAL:leader
- 短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点
- 持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除
Znode的类型在创建时确定并且之后不能再修改
Znode有四种形式的目录节点 - PERSISTENT
- EPHEMERAL
- PERSISTENT_SEQUENTIAL
- EPHEMERAL_SEQUENTIAL
会话session
- 客户端与集群节点建立TCP连接后获得一个session
- 如果连接的Server出现问题,在没有超过Timeout时间时,可以连接其他节点
- 同一session期内的特性不变
Session是由谁来创建的?
- Leader:产生一个唯一的session,放到消息队列,让所有server知道
(过半)
事件监听Watcher
- Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所 关注的目录节点的状态发生变化,而做出相应的反应
- 可以设置观察的操作:exists,getChildren,getData
- 可以触发观察的操作:create,delete,setData
回调client方法
业务核心代码在哪里?
- client