设为首页 收藏本站
查看: 988|回复: 1

[经验分享] zookeeper源码学习

[复制链接]

尚未签到

发表于 2017-4-19 07:23:34 | 显示全部楼层 |阅读模式
上周在同事的唆使下,我抽空把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,提醒其中断这次提案。

流程图如下:

DSC0000.jpg

2.Zookeeper介绍

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

处理流程图如下:

DSC0001.jpg


这里需要对几个角色做下解释:
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,并进入后续流程。

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-366072-1-1.html 上篇帖子: Zookeeper简介(二) 下篇帖子: ZooKeeper leader election
累计签到:3 天
连续签到:1 天
发表于 2017-4-19 07:31:17 | 显示全部楼层
加上源码分析不错哦

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表