Zookeeper简介
- 概述:
- Zookeeper是一个开源的分布式,为分布式应用提供协调服务的Apache项目
- Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责储存和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出反应。
- 特点
- Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
- 集群只要半数以上节点存活,Zookeeper集群就能正常服务。(半数机制)
- 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪一个Server,数据都是一致的
- 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
- 数据原子性,一次数据更新要么成功,要么失败。
- 实时性,在一定时间范围内,Client能读取到最新数据
- Zookeeper中的数据结构
- Zookeeper数据结构模型与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每个ZNod默认能存储1MB的数据,每个ZNod都可以通过其路径唯一标识。
- 应用场景
- 统一命名服务:在分布式环境下,经常需要对应用/服务器进行统一命名,便于识别。
- 统一配置管理:
- 分布式环境下,配置文件同步非常常见。
- 一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。
- 对配置文件修改后,希望能够快速同步到各个节点上。
- 配置文件管理可以由Zookeeper实现
- 可将配置信息写入Zookeeper上的ZNode。
- 各个客户服务器监听这个ZNode节点。
- 一旦ZNode中的数据被修改,Zookeeper将通知各个客户端服务器
- 分布式环境下,配置文件同步非常常见。
- 统一集群管理:
- 分布式环境中,实时掌握,每个节点的状态是必要的,Zookeeper可以根据节点实时状态做出一些调整。
- Zookeeper可以实现实时监控节点状态变化
- 可将节点信息写入到Zookeeper上的一个ZNode。
- 监听这个ZNode可获取它的实时状态变化。
- 服务器动态上下线:客户端能实时洞察到服务器上下线的变化
- 软负载均衡:在Zookeeper中记录没太服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
Zookeeper内部原理
- 节点类型
- 持久(Persistent):客户端和服务器断开链接后,创建的节点不删除。
- 短暂(Ephemeral):客户端和服务器断开链接后,创建的节点自己删除。
说明:创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序是一个单调递增的计数器,由父节点维护。
注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
- Stat结构体
- czxid:创建节点的事务zxid
- 每次修改Zookeeper状态都会收到一个zxid形式的时间戳,也就是Zookeeper事务ID。
- 事务ID是Zookeeper中所有修总的次序,每次修改都有唯一的zxid,如果zxid小于zxid2,那么zxid1在zxid2之前发生
- ctime - znode :被创建的毫秒数(从1970年开始)
- mzxid - znode:最后更新的事务zxid
- mtime-znode:最后修改的毫秒数(从1970年开始)
- pzxid-znode:最后更新的子节点zxid。
- cversion-znode:子节点变化号,znode子节点修改次数
- dataversion-znode数据变化号
- aclversion-znode:访问控制列表的变化号
- ephemeralOwner-:如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0.
- dataLength-znode:数据的长度
- numChildren-znode:子节点的数量
- czxid:创建节点的事务zxid
企业面试题
1.请简述Zookeeper的选举机制。
-
初始化
当启动初始化集群的时候,server1的myid为1,zxid为0,server2的myid为2,zxid同样是0,依次类推,此种情况下都是为0.先比较zxid,在比较myid
- 服务器1启动,给自己投票,然后发投票信息,由于其他机器还没有启动所以它收不到如何反馈信息,服务器1的状态一直属于Looking(选举状态)。
- 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的myid大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是Looking状态
- 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的myid最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为leader,服务器1,2,成为follower。
- 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的myid大,但之前服务器3已经胜出,所以服务器4只能成为follower。
- 服务器5启动,后面的逻辑同服务器4一样成为follower
当选举机器过半的时候,已经选举出leader后,后面的就跟随已经选出的leader,所以4和5跟随成为leader的server3,所以,在初始化的时候,一般到过半的机器的时候谁的myid最大一般就是leader
-
运行期间
按照上述初始化的情况,server3成为了leader,在运行期间处于leader的server3挂了,那么server1,server2,server4,server5会将自己的节点状态变为Looking状态
- 开始进行选举leader选举,现在选举同样是根据myid和zxid来进行的
- 首先每个server都会给自己投一票竞选leader,假设server1的zxid为123,server2的zxid为124,server4的zxid为169,server5的zxid为188.
- 同样先根据zxid进行比较,在比较到server4时超过半数,所以server4成为新的leader,即使server5的zxid比server4的zxid大,但此时已经出现了leader,比较已经没用了,所以此时server4成为新的leader
2. Zookeeper的监听机制原理是什么?
- 监听原理详解:
- 首先要有一个main()线程
- 在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信,(connect),一个负责监听(listener)
- 通过connect线程将注册的监听事件发送给Zookeeper
- 在Zookeeper的注册监听表中将注册到的监听事件添加到列表中
- Zookeeper监听到有数据或路径的变化,就会将这个信息发送给listener线程
- listener线程内部调用process()方法
- 常见的监听
- 监听节点数据的变化:get path[watch]
- 监听子节点增减的变化:ls path[watch]
3.Zookeeper的部署方式有哪几种?集群中的角色有哪些,集群最少需要几台机器
- 部署方式为单机模式和集群模式
- 角色:Leader 和 Follower
- 集群中最少需要的机器数为:3
4.Zookeeper的常用命令
- ls、create、get、delete、set