Zookeeper学习笔记

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:子节点的数量

企业面试题

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值