- 浏览: 187734 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
grzrt:
zkf55915 写道哥们怎么用啊
好久不用了,就是看帮助资 ...
淘宝MetaQ开源消息队列安装 -
zkf55915:
哥们怎么用啊
淘宝MetaQ开源消息队列安装 -
grzrt:
jinnianshilongnian 写道整这个了?
没有 看 ...
linux内核中链表的实现 -
jinnianshilongnian:
整这个了?
linux内核中链表的实现
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量、低延迟、健壮、简 单,但不过分要求其扩展性。下面将展示一些该协议的核心内容:
另,本文仅讨论Zookeeper使用的一致性协议而非讨论其源码实现
Zookeeper的实现是有Client、Server构成,Server端提供了一个一致性复制、存储服务,Client端会提供一些具体的语 义,比如分布式锁、选举算法、分布式互斥等。从存储内容来说,Server端更多的是存储一些数据的状态,而非数据内容本身,因此Zookeeper可以 作为一个小文件系统使用。数据状态的存储量相对不大,完全可以全部加载到内存中,从而极大地消除了通信延迟。
Server可以Crash后重启,考虑到容错性,Server必须“记住”之前的数据状态,因此数据需要持久化,但吞吐量很高时,磁盘的IO便成为系统瓶颈,其解决办法是使用缓存,把随机写变为连续写。
考虑到Zookeeper主要操作数据的状态,为了保证状态的一致性,Zookeeper提出了两个安全属性(Safety Property)
- 全序(Total order):如果消息a在消息b之前发送,则所有Server应该看到相同的结果
- 因果顺序(Causal order):如果消息a在消息b之前发生(a导致了b),并被一起发送,则a始终在b之前被执行。
为了保证上述两个安全属性,Zookeeper使用了TCP协议和Leader。通过使用TCP协议保证了消息的全序特性(先发先到),通过
Leader解决了因果顺序问题:先到Leader的先执行。因为有了Leader,Zookeeper的架构就变为:Master-Slave模式,但
在该模式中Master(Leader)会Crash,因此,Zookeeper引入了Leader选举算法,以保证系统的健壮性。归纳起来
Zookeeper整个工作分两个阶段:
同一时刻存在一个Leader节点,其他节点称为“Follower”,如果是更新请求,如果客户端连接到Leader节点,则由Leader
节点执行其请求;如果连接到Follower节点,则需转发请求到Leader节点执行。但对读请求,Client可以直接从Follower上读取数
据,如果需要读到最新数据,则需要从Leader节点进行,Zookeeper设计的读写比例是2:1。
Leader通过一个简化版的二段提交模式向其他Follower发送请求,但与二段提交有两个明显的不同之处:
- 因为只有一个Leader,Leader提交到Follower的请求一定会被接受(没有其他Leader干扰)
- 不需要所有的Follower都响应成功,只要一个多数派即可
通俗地说,如果有2f+1个节点,允许f个节点失败。因为任何两个多数派必有一个交集,当Leader切换时,通过这些交集节点可以获得当前系统的最新状态。如果没有一个多数派存在(存活节点数小于f+1)则,算法过程结束。但有一个特例:
如果有A、B、C三个节点,A是Leader,如果B Crash,则A、C能正常工作,因为A是Leader,A、C还构成多数派;如果A Crash则无法继续工作,因为Leader选举的多数派无法构成。
2. Leader Election
Leader选举主要是依赖Paxos算法,具体算法过程请参考其他博文,这里仅考虑Leader选举带来的一些问题。Leader选举遇到的
最大问题是,”新老交互“的问题,新Leader是否要继续老Leader的状态。这里要按老Leader Crash的时机点分几种情况:
- 老Leader在COMMIT前Crash(已经提交到本地)
- 老Leader在COMMIT后Crash,但有部分Follower接收到了Commit请求
第一种情况,这些数据只有老Leader自己知道,当老Leader重启后,需要与新Leader同步并把这些数据从本地删除,以维持状态一致。
第二种情况,新Leader应该能通过一个多数派获得老Leader提交的最新数据
老Leader重启后,可能还会认为自己是Leader,可能会继续发送未完成的请求,从而因为两个Leader同时存在导致算法过程失败,解
决办法是把Leader信息加入每条消息的id中,Zookeeper中称为zxid,zxid为一64位数字,高32位为leader信息又称为
epoch,每次leader转换时递增;低32位为消息编号,Leader转换时应该从0重新开始编号。通过zxid,Follower能很容易发现请
求是否来自老Leader,从而拒绝老Leader的请求。
因为在老Leader中存在着数据删除(情况1),因此Zookeeper的数据存储要支持补偿操作,这也就需要像数据库一样记录log。
3. Zab与Paxos
Zab的作者认为Zab与paxos并不相同,只所以没有采用Paxos是因为Paxos保证不了全序顺序:
Because multiple leaders can propose a value for a given instance two problems arise. First, proposals can conflict. Paxos uses ballots to detect and resolve conflicting proposals. Second, it is not enough to know that a given instance number has been committed, processes must also be able to figure out which value has been committed.
Paxos算法的确是不关系请求之间的逻辑顺序,而只考虑数据之间的全序,但很少有人直接使用paxos算法,都会经过一定的简化、优化。
一般Paxos都会有几种简化形式,其中之一便是,在存在Leader的情况下,可以简化为1个阶段(Phase2)。仅有一个阶段的场景需要
有一个健壮的Leader,因此工作重点就变为Leader选举,在考虑到Learner的过程,还需要一个”学习“的阶段,通过这种方式,Paxos可
简化为两个阶段:
- 之前的Phase2
- Learn
如果再考虑多数派要Learn成功,这其实就是Zab协议。Paxos算法着重是强调了选举过程的控制,对决议学习考虑的不多,Zab恰好对此进行了补充。
之前有人说,所有分布式算法都是Paxos的简化形式,虽然很绝对,但对很多情况的确如此,但不知Zab的作者是否认同这种说法?
4.结束
本文只是想从协议、算法的角度分析Zookeeper,而非分析其源码实现,因为Zookeeper版本的变化,文中描述的场景或许已找不到对应的实现。另,本文还试图揭露一个事实:Zab就是Paxos的一种简化形式。
【参考资料】
- A simple totally ordered broadcast protocol
- paxos
发表评论
-
项目代码质量控制
2014-10-20 17:15 829在以后的开发项目时可以适当使用工具进行程序检查: 1、F ... -
WorkbookFactory 找不到
2013-11-08 10:46 994在最近的POI版本中,poi-3.9.jar包中找不到Work ... -
记一次JVM GC日志分析
2013-03-08 21:36 1748这几天在准备升级JDK版本到1.6,对目前线上JVM(版 ... -
Eclipse 相同变量的高亮 及颜色
2013-02-18 17:26 1646在Eclipse/MyEclipse中如果不小心把变量的高 ... -
java jstack dump 线程 介绍 解释
2013-02-05 15:52 1211hi,all: 最近抽时间把JVM运行 ... -
[转载]JDMK 基本JMX配置( html adaptor)
2013-01-07 13:37 1728原文地址: JDMK 基本JMX配置( html adap ... -
JAVA中的继承分析
2012-12-27 11:43 5146为什么写这篇博客,之前对继承的理解知识大体理论上,最近 ... -
JVM学习之:虚拟机中的运行时栈帧总结(二)
2012-12-12 19:46 838在 JVM学习之:虚拟机 ... -
JVM学习之:虚拟机中的运行时栈帧总结(一)
2012-12-12 19:45 868每 个人都知道,各种各样的动画视频,都是由一帧一帧图片连 ... -
JAVA字符串占位符
2012-12-06 08:24 3219包 java.text.MessageFormat java ... -
copy项目是容易出现的错误--webAppRootKey错误
2012-12-05 21:18 727Tomcat 发布多个项目时抛的webAppRootKey错误 ... -
web.xml配置总结
2012-12-05 20:50 663一、关于webAppRootKey的定义 默 ... -
spring组件扫描<context:component-scan/>使用详解
2012-12-05 19:14 730关于spring自动检测组件的使用方式网上太多了,而且也不 ... -
spring组件扫描<context:component-scan/>使用详解 (
2012-11-28 08:57 716关于spring自动检测组件的使用方式网上太多了,而且也不 ... -
static class 静态类(Java)
2012-11-23 20:20 871一般情况下是不可以用static 修饰类的。 ... -
redis主从的配置和使用
2012-11-23 14:24 1031redis主从的配置和使 ... -
java jvm 调优实战
2012-11-13 10:01 8111.eclipse 打印gc日志 eclipse根目录 ... -
浅谈java内存模型
2012-10-30 19:29 834不同的平台,内存模 ... -
四层和七层负载均衡的区别介绍
2012-09-12 11:46 858简单理解四层和七层负载均衡:①所谓四层就是基于IP+端口 ... -
LInux Tcp 延迟确认问题
2012-09-06 10:17 1392案例一:同事随手写个压力测试程序,其实现逻辑为:每秒钟先连续发 ...
相关推荐
Zookeeper的ZAB协议是其分布式一致性解决方案的关键,它是Paxos算法的一种简化实现,专为Zookeeper设计,用于提供崩溃恢复和原子广播功能。Zookeeper作为一个分布式协调服务,依赖ZAB协议保证集群中各节点的数据一致...
本文主要探讨了两种著名的一致性协议:Poxas协议和ZAB(Zookeeper Atomic Broadcast)协议,这两种协议广泛应用于分布式数据库和分布式协调服务中。 首先,让我们深入了解Poxas协议。Poxas是一种优化的一致性算法,...
在 Zookeeper 中,ZAB 协议 PLAY 一个非常重要的角色,Zookeeper 使用 ZAB 协议来实现分布式一致性,保证数据的一致性和可靠性。Zookeeper 的应用非常广泛,例如在分布式数据库、云计算、数据存储等领域都有应用。 ...
《Paxos到Zookeeper:分布式一致性原理与实践》从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议。同时,本书深入介绍了分布式...
ZAB协议是Zookeeper在数据一致性方面的重要保障,它确保了在分布式环境中,所有节点都能接收到相同的更新序列,从而保持数据的一致性。 首先,我们要理解ZAB协议的基本概念。ZAB协议是基于主备模式的,由一个领导者...
Zookeeper的设计基于一个简单的层次化命名空间模型,并采用了高效的复制协议来实现数据的一致性和高可用性。 ##### 3.1 Zookeeper架构 Zookeeper的基本架构包括客户端、服务器(Server)和日志(Log)三个主要组件...
ZOOKEEPER基于PAXOS算法的变种ZAB(ZooKeeper Atomic Broadcast)实现了一种强一致性的分布式协调服务。ZAB协议确保了在分布式系统中,所有节点对于数据更新的顺序有一致的认识,从而保证了数据的一致性。 在...
3. Zookeeper架构:描述Zookeeper的服务器集群结构,包括ZAB(Zookeeper Atomic Broadcast)协议,它是Zookeeper实现一致性的重要机制。 4. Zookeeper API:讲解如何使用Zookeeper提供的客户端API进行数据操作、监控...
它采用了ZAB(Zookeeper Atomic Broadcast)协议,这是一种基于Paxos算法优化的快速一致性协议,能够在保证强一致性的前提下,提高系统的可用性和性能。 在Zookeeper中,数据以树形结构进行组织,每个节点称为ZNode...
通过ZAB(ZooKeeper原子广播)协议来保证数据的一致性。 3. 数据存储:每个服务器节点都有一个内存数据库和一个持久化日志,用于快速响应读请求和在故障恢复时重建状态。 4. 集群模式:ZooKeeper采用半数以上节点...
《Paxos 到 Zookeeper:分布式一致性原理与实践》从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了 Paxos 和 ZAB 协议。同时,本书深入介绍了...
ZAB协议保证了在部分节点故障的情况下,Zookeeper集群仍然能够继续提供强一致性的服务。 在Zookeeper的架构中,每个节点被称为服务器,整个集群由多个服务器组成,通过TCP/IP通信。服务器之间通过心跳检测来发现和...
2. **领导者选举**:ZOOKEEPER集群中的节点通过ZAB协议选举出领导者,领导者负责处理所有客户端的事务请求,确保全局顺序的一致性。 3. **配置管理**:ZOOKEEPER可以作为配置中心,集中存储和更新分布式系统的配置...
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》是一本深入探讨分布式系统一致性问题的书籍,其中源码部分对于理解ZOOKEEPER如何实现分布式一致性具有极高的价值。PAXOS算法是分布式计算领域的一个里程碑,它为解决...
ZooKeeper采用了ZAB(ZooKeeper Atomic Broadcast)协议,这是一种基于主备模式的快速恢复一致性协议,它简化了Paxos算法,确保在分布式环境中高效地进行状态同步。 在ZooKeeper的3.4.6版本中,有以下关键特性: 1....
《Paxos到Zookeeper:分布式一致性原理与实践》从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议。同时,本书深入介绍了分布式...
一致性协议:zab协议 zookeeper的leader选举 observer角色及其配置 zookeeperAPI连接集群 zookeeper 开源客户端curator介绍 zookeeper四字监控命令 zookeeper图形化的客户端工具(ZooInspector) taokeeper监控工具的...
3. **Zab协议**:ZooKeeper采用ZAB(ZooKeeper Atomic Broadcast)协议来保证分布式一致性。ZAB协议结合了主备选举和原子广播,确保在分布式环境中数据的一致性和完整性。 **源码结构分析** ZooKeeper的源码主要...
《从Paxos到ZooKeeper分布式一致性原理与实践》这本书深入探讨了分布式系统中的一致性问题,其中涵盖了从理论到实际应用的关键技术。Paxos算法是分布式一致性领域的基石,而ZooKeeper则是基于Paxos算法实现的一个...
ZooKeeper基于PAXOS算法的简化版本——ZAB(ZooKeeper Atomic Broadcast)协议,实现了高可用性和一致性。ZAB协议保证了在领导者选举、数据同步等操作中的原子广播,确保所有副本节点状态的一致性。 在ZooKeeper中...