ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。它是一个典型的分布式数据一致性的解决方案,分布式应用可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。

角色:

  1、Leader(领导者):负责进行投票的发起和决议,更新系统状态

  2、Learner(学习者):包含Follower(跟随者)和Observer(观察者)

    Follower:接收客户端请求并向客户端返回结果,在选主过程中参与投票

    Observer:接收客户端连接,将写请求转发给Leader节点。但Observer不参与投票,只同步leader的状态。其目的是为了扩展系统,提高读取速度

  3、Client(客户端):请求发起方

会话(SESSION):

  session指客户端会话,在zookeeper中,一个客户端连接指客户端与服务端之间的一个TCP长连接。对外默认服务端口2181。客户端启动时,与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期就开始了。客户端可通过心跳检测与服务器保持有效会话,也能够想Zookeeper服务器发送请求并接收响应,同时能接收来自服务器的Watch事件通知。当异常导致客户端连接断开时,只要在sessionTimeout规定时间内重连上集群中任意一台服务器,那么之前创建的会话依然有效。

数据节点(Znode):

  zookeeper中,节点分为两类。第一类是构成集群的集群,称之为机器节点。第二类是数据模型中的数据单元,称之为数据节点(Znode)。zookeeper将所有数据存储在内存中,数据模型是一颗树(Znode Tree)。由斜杠(/)分割的路径,就是一个Znode。每个Znode都会保存自己的数据内容,同时保存一系列属性信息。

版本:

  对应每个Znode,zookeeper都会为其维护一个叫做stat的数据结构,stat中记录了这个Znode的三个数据版本,分别是version(当前版本),cversion(当前Znode子节点的版本)和aversion(当前Znode的ACL版本)。

Watcher:

  事件监听器,zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发时,Zookeeper服务端会将事件通知到感兴趣的客户端上去。

ACL:

  zookeeper采用ACL(Access Control Lists)策略来进行权限控制。其定义了五种权限。

  CREATE:创建子节点的权限。

  READ:获取节点数据和子节点列表的权限。

  WRITE:更新节点数据的权限。

  DELETE:删除子节点的权限。

  ADMIN:设置节点ACL的权限。

系统模型:

  

Zookeeper可以保证如下分布式一致性特性:

  顺序一致性:从同一个客户端发起的事务请求,最终会严格地按照发起顺序被应用到Zookeeper中去。

  原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的。要么所有机器都成功应用某一事务,要么都没应用。

  单一视图:客户端不论连接到哪个服务器,看到的服务端数据模型都是一致的。

  可靠性:一旦服务端成功应用一个事务,并完成对客户端的响应,那么该事务引起的服务端状态变更会被一直保留下来,除非有另一个事务对其进行变更。

  实时性:Zookeeper仅仅保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。

Zookeeper四个设计目标:后期补充

  简单的数据模型:

  可以构建集群:Zookeeper集群的每台机器都会在内存中维护当前服务器状态,并且机器之间都互相保持通信。只要集群中超过一半的机器能够正常工作,那么集群就能正常对外服务。

  顺序访问:对于来自客户端的每个更新请求,zookeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序。

  高性能:Zookeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,因此它尤其适用于以读操作为主的应用场景。

ZAB协议:

  支持崩溃恢复的原子广播协议。Zookeeper使用一个单一的主进程来接收并处理客户端所有事务请求,并采用ZAB的原子广播协议,将服务器数据的状态变更以事务Proposal的形式广播到所有的副本进程。ZAB协议的主备模型架构保证同一时刻集群中只能够有一个主进程来广播服务器的状态变更,因此能很好的处理客户端大量的并发请求。

ZAB协议核心:

  定义了对于会改变Zookeeper服务器数据状态的事务请求的处理方式,即:

  所有事务请求必须由一个全局唯一的服务器来协调处理,即Leader服务器,余下的为Follower服务器。Leader负责将一个客户端事务请求转换成一个事务Proposal(提议),并将该Proposal分发给集群中所有Follower。之后Leader等待所有Follower反馈,一旦超过半数的Follower进行正确反馈,那么Leader会再次向所有的Follower分发Commit消息,要求其将前一个Proposql进行提交。

工作原理:

  Zookeeper的核心是原子广播,该机制保证了各个Server之间的同步。通过Zab协议实现这个机制。

  Zab协议有两种模式,分别是崩溃恢复(选主)模式和消息广播(同步)模式。当服务启动或在Ledaer崩溃后,Zab进入恢复模式,当领导者被选举出来,且半数Server完成了和Leader的状态同步后,恢复模式结束。状态同步保证了Leader和Server具有相同的系统状态。当集群中过半的Follower完成了和Leader的状态同步,就会进入消息广播模式。当一台同样遵守ZAB协议的新服务器启动后加入集群,如果此时集群中已经存在Leader进行消息广播,那么新服务器会自觉进入数据恢复模式,找到Leader,并与其进行数据同步,然后一起参与到消息广播中去。

  为了保证事物的顺序一致性,zookeeper采用全单调递增的唯一id号(zxid,事务id)来标识事务。所有提议(proposal)都在被提出的时候加上了zxid。每一个事务Proposal安装其zxid的先后顺序来进行排序与处理,以此保证每一个消息严格的因果关系。

  消息广播:针对客户端的事务请求,Leader会为其生成对应的事务Proposql,并将其发送给集群中其余所有机器,然后再收集各自的选票,最后进行事务提交。

  ZAB协议规定如果一个事务Proposql在一台机器上被处理成功,那么应该在所有的机器上都被处理成功。哪怕机器出现故障崩溃。但在崩溃恢复过程中,可能会出现两个数据不一致性的隐患。

  1、Leader提交一个事务,并得到过半Follower的ACK反馈,但在它将Commit发出后,Leader挂了。此时ZAB要保证事务最终能在所有服务器上都被提交成功,否则出现不一致。

  2、如果在崩溃恢复过程中出现一个需要被丢到的提案,那么崩溃恢复结束后,需要跳过该事务。

  针对上述两种情况,ZAB协议必须设计这样一个Leader选举算法:能够确保提交已经被Leader提交的事务,同时丢弃已经被跳过的事务。

  如果让Leader选举算法能够保证新选举出来的Leader拥有集群中所有机器最高编号(即ZXID)的事务,那么就可以保证这个新选举出来的Leader一定具有所有已提交的提案,并可以省去Leader检测Proposql的提交和丢弃工作的这步操作。

  ZAB协议如果处理需要被丢弃的事务Proposal:

    在设计事务编号ZXID中,ZXID是一个64位的数字,其中低32位可以看作是一个简单单调递增的计数器。针对客户端的每一个事务请求,Leader在产生一个新Proposql时,会对计数器进行+1操作。高32位代表Leader周期epoch的编号。每当新的Leader产生,就会从这个Leader中取出其本地日志上最大事务的ZXID,并从该ZXID中解析出对应的epoch,并对其进行+1操作,之后以此编号作为新的epoch,并将低32位置0来开始生成新的ZXID。这样来区分Leader周期变化,能有效避免不同的Leader错误地使用相同的ZXID编号提出不一样的事务的异常情况。

    基于这一策略,当一个包含了上一个Leader周期中尚未提交过的事务的服务器启动时,其肯定无法成为Leader。因为当前集群中一定包含一个Quorum集合,该集合中的机器一定包含了最高epoch的事务,因此该服务器的事务肯定不是最高。也无法成为Leader。当这台机器加入集群中,以Follower角色连接上Leader,Leader会根据自身最后被提交的事务来和Follower的事务进行比对,Leader会要求Follower进行一个回退操作,回退到一个确实已经被集群中过半机器提交的最新事务。

Zookeeper-基本概念的更多相关文章

  1. 1、ZooKeeper 基本概念、使用方法、实践场景

    ZooKeeper 基本概念 ZooKeeper 是面向分布式应用的协调服务,其实现了树形结构的数据模型(与文件系统类似),并且提供了简洁的编程原语.ZooKeeper 能够作为基础,用于构建更高层级 ...

  2. ZooKeeper 基本概念并介绍RPC中Netty和Zookeeper的使用

    前言 ZooKeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等.Zookeeper提供一个类似Linux文件系统的属性结构,每个节点可存储少量的内存文件,并提供每 ...

  3. 第一章 zookeeper基础概念

    1.ZooKeeper是什么 ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务,提供了统一命名服务. 配置管理和分布式锁等分布式的基础服务.在解决分布式数据一致性方面, ZooKeepe ...

  4. 二:ZooKeeper术语概念

    一:Zookeeper的设计目标   -->Zookeeper致力于提供一个高性能,高可用,且具有严格的顺序访问控制能力(主要是写操作的严格顺行性)的分布式协调服务. -->高性能使得Zo ...

  5. ZooKeeper分布式过程协同技术详解1——ZooKeeper的概念和基础

    简介 分布式系统和应用,不仅能提供更强的计算能力,还能为我们提供更好的容灾性和扩展性. ZooKeeper是Google的Chubby项目的开源实现,它曾经作为Hadoop的子项目,在大数据领域得到广 ...

  6. zookeeper基本概念及原理

    zookeeper是一个分布式的,开源的分布式应用程序,该程序主要用于管理其他分布式应用程序.其他分布式应用程序可以基于zookeeper实现数据同步,配置维护和命名服务等等.zookeeper是Ha ...

  7. ZooKeeper 系列(一)—— ZooKeeper核心概念详解

    一.Zookeeper简介 二.Zookeeper设计目标 三.核心概念         3.1 集群角色         3.2 会话         3.3 数据节点         3.4 节点 ...

  8. zookeeper基本概念

    1.集群角色 Leader,Follower,Observer Leader服务器是整个zookeeper集群工作机制中的核心 Follower服务器是zookeeper集群状态的跟随者 Observ ...

  9. zookeeper的概念和基础

    1.1ZooKeeper的使命 当开发人员使用ZooKeeper进行开发时,开发人员设计的那些应⽤往往可以看成成组连接到ZooKeeper服务器端的客户端,它们通过ZooKeeper的客户端API连接 ...

  10. <Zookeeper>入门 概念

    分布式协调服务 Zookeeper 分布式环境的特点 1.分布性 基于一个硬件或者多个硬件设备以及多个软件组成的分布在不同网络计算机上的系统架构,通过消息传递进行通信协调.在空间上部署是可以任意的,网 ...

随机推荐

  1. (网页)angularjs中的验证input输入框只能输入数字和小数点

    百度的资料:自己记录看下 把js的验证方法改成angular可使用的方法 AngularJS文件的写法: $scope.clearNoNum = function(obj,attr){ //先把非数字 ...

  2. mybatis学习系列三(部分)

    1 forearch_oracle下批量保存(47) oracle批量插入 不支持values(),(),()方式 1.多个insert放在begin-end里面 begin insert into ...

  3. DirectX SDK (June 2010)安装错误S1023,解决方法

    转自:http://hi.baidu.com/rootcat/item/6730f15f85e2c1958c12ed81 DirectX SDK (June 2010)安装错误S1023,解决方法 导 ...

  4. Chrome_浏览器开发人员工具

    Google Chrome 浏览器开发人员工具,让网页开发变得更轻松 无论是 IE 6/7 的 Internet Explorer Developer Toolbar 或者是 IE 8 自带的 Dev ...

  5. 洗礼灵魂,修炼python(44)--巩固篇—反射之重新认识hasattr,gettattr,setattr,delattr

    不急着进入正题.先动手完成一个小程序: 设计一套简单的服务开启关闭程序,每次开启或关闭都得打印服务当前的状态: class Server(object): def __init__(self): se ...

  6. 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程

    声明:本篇文章仅仅以游戏<绝地求生>作为一个参考话题来介绍面向对象编程,只是作为学术引用,其制作的非常简易的程序也不会作为商业用途,与蓝洞公司无关. <绝地求生>最近很火,笼络 ...

  7. 洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

    decimal 1.作用: 用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于 金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度, ...

  8. [HDFS_4] HDFS 的 Java 应用开发

    0. 说明 在 IDEA下 进行 HDFS 的 Java 应用开发 通过编写代码实现对 HDFS 的增删改查操作 1. 流程 1.1 在项目下新建 Moudle 略 1.2 为 Moudle 添加 M ...

  9. Linux 小知识翻译 - 「分区」

    安装Linux的时候,需要对硬盘进行分区.那么「分区」到底是什么呢? 「分区」在日语中有区分,分割的意思.计算机术语中有时会说「对一个磁盘进行分区」,整个意思就是指定如何分割磁盘的意思. 「对磁盘进行 ...

  10. Deepin中设置文件或文件夹权限

    Deepin中设置文件或文件夹权限 -R 递归进行某项操作,不论是删除文件夹或者修改文件夹下所有文件权限   权限更改,777相当于完全控制权限: 更改一个文件夹或文件的权限:chmod 777 文件 ...