- 浏览: 1596170 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
继上一篇的zookeeper的学习,上一篇主要偏向于zookeeper的总体结构的熟悉和使用层面。 本文主要是记录自己学习其内部的选举算法,一致性处理策略。
过程
在开始之前,推荐几篇比较不错的文章:
zookeeper server
入口:org.apache.zookeeper.server.quorum.QuorumPeerMain
- 通过QuorumPeerConfig读取zoo.cfg配置文件,myid信息等。 具体的参数可以参考官方文档: http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
主要关注几个参数:peerType=observer/participant (是否是观察者,或者参与Leader/Follower) electionAlg=0/1/2/3/ (选举算法) server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 group.1=1:2:3 (机器分组) group.2=4:5:6 group.3=7:8:9 weight.1=1 (某机器权重) weight.2=1 weight.3=1
- 创建QuorumPeer,启动服务。
QuorumPeer:
- 首先加载本地的zkDatabase
- startLeaderElection,发起一次Leader选举。 选举算法:LeaderElection / FastLeaderElection / AuthFastLeaderElection
- 确定自己的角色后,进行响应的角色初始化:
OBSERVING : observer.observeLeader();
FOLLOWING : follower.followLeader();
LEADING : leader.lead();
LeaderElection算法:
- 每个机器节点加入,都发起一次Vote。
- zookeeper server节点接受到新一轮的Vote,都返回上一轮的Leader选举的最后Vote结果。如果处于LOOKING,比如第一次加入的机器,则Vote自己
- 发起Vote的机器,收集完所有server的Vote结果(包括自己),统计一下结果,并且判断一下是否超过半数
if (result.winningCount > (self.getVotingView().size() / 2))
注意:这里的>号,所以如果单台机器启动,无法通过给自己Vote,使自己成为Leader。一定要>=2台机器的参与 - 如果没有超过半数,则记录一下本次的投票结果。下一次Vote时,就直接投给上一轮票数最高的Vote,继续进入步骤3
说明: myid序号大的在Vote选举时比较有优势,同样的票数winner会是myid最大的server,从而保证每次的Vote必然会产生一个唯一的winner。
FastLeaderElection算法:
- 每个机器节点加入,都向外部建议自己做为Leader。
- zookeeper server接受到请求后,进行一个抉择:
if ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))
判断当前的zxid和myid是否大于当前Vote,如果是则更新之,并同样广播给所有的server。
注意:
Notification中有个epoch标志,表明当前发起的Vote的传递的次数。比如A发给B,B更新了自己的Vote后,再发给C。这时发的通知中epoch=2。
有点类似图论里的概念,如果notice.epoch < 当前最后一次更新Vote的epoch,则不做任何处理。一个逐步收敛的有向环图 - 单个机器上收到了其他所有机器的Vote结果后,判断出最后的winner结果
Leader处理:
- 启动LearnerCnxAcceptor,监听Follower的请求。针对每个链接的Follower,开启一个新线程LearnerHandler进行处理
- 然后针对所有的LearnerHandler,while(true)进行心跳检查ping。针对每次ping结果,针对有ack响应的结果进行vote统计,如果发现超过半数失败,则退出当前的Leader模式,这样又是发起新一轮的选举
Follower处理:
- 建立socket,链接到Leader server上
- 发起一次syncWithLeader同步请求,此时Leader会根据当前的最大的zxid对比客户端的zxid,发送DIFF/TRUNC/SNAP指令给follower上,保证follower和leader之间的数据一致性。
- 同步完成后,就进入while(true){read , process}的工作模式,开始接受Leader的指令并处理
PING : 响应Ack
PROPOSAL : 记录到自己的缓冲队列pendingTxns中,等待sync指令后刷新到zkDataBase中。有点类似2PC阶段事务
COMMIT : 刷新pendingTxns中的对应记录
SYNC : 客户端的同步request请求
Observer处理:
- 建立socket,链接到Leader server上
- 发起一次syncWithLeader同步请求
- 同步完成后,进入while(true){read , process}的工作模式,和Follower有点不同,主要在于其不处理PROPOSAL/COMMIT等2PC阶段。只接受INFORM,Leader告诉最终的更新结果,Observer直接提交到zkDataBase中。
针对Leader/Follower/Observer都有对应的ZooKeeperServer提供客户端的处理,分别是:LeaderZooKeeperServer / FollowerZooKeeperServer / ObserverZooKeeperServer 。
下面继续来看一下对应的Server处理,主要区别在于RequestProcessors的组织上。
LeaderZooKeeperServer处理:
- PrepRequestProcessor -> ProposalRequestProcessor -> CommitProcessor -> toBeAppliedProcessor -> FinalRequestProcessor处理顺序
- PrepRequestProcessor主要处理ACL控制,不细讲,自己看看代码就懂的
- ProposalRequestProcessor,处理有点特殊。因为Leader server同样会提供客户端API的create操作,所以需要做特殊处理
1. 如果请求是LearnerSyncRequest,表明是leader做为server提供给客户端服务,并且接受到客户端的sync请求。
2. 否则认为是需要进行决策,发给所有的follower进行投票。(这里的请求可能来自于follower的写动作请求leader决策,也可能是leader做为server自己接收到的请求),通过AckRequestProcessor先给自己投票。
注意: ProposalRequestProcessor只会针对create/delete等写操作会发起一次Vote。 读操作会直接交由后续的Processor进行处理 - CommitProcessor主要是一些等待commit处理的request,接收到sync指令后就会提交到下一个Processor进行处理。
做为leader,会在收集足够的Vote后,自己会给自己发送一次sync指令
做为Follower,会受到Leader发送的Sync指令,然后自己提交commit动作 - toBeAppliedProcessor: 主要的作用就是记录当前正在提交到zkDatabase中的request数据,保证新的Follower连接上来时,能获取到这些处于内存中"正准备提交"的数据
- FinalRequestProcessor : 处理最后的请求,比如读/写请求,此时所有的server都会同步的写入数据。
FollowerZooKeeperServer处理:
- 接受客户端请求: FollowerRequestProcessor -> CommitProcessor -> FinalRequestProcessor
1. 客户端接受请求后,针对一些写动作(比如create,delete,setData,setAcl等),FollowerRequestProcessor会发起一个request,请求leader进行所有server的一致性的控制。 同时会将request请求递交到commitProcessor
2. CommitProcessor请求,会等待leader的sync request请求,会提取出相对应的request,提交到下一个processor进行处理。
3. FinalRequestProcessor,处理最终的指令请求。因为一些写动作通过follower->leader的交互已经得到Leader的ack,会保证每个节点都能写入request数据。 - 处理Leader的PROPOSAL/COMMIT: SyncRequestProcessor -> SendAckRequestProcessor。 (主要是接受Leader广播的其他server的数据变更事件,保证所有server都能得到同步更新)
1. 主要是接受到Leader的PROPOSAL request后,先将request暂存于pendingTxns,并提交到SyncRequestProcessor的queue队列,排队进行后续发送Ack给Leader处理
2. 接受到Leader端的sync/commit指令,将pending的request请求提交到当前server的zkDataBase中。
ObserverZooKeeperServer处理:
- 接受断乎端请求: ObserverRequestProcessor -> CommitProcessor -> FinalRequestProcessor
ObserverZooKeeperServer处理和FollowerZooKeeperServer基本类似,只不过它不会处理Leader的PROPOSAL/COMMIT事件,也就是不会参与Vote处理。
哈哈,图画起来挺累人的,这里盗用了taobao同学画的图,原文可参考前面推荐的图。
Leader处理:
Follower处理:
Leader/Follower之间的消息传递:
最后
感慨几下:
1. 彪悍的图,画的比较精细,不是真正了解Follower/Leader之间的数据处理,不太容易看的懂
2. zookeeper开发者仅仅通过Tree树状结构,可以实现分布式一致性控制,可以衍生出Barrier,Lock等功能。感叹人的智慧
3. 感叹淘宝的同学,发觉在rdc.taobao.com/上有n多人研究分布式的相关内容,而且文章质量都不错。为啥同样是阿里的子公司,学习的氛围咋就差这么多呢,可能一个原因还是数据量的问题。
评论
4 楼
巴尾的兔兔帅
2014-06-13
您好,前辈。看了您的博客收益匪浅,请问您说的画图的“淘宝的同学”有没有博客呢?
3 楼
leobasic
2014-06-03
看见这图,腿都软了
2 楼
agapple
2013-03-13
sbfeeq 写道
楼主,这图知道是用什么软件画的吗?这线太强大了。。
不是我画的,淘宝的某人画的
1 楼
sbfeeq
2013-03-12
楼主,这图知道是用什么软件画的吗?这线太强大了。。
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6517背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
映射规则配置
2013-09-26 11:25 0背景 因为alibaba的特殊业务,比如: 同 ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40441项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ... -
Otter Manager介绍
2013-08-16 11:16 0背景 otter4.0发布至 ... -
Otter QuickStart
2013-08-14 14:56 0几点说明 otter依赖于canal提供数据库 ...
相关推荐
### Zookeeper 学习笔记 #### 一、Zookeeper 简介与安装配置 **Zookeeper** 是一个分布式协调服务框架,它提供了一种高效可靠的机制来维护集群中的配置信息、命名服务以及提供分布式锁等功能,使得开发人员能够...
【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...
Zookeeper是一种重要的分布式协调服务,尤其在处理高可用性、高性能的应用场景中。它最初设计的核心功能是提供分布式锁服务,但随着社区的发展,Zookeeper的功能得到了扩展,现在还用于配置维护、组服务、分布式消息...
ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。
### ZooKeeper概述 ZooKeeper,如同其名字所暗示的那样,扮演着“动物园管理员”的角色,主要负责管理和协调各种分布式应用程序(如Hadoop、Hive、Pig等)。它是一个开源的分布式协调服务框架,旨在帮助开发者解决...
总的来说,尚硅谷2021年的ZooKeeper笔记提供了一套全面的学习资源,帮助开发者深入了解ZooKeeper的工作原理及其在分布式系统中的关键作用。通过深入学习和实践,可以提升在分布式协调领域的技术水平。
Zookeeper是Apache Hadoop项目下的一个子项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。...通过深入学习和实践,可以更好地应对分布式环境中的各种挑战。
《Zookeeper一站式学习资料》是一份全面覆盖Zookeeper基础到高级知识的学习资源包,旨在帮助初学者快速入门并深入理解Zookeeper。这份资料包含了丰富的文本资料、视频教程以及相关的实践代码,是学习分布式协调服务...
### Zookeeper 学习手册知识点概览 #### 1. ZooKeeper 基本概念 - **角色**: - **Leader**:集群中的领导者,负责处理客户端的写请求,并保持集群状态的一致性。 - **Follower**:集群中的跟随者,处理客户端的...
时间戳记录znode的最后修改时间。 【Zookeeper的Java API和动态感知】 Zookeeper 提供了丰富的Java API,允许开发者方便地创建、删除、更新和查询znode,以及监听znode的变化。动态感知功能使得客户端能够实时感知...
### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。
本篇笔记主要围绕这两个技术进行深入探讨,结合尚硅谷的视频教程资源,旨在帮助读者全面理解并掌握这两者的核心知识。 一、Zookeeper:分布式协调服务 Zookeeper是由Apache开发的一款开源分布式协调服务,它提供了...
- **培训和演示**:可视化的界面使新人更容易理解和学习Zookeeper的工作原理。 总之,Zookeeper可视化工具是管理和维护Zookeeper集群不可或缺的助手,通过它们,我们可以更高效、更安全地操作Zookeeper,实现分布式...
“zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...
而“尚硅谷大数据技术之Zookeeper.xmind”思维导图,则是将整个Zookeeper的知识体系以图形化的形式展现出来,帮助学习者梳理知识点,形成全面的认知框架。 总的来说,这个教程提供了从理论到实践的全面学习材料,...
【Zookeeper概述】 Zookeeper是Apache Hadoop的一个子项目,主要设计用于解决分布式环境中的数据管理问题,如统一命名服务、状态同步、集群管理和配置管理等。作为一个分布式服务框架,Zookeeper采用Java编写,同时...
**Zookeeper入门练习Demo** Zookeeper是一个分布式协调服务,由Apache Hadoop...这将为后续深入学习和应用Zookeeper打下坚实的基础。在实践中遇到问题,不要忘记查阅官方文档和社区资源,它们会提供详细的解答和指导。