一、zookeeper是什么

1. zookeeper

ZooKeeper 为分布式应用提供高效、高可用的分布式协调服务。

2. 分布式协调服务

  • 数据发布/订阅、
  • 负载均衡、
  • 命名服务、
  • 分布式协调/通知
  • 分布式锁

3. ZooKeeper 的数据模型

ZooKeeper 的数据存储是基于节点,这种节点叫做 Znode

不同于树的节点,Znode 的引用方式是路径引用,类似于文件路径:

/ 动物 / 仓鼠

/ 植物 / 荷花

4. Znode

data:Znode 存储的数据信息。

ACL:记录 Znode 的访问权限,即哪些人或哪些 IP 可以访问本节点。

stat:包含 Znode 的各种元数据,比如事务 ID、版本号、时间戳、大小等等。

child:当前节点的子节点引用,类似于二叉树的左孩子右孩子。

这里需要注意一点,ZooKeeper 是为读多写少的场景所设计。

Znode 并不是用来存储大规模业务数据,而是用于存储少量的状态和配置信息,每个节点的数据最大不能超过 1MB。

二、ZooKeeper 的基本操作

ZooKeeper 包含了哪些基本操作呢?

create:创建节点

delete:删除节点

exists:判断节点是否存在

getData:获得一个节点的数据

setData:设置一个节点的数据

getChildren:获取节点下的所有子节点

这其中,exists、getData、getChildren 属于读操作。

三、Watch事件通知

ZooKeeper 客户端在请求读操作的时候,可以选择是否设置 Watch。

1. Watch 是什么

我们可以理解成是注册在特定 Znode 上的触发器。

当这个 Znode 发生改变,也就是调用了 create、delete、setData 方法的时候,将会触发 Znode 上注册的对应事件,请求 Watch 的客户端会接收到异步通知。

2. 具体交互过程

a. 客户端调用 getData 方法,Watch 参数是 true。

服务端接到请求,返回节点数据,并且在对应的哈希表里插入被 Watch 的 Znode 路径,以及 Watcher 列表。

b. 当被 Watch 的 Znode 已删除,服务端会查找哈希表,找到该 Znode 对应的所有 Watcher,异步通知客户端,并且删除哈希表中对应的 Key-Value。

四、Zookeeper的一致性

为了防止单机挂掉的情况,zookeeper维护了一个集群。

ZooKeeper Service 集群是一主多从结构。

更新数据时,首先更新到主节点(这里的节点是指服务器,不是 Znode),再同步到从节点。

在读取数据时,直接读取任意从节点。

为了保证主从节点的数据一致性,ZooKeeper 采用了 ZAB 协议,这种协议非常类似于一致性算法 Paxos 和 Raft。

五、ZAB协议

1. ZAB

ZAB即ZooKeeper Atomic Broadcast,有效解决了Zookeeper集群崩溃恢复,以及主从同步数据的问题。

三种节点状态

在学习 ZAB 之前,我们需要首先了解 ZAB 协议所定义的三种节点状态:

  • Looking:选举状态。
  • Following:Follower 节点(从节点)所处的状态。
  • Leading:Leader 节点(主节点)所处状态。

最大 ZXID

最大 ZXID 也就是节点本地的最新事务编号,包含 epoch 和计数两部分。

epoch 是纪元的意思,相当于 Raft 算法选主时候的 term。

假如 ZooKeeper 当前的主节点挂掉了,集群会进行崩溃恢复。

2. ZAB 的崩溃恢复分成三个阶段:

1. Leader election

选举阶段,此时集群中的节点处于 Looking 状态。

它们会各自向其他节点发起投票,投票当中包含自己的服务器 ID 和最新事务 ID(ZXID)。

接下来,节点会用自身的 ZXID 和从其他节点接收到的 ZXID 做比较,如果发现别人家的 ZXID 比自己大,也就是数据比自己新,那么就重新发起投票,投票给目前已知最大的 ZXID 所属节点。

每次投票后,服务器都会统计投票数量,判断是否有某个节点得到半数以上的投票。

如果存在这样的节点,该节点将会成为准 Leader,状态变为 Leading。其他节点的状态变为 Following。

这就相当于,一群武林高手经过激烈的竞争,选出了武林盟主。

2. Discovery

发现阶段,用于在从节点中发现最新的 ZXID 和事务日志。

或许有人会问:既然 Leader 被选为主节点,已经是集群里数据最新的了,为什么还要从节点中寻找最新事务呢?

这是为了防止某些意外情况,比如因网络原因在上一阶段产生多个 Leader 的情况。

所以这一阶段,Leader 集思广益,接收所有 Follower 发来各自的最新 epoch 值。

Leader 从中选出最大的 epoch,基于此值加 1,生成新的 epoch 分发给各个 Follower。

各个 Follower 收到全新的 epoch 后,返回 ACK 给 Leader,带上各自最大的 ZXID 和历史事务日志。

Leader 选出最大的 ZXID,并更新自身历史日志。

3. Synchronization

同步阶段,把 Leader 刚才收集得到的最新历史事务日志,同步给集群中所有的 Follower。

只有当半数 Follower 同步成功,这个准 Leader 才能成为正式的 Leader。

自此,故障恢复正式完成。

六、Broadcast

Zookeeper 常规情况下更新数据的时候,由 Leader 广播到所有的 Follower。

其过程如下:

1. 客户端发出写入数据请求给任意Follower。

2. Follower 把写入数据请求转发给 Leader。

3. Leader 采用二阶段提交方式,先发送 Propose 广播给 Follower。

4. Follower 接到 Propose 消息,写入日志成功后,返回 ACK 消息给 Leader。

5. Leader 接到半数以上 ACK 消息,返回成功给客户端,并且广播 Commit 请求给 Follower。

ZAB 协议既不是强一致性,也不是弱一致性,而是处于两者之间的单调一致性。它依靠事务 ID 和版本号,保证了数据的更新和读取是有序的。

七、应用场景

1. 分布式锁

这是雅虎研究员设计 ZooKeeper 的初衷。利用 ZooKeeper 的临时顺序节点,可以轻松实现分布式锁。

2. 服务注册和发现

利用 Znode 和 Watcher,可以实现分布式服务的注册和发现。最著名的应用就是阿里的分布式 RPC 框架 Dubbo。

3. 共享配置和状态信息

Redis 的分布式解决方案 Codis,就利用了 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息。

同时 codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy。

此外,Kafka、HBase、Hadoop 也都依靠 ZooKeeper 同步节点信息,实现高可用。

漫画:什么是 ZooKeeper?

https://mp.weixin.qq.com/s/qxneo74A-F7O5hYVI66xUA

https://mp.weixin.qq.com/s/BTdT2Q5nHvWQG0RwOt0M1Q

Zookeeper是什么相关推荐

  1. 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别

    1. 什么是 KV 存储 KV 是 Key-Value 的缩写,KV 存储也叫键值对存储.简单来说,它是利用 Key 做索引来实现数据的存储.修改.查询和删除功能. 常用的高性能 KV 存储主要有 R ...

  2. kafka+zookeeper搭建步骤kafka问题

    kafka+zookeeper搭建步骤 帅气的名称被占用关注 0.1392018.12.04 13:48:00字数 1,007阅读 88 vmware 安装centOS7 克隆虚拟为:三台 本地你的I ...

  3. ZooKeeper简单使用

    ZooKeeper简单使用 ZooKeeper简单使用 1.ZooKeeper简介 2.ZooKeeper能做什么 3.ZooKeeper核心 3.1.ZooKeeper安装 3.2.ZooKeepe ...

  4. 2021年大数据ZooKeeper(六):ZooKeeper选举机制

    目录 ​​​​​​ZooKeeper选举机制 概念 全新集群选举 非全新集群选举 ZooKeeper选举机制 zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜 ...

  5. 2021年大数据ZooKeeper(五):ZooKeeper Java API操作

    目录 ZooKeeper Java API操作 引入maven坐标 节点的操作 ZooKeeper Java API操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端 ...

  6. 2021年大数据ZooKeeper(四):ZooKeeper的shell操作

    目录 ZooKeeper的shell操作 客户端连接 shell基本操作 操作命令 操作实例 节点属性 ​​​​​​​ZooKeeper Watcher(监听机制) ​​​​​​​Watch机制特点 ...

  7. 2021年大数据ZooKeeper(三):Zookeeper数据模型和节点类型

    目录 Apache ZooKeeper Zookeeper数据模型 Zookeeper节点类型 Apache ZooKeeper Zookeeper数据模型 图中的每个节点称为一个Znode. 每个Z ...

  8. 2021年大数据ZooKeeper(二):ZooKeeper集群搭建

    目录 ZooKeeper集群搭建 第一步:下载zookeeeper的压缩包,下载网址如下 第二步:解压 第三步:修改配置文件 第四步:添加myid配置 ​​​​​​​第五步:安装包分发并修改myid的 ...

  9. 2021年大数据ZooKeeper(一):ZooKeeper基本知识

    目录 Zookeeper基本知识 ZooKeeper概述 ZooKeeper特性 ZooKeeper集群角色 Leader: Follower: Observer: Zookeeper基本知识 Zoo ...

  10. ZooKeeper简介和概念知识

    1. 简介 ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂的过程. ZooKeeper通过其简单的架构和API解决了这个问题.ZooKeeper允许开 ...

最新文章

  1. android自定义控件中文乱码,Android笔记--自定义View之组合控件
  2. 山东理工大计算机专业学什么科目,2020年山东理工大学计算机科学与技术学院880数据结构硕士研究生入学考试科目大纲...
  3. JFinal的ActiveRecord用法 @JFinal
  4. 200910阶段一C++虚析构
  5. YBTOJ洛谷P4869:出现位置(线性基)
  6. 西工大java实验报告给,西工大数字集成电路实验 实验课6 加法器的设计
  7. 7-37 抓老鼠啊~亏了还是赚了? (20 分)
  8. laravel5.5中添加对分页样式的修改上一页和下一页
  9. Visual C# 2005 - 利用程序代码制作简单动画效果
  10. Visual Studio [即时窗口] [命令窗口] (Immediate Window Command Window) 转
  11. Windows操作系统正版盗版知识简介
  12. su插件打开显示html,如何让自己的su从工具变成神器?你需要这些插件
  13. 黑客帝国产业链调查:熊猫烧香作者一年赚千万
  14. 4.7 使用色相/饱和度命令调整图像的色彩 [原创Ps教程]
  15. C/C++试题集——字符串篇
  16. java中的radix_int radix()
  17. 事件的三个阶段:捕获阶段 目标阶段 冒泡阶段及防止冒泡和捕获
  18. 为什么char+char为int类型 C/C++类型提升
  19. android蓝牙传文件,安卓手机怎样使用蓝牙连接传输文件
  20. TinyOS论文11:Sentomist

热门文章

  1. Android类参考---Fragment(二)
  2. VC学习笔记:状态栏
  3. c#中抽象类和接口异同
  4. How to use Emerge
  5. Harris角点检测算法 1
  6. java循环速度比较_List的二种循环速度比较
  7. 拓端tecdat|在RapidMiner中建立决策树模型
  8. 习题3.8 符号配对 (20 分)
  9. 计算机专业校企合作实施方案,校企合作-校企合作、工学结合机制实施方案
  10. hdfs上的csv文件导入mysql表_HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)...