`
lingqi1818
  • 浏览: 253334 次
  • 性别: 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

相关推荐

    Zookeeper源码分析

    《Zookeeper源码分析》 Zookeeper是一款分布式协调服务,广泛应用于分布式系统中,提供诸如命名服务、配置管理、集群同步、领导者选举等核心功能。本文将深入剖析Zookeeper的工作原理,以及其内部实现的FastLeader...

    Ant编译后的zookeeper源码

    在这个“Ant编译后的zookeeper源码”中,我们主要关注的是ZooKeeper 3.4.11版本,这是ZooKeeper的一个稳定版本,包含了丰富的功能和修复了许多已知的问题。Ant是Apache基金会的一个项目,它是一个Java构建工具,类似...

    ZooKeeper源码

    《深入解析ZooKeeper源码》 ZooKeeper是一款分布式协调服务,由雅虎创建并开源,现为Apache基金会顶级项目。它为分布式应用提供一致性服务,如命名服务、配置管理、集群同步、分布式锁等。本文将深入探讨ZooKeeper...

    Zookeeper源码剖析:深入理解Leader选举机制

    **Zookeeper源码剖析:深入理解Leader选举机制** 在分布式协调服务Zookeeper中,Leader选举是其核心功能之一,确保了服务的高可用性和一致性。本文将深入Zookeeper的源码,探讨Leader选举的实现机制。 **为什么要...

    ZooKeeper源码Eclipse工程项目

    该项目名为“ZooKeeper源码Eclipse工程项目”,意味着它是专门为Eclipse IDE准备的,可以直接导入进行阅读和学习,无需通过ANT等构建工具编译。这使得开发者可以更便捷地在IDE环境中查看、调试和理解代码。 ...

    zookeeper ui界面源码(github)

    总的来说,通过分析这个开源项目,我们可以深入理解ZooKeeper的工作原理,学习前端开发、RESTful API设计、分布式系统监控等方面的知识,同时也能参与到开源社区,提升自己的技术水平和协作能力。

    zookeeper 源码导入eclipse时下载的cache包等文件

    在导入ZooKeeper源码时,"cache"包等文件通常包含了一些构建过程中的临时文件、缓存或者配置信息。这些文件对于构建过程至关重要,因为它们记录了Ant在构建过程中的一些状态,例如下载的依赖库、编译的中间结果等。...

    08_尚硅谷技术之Zookeeper(源码解析)V3.3.pdf

    Zookeeper作为分布式协调服务,其设计初衷就是为了帮助分布式系统维护数据的一致性。Zookeeper的实现基于一种被称为Paxos的算法,Paxos算法是解决分布式系统中一致性问题的一种经典算法。 Paxos算法的核心思想是...

    zookeeper 自己学习资料

    Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    dubbo+zookeeper案例,dubbo和Zookeeper详解,Java源码.zip

    《Dubbo与Zookeeper深度解析:Java源码实践》 在现代分布式系统中,服务治理是不可或缺的一部分。Dubbo和Zookeeper作为两个重要的组件,分别承担了服务治理和注册中心的角色,它们共同构建了高效、稳定的微服务体系...

    ZooKeeper-:ZooKeeper源码剖析

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

    zookeeper-3.4.8源码包

    《深入剖析Zookeeper 3.4.8源码》 Zookeeper作为一个分布式协调服务,是Apache Hadoop项目的重要组成部分,广泛应用于...通过学习源码,开发者可以更好地利用Zookeeper解决实际问题,并为未来的系统设计提供灵感。

    Dubbo新手入门实例HelloWorld(zookeeper)源码

    【Dubbo新手入门实例HelloWorld(zookeeper)源码】是一个非常适合初学者的教程,它将带你深入了解如何在实际项目中使用Dubbo框架,并结合Zookeeper作为注册中心进行服务治理。Dubbo是阿里巴巴开源的一个高性能、轻量...

    zookeeper-release-3.5.4.7z

    《Zookeeper源码解析——基于3.5.4版本》 Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单...

    zookeeper 例子 源码 jar

    学习和分析ZooKeeper源码有助于开发者更好地理解分布式协调服务的实现,从而在实际项目中更有效地使用和优化ZooKeeper。例如,通过研究源码,你可以了解如何自定义Watcher,或者如何在高并发环境下优化ZooKeeper的...

    Zookeeper搭建和原理学习

    Zookeeper 搭建和原理学习 Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现。它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理...

    Zookeeper学习教程 包括java源码

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

    zookeeper-3.4.9的源码

    通过深入学习和理解Zookeeper-3.4.9的源码,可以更好地了解分布式协调服务的工作原理,为构建和优化分布式系统提供宝贵的理论基础。同时,源码阅读也有助于开发者调试问题,定制功能,甚至为Zookeeper贡献代码。

    zookeeper的maven形式的源码包。

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    zookeeper一站式学习资料

    Zookeeper是由Apache基金会开发的一个开源项目,它是一个分布式的、开放源码的分布式应用程序协调服务。Zookeeper提供了诸如命名服务、配置管理、集群同步、分组服务等一系列基础服务,是许多大型分布式系统背后的...

Global site tag (gtag.js) - Google Analytics