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. TCP协议学习总结

    1.TCP协议通过三次握手建连接,四次挥手断连接. 2.TCP的定时器都有哪些? 做什么用途? 3.TCP的慢启动是什么意思? 4.TCP的快速重传是什么意思?

  2. 程序员简单打造一个灵活智能的自动化运维系统C#实例程序

    你是一个程序员,被派去管理公司500台计算机.这些机器可能需要执行一些自动化任务,一台台手动操作会把你累死.重复性的工作还是交给电脑处理,怎么解决这个问题呢?一个自动化的运维系统是必须的.自己实现的好 ...

  3. js replace替换 忽略大小写问题

    实现就是控制台的内容“abc”,但是后台返回的是“ABC”,这个时候在前台遍历,需要将后台返回的在控制台标红. 当然控制台可以是 abc Abc等大小写混合,以下代码都可替换. var flagnew ...

  4. What To Do When MySQL Runs Out of Memory: Troubleshooting Guide

    In this article, I will show you how to use the new version of MySQL (5.7+) and how to troubleshoot ...

  5. Linux 修改用户组后,如何关闭所有 X session 下使得组生效?

    最近在使用 docker-ce ,在配置当前用户组为 docker 的时候(sudo usermod -aG docker $USER)发现:必须要关闭当前的 session 重新登录 后,才能使得修 ...

  6. 第七章 鼠标(CHECKER2)

    CHECKER2程序包含一个键盘接口,内容与CHECKER1完全相同.利用←.→.↑.↓四个方向键可以在25个矩形之间移动鼠标指针.Home键把鼠标指针移动到左上角的矩形:End键使鼠标指针落到右下角 ...

  7. 开发测试技巧|辅助开发调试:goolge浏览器利用F12在控制台输入脚本实现表单自动填充

    一个开发测试技巧的指引和截图,利用google浏览器的F12调试和Console执行,注入JavaScript脚本实现表单的自动填充和测试. 原文链接: http://www.lookdaima.co ...

  8. pip更新及Requirement already up-to-date解决方法

    pip更新及Requirement already up-to-date解决方法 文:铁乐与猫 2018-9-11 更新命令 将pip更新到最新版本 python -m pip install --u ...

  9. git版本控制工具基本用法讲解(转)

    一.安装Git 在linux系统使用非常方便,只需要打开shell界面,并输入: ? 1 sudo apt-get install git-core 按下回车后输入密码,即可完成Git的安装.但我们可 ...

  10. redis php扩展及基本命令

    linux 安装php mysql redis memchache 等工具 用 OneinStack 安装步骤 注意 如果有单独数据盘,建议您先挂载数据盘,建议将网站内容.数据库放在数据盘中.如何挂载 ...