Zookeeper概述
1 概述
-
Zookeeper是一个开源的、分布式的,为分布式应用提供协调服务的Apache项目。
-
Zookeeper从设计模式的角度来看,是一个基于观察者模式设计的分布式服务管理框架
-
它负责管理大家都关心的数据,然后接收观察者的注册
-
一旦数据发生变化,Zookeeper就负责通知那些注册在Zookeeper的观察者做出响应的反应
2 特点
-
一个领导者(Leader)多个跟随者(Follower)组成的集群
-
集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务
-
全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到那个Server,数据都是一致的
-
更新请求顺序,来自同一个Client的更新请求按照其发送顺序依次执行
-
数据更新原子性:一次数据更新要么成功要么失败
-
实时性:在一定时间范围内,Client能读到最新的数据
3 Zookeeper数据结构
Zookeeper数据模型结构与Unix文件系统类似,整体可以看做是一棵树,每个节点称作一个Znode
。每一个Znode默认能够存储1Mb的数据,每个Znode都能通过路径进行唯一标识
4 应用场景
- 统一命名服务:对应用、服务进行统一命名
- 统一配置管理:即配置文件的同步和配置管理
- 一般要求一个集群中,所有节点的配置信息是一致的,如Kafka集群
- 对配置文件修改后,希望能够快速同步到各个节点上
- 统一集群管理
- 服务节点动态上下线
- 软负载均衡
目录
Zookeeper内部原理
1 选举机制
- 半数机制:半数以上的机器存活,集群可用,所以Zookeeper适合安装奇数台服务器
- 优先选择自己,不能选出则选节点id最大的那个
2 节点类型
-
持久:客户端和服务器端断开连接后,创建的节点不删除,持久化节点又分为两类:
-
持久化目录节点:客户端和服务器端断开连接后,创建的节点不删除
-
持久化顺序编号目录节点:客户端和服务器端断开连接后,创建的节点不删除,只是Zookeeper对节点名称进行顺序编号
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
在分布式系统中,顺序号可以用于为所有的事件进行全局排序,这样客户端可以根据顺序号来推断事件的顺序
-
-
短暂:客户端和服务器端断开连接够,创建的节点自己删除,短暂节点也分为两类:
- 临时目录几点
- 临时顺序编号目录节点
3 Stat结构体
每次修改Zookeeper节点状态都会收到一个zxid形式的时间戳,也就是Zookeeper事务ID。事务ID是Zookeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2则说明1在2前面发生。
- dataLength-znode的数据长度
- numChild-znode子节点数量
4 ⭐监听器原理
-
首先一个
main线程
用于创建Zookeeper客户端 -
然后在main线程中创建客户端,客户端会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)
-
通过
connet线程
将监听事件发送给Zookeeper,然后在Zookeeper的注册监听列表
中会将注册的监听事件添加到列表中监听事件包含客户端的ip、端口号以及监听路径等信息
-
Zookeeper监听到有数据或者路径发生变化,就会把这个消息发送给客户端的
listener线程
,listener线程内部调用process()
方法
5 ⭐服务器写数据流程
主要是客户端向服务端写数据,怎么保证数据在集群上的同步:
- Client向Zookeeper的Server1上发送写请求
- 如果Server1不是Leader,则会把请求进一步转发给Leader,然后Leader会将请求广播给各个Server,每个Server写成功之后就会通知Leader
- Leader收到半数以上的Follower写成功的通知后,就会告诉最开始接收到写请求的Server1数据写入成功
- Server1会进一步通知Client数据写入成功,这时就认为整个写入操作成功了