ZooKeeper总结

1、ZooKeeper 是什么?
  • 分布式应用程序的协调服务(service)

  • 主从架构 leader;follower或observer

  • Zookeeper 作为一个分布式的服务框架

    • 主要用来解决分布式集群中应用系统的一致性问题

    • 它能提供基于类似于文件系统的目录节点树方式的数据存储,

    • Zookeeper 作用:维护和监控 存储的数据的 状态变化,通过监控这些数据状态的变化,从而达到基于数据的 集群管理

2、ZooKeeper 提供了什么?

(1)文件系统
(2)通知机制

  1. NameNode使用ZooKeeper实现高可用.

  2. Yarn ResourceManager使用ZooKeeper实现高可用.

  3. 利用ZooKeeper对HBase集群做高可用配置

  4. kafka使用ZooKeeper

    • 保存消息消费信息比如offset.
    • 用于检测崩溃
    • 主题topic发现
    • 保持主题的生产和消费状态
3、Zookeeper 文件系统

Zookeeper 提供一个多层级的节点命名空间(节点称为 znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。

Zookeeper 为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M。

4、什么是ZNode
  • ZNode 分为四类:
    • (1)持久节点:create,只有显示的调用命令,才能删除永久节点。
    • (2) 临时节点:create -e,临时节点的生命周期跟客户端会话session绑定,一旦会话失效,临时节点被删除。
    • (3)有序持久节点:create -s,节点名后边会追加一个由父节点维护的自增整型数字。
    • (4)有序临时节点:create -s -e
    • 为什么设计临时节点?
      • 防止多个不同的客户端在同一目录下,创建同名ZNode,由于重名,导致创建失败
5、ZooKeeper事务
  • 为了保证事务的顺序一致性,ZooKeeper采用了**递增的事务id号(zxid)**来标识事务,所有提议(proposal)都有zxid

  • 每次事务的提交,必须符合quorum多数派

  • 客户端的写请求,会对ZooKeeper中的数据做出更改;如增删改的操作每次写请求,会生成一次事务

  • zookeeper每个事务有一个全局唯一的事务ID,用 ZXID 表示;全局自增

  • 事务特点

    • ACID:原子性atomicity | 一致性consistency | 隔离性isolation | 持久性durability
  • ZXID结构:

    • 通常是一个64位的数字。由epoch+counter组成
    • epoch、counter各32位
6、zookeeper 是如何保证事务的顺序一致性的?

zookeeper 采用了全局递增的事务 Id 来标识,所有的 proposal(提议)都在被提出的时候加上了 zxid,

zxid 实际上是一个 64 位的数字,高 32 位是 epoch用来标识 leader 周期,如果有新的 leader 产生出来,epoch会自增,低 32 位用来递增计数。

当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。

7、ZooKeeper原子广播协议

ZooKeeper使用原子广播协议叫做Zab(ZooKeeper Automic Broadcast)协议

  • Zab协议有两种模式

    • 恢复模式(选主):因为ZooKeeper也是主从架构;当ZooKeeper集群没有主的角色leader时,从众多服务器中选举leader时,处于此模式
    • 广播模式(同步):当集群有了leader后,客户端向ZooKeeper集群读写数据时,集群处于此模式
  • 为了保证事务的顺序一致性,ZooKeeper采用了递增的事务id号(zxid)来标识事务,所有提议(proposal)都有zxid

###8、 为什么要用ACL

  • zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,

  • 默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题

  • ACL(Access Control List)可以设置某些客户端,对zookeeper服务器上节点的权限,如增删改查等

  • ACL种类:ZooKeeper 采用 ACL策略来进行权限控制。 定义了5种权限,CREATE: 创建子节点的权限。READ: 获取节点数据和子节点列表的权限。WRITE:更新节点数据的权限。DELETE: 删除子节点的权限。ADMIN: 设置节点ACL的权限。

9、Watcher监视与通知

客户端如何获取ZooKeeper服务器上的最新数据?轮询,监听

什么是Watcher

  • 客户端在服务器端的znode上,注册的事件监听器;

  • watcher用于监听znode上的某些事件

    • 比如znode数据修改、节点增删等;
    • 当监听到事件后,watcher会触发通知客户端
    • Watcher是一个单次触发的操作*

    关于ZooKeeper监听器有三个重要的逻辑:

    • 注册:客户端向ZooKeeper集群注册监听器

    • 监听事件:监听器负责监听特定的事件

    • 回调函数:当监听器监听到事件的发生后,调用注册监听器时定义的回调函数

10、Zookeeper 对节点的 watch 监听通知是永久的吗?为什么不是永久的?

不是。

官方声明:一个 Watch 事件是一个一次性的触发器

当被设置了 Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端,以便通知它们。

为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。

一般是客户端执行 getData(“/节点 A”,true),如果节点 A 发生了变更或删除,客户端会得到它的 watch 事件,但是在之后节点 A 又发生了变更,而客户端又没有设置 watch 事件,就不再给客户端发送。

在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。

11、Hdfs HA 高可用

Hadoop 2.x版本提出了高可用 (High Availability, HA) 解决方案。HDFS HA方案,主要分两部分:①元数据同步 ②主备切换

①元数据同步

  • 在同一个HDFS集群,运行两个互为主备的NameNode节点。
    • 一台为主Namenode节点,处于Active状态,一台为备NameNode节点,处于Standby状态。
    • 其中只有Active NameNode对外提供读写服务,Standby NameNode会根据Active NameNode的状态变化,在必要时切换成Active状态。

②主备切换

  • 每个NameNode节点上各有一个ZKFC进程,ZKFailoverController,作为独立进程存在,负责控制NameNode的主备切换

    • ZKFC会监控NameNode的健康状况,当发现Active NameNode异常时,通过Zookeeper集群进行namenode主备选举,完成Active和Standby状态的切换
  • 主备切换过程中,新的Active NameNode必须确保与原Active NamNode元数据同步完成,才能对外提供服务。所以用JournalNode集群作为共享存储系统

12、如何防止脑裂

在分布式系统中双主现象又称为脑裂,由于Zookeeper的“假死”、长时间的垃圾回收或其它原因都可能导致双Active NameNode现象,此时两个NameNode都可以对外提供服务,无法保证数据一致性

必须通过自带的隔离机制(Fencing),预防此类情况

13、Zookeeper读写操作
  • 常见的读取操作,如ls /查看目录;get /zktest查询ZNode数据

  • 读操作

    • 客户端先与某个ZK服务器建立Session
    • 然后,直接从此ZK服务器读取数据,并返回客户端即可
    • 关闭Session

    客户端写操作

    • ①客户端向zk集群写入数据,如create /kkb;与一个follower建立Session连接,从节点follower01

    • ②follower将写请求转发给leader

    • ③leader收到消息后,发出proposal提案(创建/kkb),每个follower先记录下要创建/kkb

    • ④超过半数quorum(包括leader自己)同意提案,则leader提交commit提案,leader本地创建/kkb节点ZNode

    • ⑤leader通知所有follower,也commit提案;follower各自在本地创建/kkb

    • ⑥follower01响应client

14、ZooKeeper服务器四种状态:
  • looking:服务器处于寻找Leader群首的状态

  • leading:服务器作为群首时的状态

  • following:服务器作为follower跟随者时的状态

  • observing:服务器作为观察者时的状态

15、Leader选举
  • 两种情况全新集群leader选举、非全新集群leader选举

  • 选举原则:集群中过半数Server启动后(多数派quorum),才能选举出Leader;

    • 此处quorum数是多少?3/2+1=2
    • 即quorum=集群服务器数除以2,再加1
  • 选举过程中,每个server需发出投票;

  • 投票信息vote信息结构为(sid, zxid)

    • server1 vote信息 (sid1,zxid1)、
    • server2 vote信息 (sid2,zxid2)
    • 全新集群,server1~3初始投票信息分别为:
      • server1 -> (1, 0)
      • server2 -> (2, 0)
      • server3 -> (3, 0)
  • 选举公式:

    • ①zxid大的server胜出;
    • ②若zxid相等,再根据判断sid判断,sid大的胜出
16、仲裁quorum
  • 什么是仲裁quorum

    • 发起proposal时,只要多数派同意,即可生效
  • 为什么要仲裁?

    • 多数据派,不需要所有的服务器都响应,proposal就能生效
    • 且能,提高集群的响应速度
  • quorum数如何选择?

    • 集群节点数 / 2 + 1
    • 如3节点的集群:quorum数=3/2+1=2
  • 仲裁模式下,服务器个数最好为奇数个why?

  • 5节点的比6节点的集群

    • 容灾能力一样,

    • quorum小,响应快

    • 集群最少要几台机器,集群规则是怎样的?
      集群规则为 2N+1 台,N>0,即 3 台。

    • 集群支持动态添加机器吗?
      其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:
      全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。
      逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。
      3.5 版本开始支持动态扩容。

17、网络分区、脑裂
  • 网络分区:网络通信故障,集群被分成了2部分

  • 脑裂:

    • 原leader处于一个分区;
    • 另外一个分区选举出新的leader
    • 集群出现2个leader
18、ZooKeeper状态同步

完成leader选举后,zk就进入ZooKeeper之间状态同步过程

  1. leader构建NEWLEADER封包,包含leader最大的zxid值;广播给其它follower
  2. follower收到后,如果自己的最大zxid小于leader的,则需要与leader状态同步否则不需要
  3. leader给需要同步的每个follower创建LearnerHandler线程,负责数据同步请求
  4. leader主线程等待LearnHandler线程处理结果
  5. 只有多数follower完成同步,leader才开始对外服务,响应写请求
  6. LearnerHandler线程处理逻辑
    1. 接收follower封包FOLLOWERINFO,包含此follower最大zxid(代称f-max-zxid)
    2. f-max-zxid与leader最大zxid(代称l-max-zxid)比较
    3. 若相等,说明当前follower是最新的
    4. 另外,若在判断期间,有没有新提交的proposal
      1. 如果有那么会发送DIFF封包将有差异的数据同步过去.同时将follower没有的数据逐个发送COMMIT封包给follower要求记录下来.
      2. 如果follower数据id更大,那么会发送TRUNC封包告知截除多余数据.
      3. 如果这一阶段内没有提交的提议值,直接发送SNAP封包将快照同步发送给follower.
    5. 以上消息完毕之后,发送UPTODATE封包告知follower当前数据就是最新的了
    6. 再次发送NEWLEADER封包宣称自己是leader,等待follower的响应.
19、说几个 zookeeper 常用的命令。

常用命令:ls get set create delete 等。

20、Zookeeper 的 java 客户端都有哪些?

java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。

  3. 如果这一阶段内没有提交的提议值,直接发送SNAP封包将快照同步发送给follower.
  1. 以上消息完毕之后,发送UPTODATE封包告知follower当前数据就是最新的了
  2. 再次发送NEWLEADER封包宣称自己是leader,等待follower的响应.
19、说几个 zookeeper 常用的命令。

常用命令:ls get set create delete 等。

20、Zookeeper 的 java 客户端都有哪些?

java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值