`
lingqi1818
  • 浏览: 249268 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

zookeeper源码学习

阅读更多
上周在同事的唆使下,我抽空把zookeeper的实现研究了下,把分享帖给大家:


1. paxos算法介绍
如何达成一致性是分布式系统上的一个经典问题,而paxos就是用来解决这个问题的。
对于该算法的介绍,可以先读一下此文:
http://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%95
说白了,就是针对于一个提案,只要半数以上成员达成一致,那么提案就被通过了。若是有部分成员记性差,忘记了上次的提案,只要仍旧有半数以上的成员还记得,就可以把之前的一致告诉他。

在经典的paxos算法中,有如下几个成员:
1. proposers:提议发起者
2. acceptors:提案处理者
3. learners:提案学习者(只能学习被通过的提案)

提案的处理分成2个阶段:
1. prepare 阶段:
proposer 选择一个提案编号 n 并将 prepare 请求发送给 acceptors 中的一个多数派;
acceptor 收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息,则 acceptor 将自己上次接受的提案回复给 proposer,并承诺不再回复小于 n 的提案;
2. 批准阶段:
当一个 proposor 收到了多数 acceptors 对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的 acceptors 发送 accept 请求,包括编号 n 和之前已经accept正在处理中的提案。
在不违背自己向其他 proposer 的承诺的前提下,acceptor 收到 accept 请求后即接受这个请求。
这个过程在任何时候中断都可以保证正确性。例如如果一个 proposer 发现已经有其他 proposers 提出了编号更高的提案,则有必要中断这个过程。因此为了优化,在上述 prepare 过程中,如果一个 acceptor 发现存在一个更高编号的提案,则需要通知 proposer,提醒其中断这次提案。

流程图如下:



2.Zookeeper介绍

Zookeeper是paxos算法的实现,它的默认实现(FastLeaderElection)对经典paxos的2个阶段处理进行了改进,改为了一个阶段。

处理流程图如下:




这里需要对几个角色做下解释:
1. proposer:提案发起者
2. Leader:一致达成之后的领导者,当有人忘记之前提案的时候,可以和它进行同步。
3. Follower:可以发起投票的参与者。
4. Observer:只能接受数据,但不能发起投票。

接下来,我们看下zookeeper的启动流程:


启动流程:
QuorumPeerMain->initializeAndRun
                            |_NIOServerCnxn.Factory
                            |_quorumPeer
                                      |_start
                                          |_zkDb.loadDataBase()
                                          |_cnxnFactory.start()->doIO
                                          |_startLeaderElection->createElectionAlgorithm->listener.start
                                          |_super.start

Zookeeper有2种工作模式,standalone模式和集群模式,当配置的server小于等于1台则为单机模式,这里我们讲的是集群模式。

quorumPeer为集群中每台机器还未确定角色的名称。
启动步骤为:
1. 从本地加载数据。
2. 启动cnxnFactory用于监听客户端和follower的请求。
3. startLeaderElection启动选举算法,默认为FastLeaderElection
4. 启动选举结果监听器,用于达成一致性。
5. quorumPeer线程主循环启动,在选举成功后,进入自己的角色。还未投票前为LOOKING
成功后为:LEADING,OBSERVING,或FOLLOWING

假如为leading,则初始化leader,过程为:
Leader.lead()->LearnerCnxAcceptor->LearnerHandler

LearnerHandler这个线程处理所有Learner(包括Follower和Observer)的交互逻辑。从Learner发来的消息有以下几种:
1.ACK消息。这是Follower对PROPOSAL消息的响应。Leader收到这个消息后,判断对应的PROPOSAL如果有过半的voter通过,则发送commit请求到CommitProcessor线程的CommittedRequest队列,并且发送Commit消息给所有Follower,发送INFORM消息给所有Observer(告诉这个Proposal通过了)。
2. REQUEST消息。这是Follower转发来的写请求,或者同步请求。转交给PrepRequestProcessor线程处理(放入其submittedRequests队列)
3. PING消息。Learner的心跳消息
4. REVALIDATE消息。用来延长session有效时间

另外,LeaderZooKeeperServer也会在lead函数中被初始化,并setupRequestProcessors
这样,所有进入leader的请求都会走流程:
PrepRequestProcessor->ProposalRequestProcessor->CommitProcessor->ToBeAppliedRequestProcessor->FinalRequestProcessor

假如是读请求,那么PrepRequestProcessor会直接响应用户。
假如是写请求,那么PrepRequestProcessor会向Follower发送PROPOSAL请求。
然后,把request放入到CommitProcessor的queuedRequests,当committedRequests中收到LearnerHandler接受到Follower对PROPOSAL消息的响应消息后。则CommitProcessor处理该request,并进入后续流程。

大致过程如上所述,如有疑问,有空一起交流下。

  • 大小: 23.2 KB
  • 大小: 42.9 KB
分享到:
评论
1 楼 leibnitz 2015-03-21  
有几点要请教下;
a.在二阶段里有这样一句:
引用
例如如果一个 proposer 发现已经有其他 proposers 提出了编号更高的提案,则有必要中断这个过程

为什么要打断呢,打断不是造成混乱吗?
b.图1中的response 由learner返回觉得不对,而图2中的才是正确的.
c.2中说是改为一阶段,其实本质是还是2个阶段,只是leader封装了吧.

sincerely

相关推荐

    Dubbo+Zookeeper源码(提供者+消费者实例

    Dubbo+Zookeeper源码(提供者+消费者实例,自己写的简单的Dubbo+Zookeeper测试小实例,合适初学者学习参考。

    ZooKeeper-:ZooKeeper源码剖析

    优秀时间学习了一下ZooKeeper:分布式过程协调这本书的内容,对ZooKeeper实现的细节很好奇,所以顺便把ZooKeeper源码看了一遍。看完之后想写点内容做个笔记,确实发现不好开始。由于ZooKeeper一个完整的逻辑的代码...

    Zookeeper学习教程 包括java源码

    Zookeeper学习 Zookeeper是一个由Java编写并开源的,为分布式系统提供协调服务的框架. Zookeeper概述 Zookeeper最早起源于雅虎研究院的一个小组.当时研究人员发现,在雅虎内部的很多系统基本都依赖一个类似的系统来...

    最详细Zookeeper学习资料(源码)

    ZooKeeper是一个开源的分布式协调服务,最初由雅虎公司开发,后来成为Apache基金会的顶级项目。它为分布式应用程序提供了高性能的协调服务,包括配置管理、命名服务、分布式同步和组服务等功能。 ZooKeeper的主要...

    从Paxos到Zookeeper分布式一致性原理与实践包括源码

    从Paxos到Zookeeper分布式一致性原理与实践包括源码推荐给需要学习的童鞋

    Zookeeper学习资源和笔记(附代码)

    适合初学入门,知识巩固。涵盖安装配置、命令操作、Java API操作、事件监听、分布式锁、集群搭建等知识

    springboot集成dubbo、zookeeper,基于注解形式+源代码+文档说明

    #### 1、下载zookeeper源码包 > 官方下载地址: http://apache.fayea.com/zookeeper/ > 本项目使用的版本: zookeeper-3.5.1-alpha.tar.gz #### 2、安装zookeeper > 1、解压安装包到指定目录 > `sudo tar -zxvf ...

    zookeeper-3.4.13.tar.gz

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。其中,ZooKeeper-3.4.13.tar.gz 是非常适合学习的版本,在很多教材中本被使用。欢迎大家...

    Zookeeper学习中的疑难问题总结,很受用!

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和...

    zookeeper的极客学院的视频资料

    里面是极客学院的zookeeper的视频资料,讲的还是可以的 ,适合初学者了解和学习

    zookeeper-3.4.5

    Zookeeper-3.4.5,官网下载,有利于学习Zookeeper源码的爱好者。

    Zookeeper .mmap

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、...

    java高级软件工程师教程快速入门Zookeeper+dubbo视频教程

    系统的学习Dubbo技术栈,掌握Dubbo、Zookeeper架构原理及应用。 lZookeeper 分布式CAP原则 2PC、3PC Paxos、ZAB ZK单机&集群 快速入门 源码解析 场景应用 分布式锁、队列 1Dubbo RPC核心 RPC实现 容错&治理 IO模型&...

    Dubbo与Zookeeper详细例子

    压缩包内含有Dubbo后台管理系统、Zookeeper服务器以及Dubbo提供者和消费者源码。还有一份本人手写Txt文档使用详细介绍,内含本人联系方式,欢迎爱学习的你联系我,相互学习、交流。

    zookeeper.pdf

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是 Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域 名服务、...

    吊打面试官之基于zookeeper实现分布式锁源码

    吊打面试官之基于zookeeper实现分布式锁源码

    Zookeeper集群架构全面实战

    非常强的一套Zookeeper集群实战,包含了全套的学习代码,学习笔记还有学习资料。内容从Zookeeper入门教学,本地安装,Zookeeper集群实战,项目需求,Zookeeper企业面试实战,Zookeeper算法实战,Zookeeper核心源码...

    基于SSM和zookeeper的健康医疗项目设计源码

    本设计源码提供了一个基于SSM和zookeeper的健康医疗项目。项目包含1549个文件,主要使用Java编程语言,并包含了JavaScript、CSS、HTML、PHP。文件类型包括953个JavaScript脚本文件、148个PNG图片文件、117个XML配置...

    大数据处理利器:Spark+ZooKeeper+Kafka Scala源码示例

    项目概述:此项目为大数据处理利器集,以Scala为主要编程语言,辅以Java,共包含530个文件。...该代码集是大数据处理领域的实践宝库,适合对Spark、ZooKeeper和Kafka有一定了解的开发者深入学习和参考。

Global site tag (gtag.js) - Google Analytics