Zookeeper简介

Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。

应用场景
  • 数据发布与订阅

发布与订阅即所谓的配置管理,顾名思义就是将数据发布到ZooKeeper节点上,供订阅者动态获取
数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使

数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到 ZooKeeper 的一个或一系列的
节点上,供订阅者进行数据订阅,达到动态获取数据的目的。
配置信息一般有几个特点:

  1. 数据量小的KV
  2. 数据内容在运行时会发生动态变化
  3. 集群机器共享,配置一致

ZooKeeper 采用的是推拉结合的方式。

  1. 推: 服务端会推给注册了监控节点的客户端 Wathcer 事件通知
  2. 拉: 客户端获得通知后,然后主动到服务端拉取最新的数据
  • 命名服务

作为分布式命名服务,命名服务是指通过指定的名字来获取资源或者服务的地址,利用ZooKeeper
创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或
者一个远程的对象等等

  • 配置管理

程序分布式的部署在不同的机器上,将程序的配置信息放在ZooKeeper的znode下,当有配置发生
改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watch通知给各
个客户端 从而更改配置

  • 集群管理

所谓集群管理就是:是否有机器退出和加入、选举master

  • 分布式通知与协调

  • 分布式锁

  • 分布式队列

感兴趣的查查具体实现

Zookeeper基本概念

zk角色

Zookeeper中的角色主要有以下三类,如下表所示:

zk service网络结构

Zookeeper的工作集群可以简单分成两类,一个是Leader,唯一一个,其余的都是follower,如何确定Leader是通过内部选举确定的。

Leader和各个follower是互相通信的,对于zk系统的数据都是保存在内存里面的,同样也会备份一份在磁盘上。对于每个zk节点而言,可以看做每个zk节点的命名空间是一样的,也就是有同样的数据。(可查看下面的树结构)
  • 如果Leader挂了,zk集群会重新选举,在毫秒级别就会重新选举出一个Leaer。
  • 集群中除非有一半以上的zk节点挂了,zk service才不可用。
zk命名空间结构

Zookeeper的命名空间就是zk应用的文件系统,它和linux的文件系统很像,也是树状,这样就可以确定每个路径都是唯一的,对于命名空间的操作必须都是绝对路径操作。与linux文件系统不同的是,linux文件系统有目录和文件的区别,而zk统一叫做znode,一个znode节点可以包含子znode,同时也可以包含数据。

提示:
比如/Nginx/conf,/是一个znode,/Nginx是/的子znode,/Nginx还可以包含数据,数据内容就是所有安装Nginx的机器IP,/Nginx/conf是/Nginx子znode,它也可以包含内容,数据就是Nginx的配置文件内容。在应用中,我们可以通过这样一个路径就可以获得所有安装Nginx的机器IP列表,还可以获得这些机器上Nginx的配置文件。
zk读写数据

  • 写数据,但一个客户端进行写数据请求时,会指定zk集群中节点,如果是follower接收到写请求,就会把请求转发给Leader,Leader通过内部的Zab协议进行原子广播,直到所有zk节点都成功写了数据后(内存同步以及磁盘更新),这次写请求算是完成,然后zk service就会给client发回响应
  • 读数据,因为集群中所有的zk节点都呈现一个同样的命名空间视图(就是结构数据),上面的写请求已经保证了写一次数据必须保证集群所有的zk节点都是同步命名空间的,所以读的时候可以在任意一台zk节点上
ps:其实写数据的时候不是要保证所有zk节点都写完才响应,而是保证一半以上的节点写完了就把这次变更更新到内存,并且当做最新命名空间的应用。所以在读数据的时候可能会读到不是最新的zk节点,这时候只能通过sync()解决。这里先不考虑了,假设整个zk service都是同步meta信息的,后面的文章再讨论。

Zookeeper 读写数据流程

zk znode类型
节点有哪些类型?

Znode两种类型 :

  • 持久的(persistent):客户端和服务器端断开连接后,创建的节点不删除(默认)。
  • 短暂的(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除。

Znode有四种形式 :

  • 持久化目录节点(PERSISTENT):客户端与Zookeeper断开连接后,该节点依旧存在
  • 持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  • 临时目录节点(EPHEMERAL)客户端与Zookeeper断开连接后,该节点被删除
  • 临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
    客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

「注意」:创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序号是一个单调递增的计
数器,由父节点维护

ZooKeeper的会话分桶策略

zookeeper原理篇-Zookeeper会话机制

ZooKeeper session管理

Zookeeper设计目的

  • 最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
  • 可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
  • 实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
  • 等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
  • 原子性:更新只能成功或者失败,没有中间状态。
  • 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

Zookeeper工作原理

Zookeeper 的核心是广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。

Zab协议有两种模式,它们分别是恢复模式(选主)和广播 模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后, 恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。为了保证事务的顺序一致性,zookeeper采用了递增的事务id号 (zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用 来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
每个Server在工作过程中有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻。
  • LEADING:当前Server即为选举出来的leader。
  • FOLLOWING:leader已经选举出来,当前Server与之同步。
选主流程

当 leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的 Server都恢复到一个正确的状态。

Zookeeper的选举算法有两种:

一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。
系统默认的选举算法为fast paxos。

basic paxos流程:
  1. 选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
  2. 选举线程首先向所有Server发起一次询问(包括自己);
  3. 选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;
  4. 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;
  5. 线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。通 过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于 n+1.每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信 息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。
    选举的具体流程图如下所示:
fast paxos流程:

在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。
选举的具体流程图如下所示:

同步流程

选完leader以后,zk就进入状态同步过程。

leader等待server连接;

  • Follower连接leader,将最大的zxid发送给leader;
  • Leader根据follower的zxid确定同步点;
  • 完成同步后通知follower 已经成为uptodate状态;
  • Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。
    同步的具体流程图如下所示:
工作流程
Leader工作流程

恢复数据;

  • 维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
  • Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。
PING 消息是指Learner的心跳信息;
REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;
ACK消息是Follower的对提议 的回复,超过半数的Follower通过,则commit该提议;
REVALIDATE消息是用来延长SESSION有效时间。

Leader的工作流程简图具体如下所示:

Follower工作流程

Follower主要有四个功能:

  • 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
  • 接收Leader消息并进行处理;
  • 接收Client的请求,如果为写请求,发送给Leader进行投票;
  • 返回Client结果。

Follower的消息循环处理如下几种来自Leader的消息:

  • PING消息: 心跳消息;
  • PROPOSAL消息:Leader发起的提案,要求Follower投票;
  • COMMIT消息:服务器端最新一次提案的信息;
  • UPTODATE消息:表明同步完成;
  • REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;
  • SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
    Follower的工作流程简图具体如下所示:

应用篇

分布式系统的运行是很复杂的,因为涉及到了网络通信还有节点失效等不可控的情况。下面介绍在最传统的master-workers模型,主要可以会遇到什么问题,传统方法是怎么解决以及怎么用zookeeper解决。

Master节点管理

集群当中最重要的是Master,所以一般都会设置一台Master的Backup。
Backup会定期向Master获取Meta信息并且检测Master的存活性,一旦Master挂了,Backup立马启动,接替Master的工作自己成为Master,分布式的情况多种多样,因为涉及到了网络通信的抖动,针对下面的情况:

  • Backup检测Master存活性传统的就是定期发包,一旦一定时间段内没有收到响应就判定Master Down了,于是Backup就启动,如果Master其实是没有down,Backup收不到响应或者收到响应延迟的原因是因为网络阻塞的问题呢?Backup也启动了,这时候集群里就有了两个Master,很有可能部分workers汇报给Master,另一部分workers汇报给后来启动的Backup,这下子服务就全乱了。
  • Backup是定期同步Master中的meta信息,所以总是滞后的,一旦Master挂了,Backup的信息必然是老的,很有可能会影响集群运行状态。

Zookeeper Master选举

Zookeeper会分配给注册到它上面的客户端一个编号,并且zk自己会保证这个编号的唯一性和递增性,N多机器中只需选出编号最小的Client作为Master就行,并且保证这些机器的都维护一个一样的meta信息视图,一旦Master挂了,那么这N机器中编号最小的胜任Master,Meta信息是一致的。

【分布式】Zookeeper的Leader选举

ZooKeeper 03 - ZooKeeper集群的脑裂问题 (Split Brain问题)

Zookeeper(4)—ZK集群部署和选举

Zookeeper学习-04 ZooKeeper实现 Master-Worker协同

集群worker管理

集群中的worker挂了是很可能的,一旦worker A挂了,如果存在其余的workers互相之间需要通信,那么workers必须尽快更新自己的hosts列表,把挂了的worker剔除,从而不在和它通信,而Master要做的是把挂了worker上的作业调度到其他的worker上。同样的,这台worker重新恢复正常了,要通知其他的workers更新hosts列表。传统的作法都是有专门的监控系统,通过不断去发心跳包(比如ping)来发现worker是否alive,缺陷就是及时性问题,不能应用于在线率要求较高的场景

Zookeeper监控集群

利用zookeeper建立znode的强一致性,可以用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。

ZooKeeper场景实践:(6)集群监控和Master选举

分布式锁

在一台机器上要多个进程或者多个线程操作同一资源比较简单,因为可以有大量的状态信息或者日志信息提供保证,比如两个A和B进程同时写一个文件,加锁就可以实现。但是分布式系统怎么办?需要一个三方的分配锁的机制,几百台worker都对同一个网络中的文件写操作,怎么协同?还有怎么保证高效的运行?

Zookeeper分布式锁

分布式锁主要得益于ZooKeeper为我们保证了数据的强一致性,zookeeper的znode节点创建的唯一性和递增性能保证所有来抢锁的worker的原子性。

七张图彻底讲清楚ZooKeeper分布式锁的实现原理【石杉的架构笔记】

Zookeeper实现分布式锁

配置文件管理

集群中配置文件的更新和同步是很频繁的,传统的配置文件分发都是需要把配置文件数据分发到每台worker上,然后进行worker的reload,这种方式是最笨的方式,结构很难维护,因为如果集群当中有可能很多种应用的配置文件要同步,而且效率很低,集群规模一大负载很高。还有一种就是每次更新把配置文件单独保存到一个数据库里面,然后worker端定期pull数据,这种方式就是数据及时性得不到同步。

Zookeeper发布与订阅模型

发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。

基于ZooKeeper的统一配置管理实现(一)

基于zookeeper实现统一配置管理

Zookeeper介绍、原理及应用相关推荐

  1. ZooKeeper学习第七期--ZooKeeper一致性原理

    ZooKeeper学习第六期---ZooKeeper机制架构 ZooKeeper学习第一期---Zookeeper简单介绍 ZooKeeper学习第二期--ZooKeeper安装配置 ZooKeepe ...

  2. Zookeeper选举原理——FastLeaderElection

    转载自  Zookeeper选举原理 作为一个分布式应用程序协调服务,在大型网站中,其本身也是集群部署的,安装zookeeper的时候最好是单数节点,因为要选举.Zookeeper的leader节点是 ...

  3. zookeeper介绍

    zookeeper | 介绍 开源的分布式协调服务,雅虎创建,基于google chubby. 可以解决的问题 数据的发布/订阅(配置中心:disconf) 负载均衡(dubbo利用了zookeepe ...

  4. ELK+Filebeat+zookeeper+Kafka原理和搭建

    目录 引言 一.ZooKeeper介绍 二.Kafka介绍 2.1.为什么需要消息队列(MQ) 2.2.消息队列的好处 解耦合 异步处理 流量削峰 2.3.Kafka的特性 2.4.Kafka作为存储 ...

  5. 546、Zookeeper详细入门教程系列 -【Zookeeper内部原理】 2022.11.06

    目录 一.Zookeeper内部原理 1.1 节点类型(Znode) 1.2 Stat结构体 1.3 监听器原理 1.4 选举机制 1.5 写数据流程 二.最后 三.参考链接 一.Zookeeper内 ...

  6. ZooKeeper的原理(转)

    一.ZooKeeper的角色 领导者(Leader),负责进行投票的发起和决议,更新系统状态. 学习者(Learner),包括跟随者(Follower)和观察者(Observer),Follower用 ...

  7. zookeeper工作原理、安装配置、工具命令简介

    1 Zookeeper简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooK ...

  8. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

    什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群 ...

  9. zookeeper介绍及使用

    zookeeper介绍及使用 zookeeper介绍 什么是分布式协调技术`在这里插入代码片` 什么是分布式锁 什么是zookeeper docker 安装 zookeeper zookeeper介绍 ...

最新文章

  1. win10下Anaconda如何查看PyTorch版本
  2. 收藏 |《动手学深度学习》中文版PDF
  3. SQL Server 2005 Analysis Services
  4. [vue] 说说你对vue的错误处理的了解?
  5. visual studio 的各个版本下载地址
  6. java清理垃圾_垃圾清理势在必行——Java垃圾收集算法
  7. JSR 168 and Portlet
  8. Its configuration is R5 3600, ASUS B450M motherboard
  9. Android 市场的未来
  10. 怎样填充潘通颜色_怎样判定润滑脂,锂基脂的好坏?
  11. PAT Practice [1020 月饼]
  12. 慕课网仿去哪儿项目笔记--(四)-城市页面的优化
  13. 序言页码(纯思维题)
  14. Jump Game/Jump Game II
  15. 深度学习(3):基于人脸的性别和年龄判断
  16. 1、skywalking-介绍
  17. js 苹果手机点击事件 兼容
  18. ssh远程连接报错:WARNING: POSSIBLE DNS SPOOFING DETECTED(已解决)
  19. 微信小程序---wxss常用属性
  20. 关于Spring体系的各种启动流程

热门文章

  1. 五分钟学会前端打包工具webpack
  2. 微软官方推安全管家,或许不是一场作秀
  3. 你的数据库到底应该如何存储密码?
  4. 念悠文化:微博运营怎么做?微博运营的几个方法
  5. SOFAEnclave:蚂蚁金服新一代可信编程环境,让机密计算为金融业务保驾护航102年
  6. plotly绘制简单图形5--饼形图附加
  7. PHP从基础到高级详细教程(完整版)
  8. 天翼宽带政企网关B2-1P 如何获得超级管理员账号?
  9. Addressable资源热更新疑问
  10. Android如何设置按钮图片(控件图片)大小自适应