概述:
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:最后更新的事务zxidmtime-znode:最后修改的毫秒数(从1970年开始)pzxid-znode:最后更新的子节点zxid。cversion-znode:子节点变化号,znode子节点修改次数dataversion-znode数据变化号aclversion-znode:访问控制列表的变化号ephemeralOwner-:如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0.dataLength-znode:数据的长度numChildren-znode:子节点的数量 企业面试题 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



