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. Java JVM监控工具JConsole简介

    Java JVM监控工具JConsole简介 jconsole命令 功能:打开java监视管理控制台 方法: jconsole [选项1] [选项2] …… [选项n] 常用选项: -help     ...

  2. Java数据解析---JSON

    一.Java数据解析分为:XML解析和JSON解析 XML解析即是对XML文件中的数据解析,而JSON解析即对规定形式的数据解析,比XML解析更加方便 JSON解析基于两种结构: 1.键值对类型 { ...

  3. 《ASP.NET MVC企业实战》(二) MVC开发前奏

    ​ 在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性.   ...

  4. Runtime消息动态解析与转发流程

    先上图: 下面根据具体代码看这张图. 一.创建一个Person类, Person.h #import <Foundation/Foundation.h> @interface Person ...

  5. 故障小记录:yum 安装报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

    发生原因: 由于yum是基于python的,之前安装我python3,当我修改了python命令的指向到python3之后就会发生这样的问题. 解决办法: 由于我当初想到可能以后还需要python2, ...

  6. LazyMan深入解析和实现

    一.题目介绍  以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank!   ...

  7. BD是什么角色

    BD是什么角色? 在一般创业公司里面,有了产品接下来就是运营了,而运营中很重要的一点就是BD,也就是所谓商务拓展了,俗一点说就是生意的合作拓展 https://www.jianshu.com/p/7d ...

  8. ORACLE11g下如何利用SQL DEVELOPER连接上数据库

    最近在学习数据库的相关内容,在sqlplus敲了几天命令行窗口后,想尝试一下用sql developer 连接上数据库但一直没有实现.在网上查询了相关资料后现在终于弄好了,就来写下此篇博文与大家分享! ...

  9. 洗礼灵魂,修炼python(36)--面向对象编程(6)—类的相关内置函数issubclass,hasattr等

    啥?我靠,类也有内置函数?哈哈,确实有的.有哪些呢?请往下看 issubclass(cls, class_or_tuple, /) 1.基本属性: 方法全是特殊方法 2.使用方法:判断一个类是否由另一 ...

  10. logstash过滤器插件filter详解及实例

    1.logstash过滤器插件filter 1.1.grok正则捕获 grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结 ...