ZooKeeper服务-一致性、实现
实现
ZooKeeper服务有两种不同的运行模式。一种是“独立模式”(standalone mode),即只有一个ZooKeeper服务器。这种模式比较简单,适合于测试环境,但是不能保证高可用性和可恢复性。在生产环境中的ZooKeeper通常以“复制模式”(replicated mode)运行于一个计算机集群上,这个计算及集群被称为一个“集合体”(ensemble)。
ZooKeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够提供服务。所以,一个集合体中通常包含奇数台机器。
ZooKeeper所做的就是确保对znode树的每一个修改都会被复制到集合体中超过半数的机器上。如果少于半数的机器出现故障,则最少有一台机器会保存最新的状态,其余的副本最终也会更新到这个状态。
ZooKeeper使用了Zab协议,该协议包括两个可以无限重复的阶段。
1. 阶段1:领导者选举
集合体中的所有机器通过一个选择过程来选出一台被称为“领导者“(leader)的机器,其他的机器被称为跟随者(follower)。一旦半数以上(或指定数量)的跟随者已经将其状态与领导者同步,则表明这个阶段已经完成。
2. 阶段2:原子广播
所有的写请求都会被转发给领导者,再由领导者将更新广播给跟随者。当半数以上的跟随者已经将修改持久化之后,领导者才会提交这个更新,然后客户端才会收到一个更新成功的相应。这个用来达成共识的协议被设计成具有原子性,因此每个修改要么成功要么失败。
如果领导者出现故障,其余的机器会选出另外一个领导者,并和新的领导者一起继续提供服务。随后,如果之前的领导者恢复正常,会成为一个跟随者。领导者选举的过程非常快,只需要大约200毫秒,因此在领导者选举的过程中不会出现系统性能的明显降低。
在更新内存中的znode树之前,集合体中的所有机器都会先将更新写入磁盘。任何一台机器都可以为读请求提供服务,并且由于读请求只涉及内存检索,因此非常快。
一致性
一个跟随者可能滞后于领导者几个更新。一个修改被提交之前,只需要集合体中半数以上机器已经将该修改持久化即可。对ZooKeeper来说,理想的情况就是将客户端都连接到与领导者状态一致的服务器上。每个客户端都有可能被连接到领导者,但客户端对此无法控制,甚至它自己都无法知道是否连接到领导者。
每一个对znode树的更新都被赋予一个全局唯一的ID,称为zxid(代表“ZooKeeper Transaction ID“). ZooKeeper要求对所有的更新进行编号并排序,它决定了分布式系统的执行顺序,如果zxid z1小于z2,则z1一定发生在z2之前。
以下几点保证了数据的一致性
1. 顺序一致性
来自任意特定客户单的更新都会按其发送顺序被提交。也就是说,如果一个客户端将znode z的值更新为a,在之后的操作中,它又将z的值更新为b,则没有客户端能够在看到z的值是b之后再看到值a(如果没有其他对z的更新)
2. 原子性
每个更新要么成功,要么失败。这意味着如果一个更新失败,则不会有客户端看到这个更新的结果。
3. 单一系统映像
一个客户端无论连接到哪一台服务器,它看到的都是同样的系统视图。这意味着,如果一个客户端在同一个会话中连接到一台新的服务器,它所看到的系统状态不会比在之前服务器上所看到的更老。当一台服务器出现故障,导致它的一个客户端需要尝试连接集合体中其它的服务器时,所有状态滞后于故障服务器的服务器都不会接受该连接请求,除非这些服务器将状态更新至故障服务器的水平。
4. 持久性
一个更新一旦成功,其结果就会持久存在并且不会被撤销。这表明更新不会受到服务器故障的影响。
5. 及时性
任何客户端所看到的滞后系统视图都是有限的,不会超过几十秒。这意味着与其允许一个客户端看到非常陈旧的数据,还不如将服务器关闭,强迫该客户端连接到一个状态较新的服务器。
出于性能的原因,所有的读操作都是从ZooKeeper服务器的内存获得数据,它们不参与写操作的全局排序。如果客户端之间通过ZooKeeper之外的机制进行通信,则客户端可能会发现它们所看到的ZooKeeper状态是不一致的。
例如,客户端A将znode z的值从a更新为a1,接着A告诉B去读z的值,而B读到的值是a而不是a1。这与ZooKeeper的一致性保证是完全兼容的(这种情况称为“跨客户端视图的同时一致性“)。为了避免这种情况发生,B应该在读z的值之前对z调用sync操作。Sync操作会强制B所连接的ZooKeeper服务器”赶上“领导者,这样当B读z的值时,所独到的将会是A所更新的。
Sync操作只能以异步的方式被调用。不需要等待sync调用的返回,ZooKeeper会保证任何后续的操作都在服务器的sync操作完成后才执行,哪怕这些操作是在sync操作完成之前发出的。
ZooKeeper服务-一致性、实现的更多相关文章
- zookeeper服务发现实战及原理--spring-cloud-zookeeper源码分析
1.为什么要服务发现? 服务实例的网络位置都是动态分配的.由于扩展.失败和升级,服务实例会经常动态改变,因此,客户端代码需要使用更加复杂的服务发现机制. 2.常见的服务发现开源组件 etcd—用于共享 ...
- 《从Paxos到ZooKeeper 分布式一致性原理与实践》读书笔记
一.分布式架构 1.分布式特点 分布性 对等性.分布式系统中的所有计算机节点都是对等的 并发性.多个节点并发的操作一些共享的资源 缺乏全局时钟.节点之间通过消息传递进行通信和协调,因为缺乏全局时钟,很 ...
- Apache ZooKeeper 服务启动源码解释
转载:https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper-code/ 本文首先讲解了 Apache ZooKeeper 服 ...
- Zookeeper 源码(四)Zookeeper 服务端源码
Zookeeper 源码(四)Zookeeper 服务端源码 Zookeeper 服务端的启动入口为 QuorumPeerMain public static void main(String[] a ...
- 我读《从Paxos到zookeeper分布式一致性原理与实践》
从年后拿到这本书开始阅读,到准备系统分析师考试之前,终于读完了一遍,对Zookeeper有了一个全面的认识,整本书从理论到应用再到细节的阐述,内容安排从逻辑性和实用性上都是很优秀的,对全面认识Zook ...
- ZooKeeper服务-操作(API、集合更新、观察者、ACL)
操作 create:创建一个znode(必须要有父节点)delete:删除一个znode(该znode不能有任何子节点)exists:测试一个znode是否存在并且查询它的元数据getACL,setA ...
- Zookeeper——分布式一致性协议及Zookeeper Leader选举原理
文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...
- 从Paxos到Zookeeper 分布式一致性原理与实践读书心得
一 本书作者介绍 此书名为从Paxos到ZooKeeper分布式一致性原理与实践,作者倪超,阿里巴巴集团高级研发工程师,国家认证系统分析师,毕业于杭州电子科技大学计算机系.2010年加入阿里巴巴中间件 ...
- 【分布式】Zookeeper服务端启动
一.前言 前面已经了解了Zookeeper会话相关知识点,接着来学习Zookeeper服务端相关细节. 二.服务端 服务端整体架构如下 Zookeeper服务器的启动,大致可以分为以下五个步骤 1. ...
随机推荐
- Android Studio下通过Gradle配置实现资源文件的模块化
当开发一个app模块个数很多的时候,资源文件就会特别多,布局也会多起来,这时所有的layout都放在同一个目录下,就会显得臃肿,而且不好找相应的布局. 最近看到相关资料,发现在Android Stud ...
- Chocolate Bar(暴力)
Chocolate Bar Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement There is ...
- 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务
在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...
- Spring JDBC-混合框架的事务管理
Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特色,各有千秋. Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便 MyBatis 则通过模板化 ...
- <2013 06 24> 关于Zigbee项目_Munik_TUM_eCar
(本月)6月4号到德国慕尼黑,参与TUM大学的一个电动车项目组,预计时间3个月. 我的任务是参与wireless的研究,主要就是用无线链接取代有线链接(汽车线缆很多很讨厌). 使用的是TI MP430 ...
- Bean\Entity\Model\POJO\Dto\EJB简单解析
一.Bean 对于Bean而言,只要是Java的类的就可以称为一个Bean, 更用在Spring上,被Spring管理的对象就可以将其称作为Bean. 它不仅仅可以包括对象的属性以及get,set方法 ...
- MySQL 第三天
回顾 字段类型(列类型): 数值型, 时间日期型和字符串类型 数值型: 整型和小数型(浮点型和定点型) 时间日期型: datetime, date,time,timestamp, ye ...
- 020-Spring Boot 监控和度量
一.概述 通过配置使用actuator查看监控和度量信息 二.使用 2.1.建立web项目,增加pom <dependency> <groupId>org.springfram ...
- 0607pm克隆&引用类&加载类&面向对象串讲&函数重载
克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->s ...
- JavaScript:基础扩展(1)——JSON
JavaScript:扩展知识(1)——JSON 理解: 关于 JSON,最重要的是要理解它是一种数据格式,不是一种编程语言.虽然具有相同的语法形式,但 JSON 并不从属于 JavaScript.而 ...