6.1 Zookeeper 是什么
Zookeeper 实际上就是 文件系统 + 通知机制。
- Zookeeper 是一个基于 观察者模式 设计的分布式框架,它负责存储大家都关心的数据,然后接受观察者的注册。
- 一旦数据发生了变化,Zookeeper 就负责通知已经注册的那些观察者,从而实现集群中类似 Master/Slave 管理模式。
6.2 Zookeeper 特点
Zookeeper 是由一个领导者(leader)和多个跟随者(follower)组成的集群
- leader:负责投票的发起和决议,更新系统状态
- follower:负责接收客户请求并向客户端返回结果,在选举 leader 的过程中参与投票
Zokeeper 具有以下特点:
- 集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务。
- 全局数据一致:每个 server 保存一份相同的数据副本,client 无论连接到哪个 server,数据都是一致的。
- 数据更新原子性:一次数据更新要么所有机器都成功,要么都失败。
- 实时性:在一定时间范围内,client 能读到最新数据。
6.3 选举机制
半数机制(Paxos 协议):集群中半数以上机器存活,集群可用。所以 zookeeper 适合装在奇数台机器上。
当集群开启的数量在半数以上时,就会将 Leader 选出来,下面以一个简单的例子来说明 FastLeaderElection 选举机制的整个过程。
例如,有 id 为1,2,3三台机器,按顺序启动,第一台开启时,zookeeper 的日志会报错,因为启动数量没有达到集群的一半。继续启动机器2,数量多于一半,然后根据 id 的大小选出 Leader,则2号当选。当3号机器启动时, Leader 已经存在,则只能当小弟了。
6.4 监听器原理
-
首先有一个 main() 线程
-
在 main 线程中创建 Zookeeper 客户端,会创建两个线程,connect 负责网络连接通信,listener 负责监听
-
通过 connect 线程将注册的监听事件发送给 Zookeeper
-
在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中
-
Zookeeper 监听到有数据或路径变化,就会将这个消息发送给 listener 线程
-
listener 线程内部调用了process()方法
6.5 常用命令
- ls:查看子节点
- get:获取节点信息
- create:创建节点