zookeeper源码分析:选举流程和请求处理
集群启动:
- QuorumPeerMain. runFromConfig()
- quorumPeer.start();
- loadDataBase();
- cnxnFactory.start(); //网络通信交互
- startLeaderElection();//启动选举类
- super.start();
- quorumPeer.run()
- case LOOKING:
- new ReadOnlyZooKeeperServer() //选举期间启用只读服务器,
- FastLeaderElection.start() //设置启动投票的后台线程
- setCurrentVote(makeLEStrategy().lookForLeader()); while循环
- case LEADING: new LeaderZooKeeperServer().lead();
- case LOOKING:
case LOOKING:快速选举
- FastLeaderElection.start()
- sendqueue = new LinkedBlockingQueue<ToSend>();//发出的投票队列
- recvqueue = new LinkedBlockingQueue<Notification>();//收到的投票对列
- this.messenger = new Messenger(manager);//投票消息后台服务线程
- new WorkerSender(manager); //开启投票的发送线程
- new WorkerReceiver(manager);//开启投票的接收线程
- FastLeaderElection.lookForLeader():
- sendNotifications
- 比较epoch
- totalOrderPredicate//对两个投票进行比较,规则是:选举期数 > zxid > serverid
- recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));/收集选票
- termPredicate//判断是否已经选出leader
- case LEADING: termPredicate
- ReadOnlyZooKeeperServer.startup()
- Zookeeper.startup
- createSessionTracker();//session管理类
- setupRequestProcessors();//子类重写的方法,设置request处理责任链
case LEADING:
请求处理
- NIOServerCnxnFactory.start()
- setupRequestProcessors
- PrepRequestProcessor
- ProposalRequestProcessor
- CommitProcessor
- ToBeAppliedRequestProcessor
- FinalRequestProcessor
- ProposalRequestProcessor.run()
- LearnerHandler.run();//leader初始化的时候,每accept一个connection,就会生成一个follower专门的LearnerHandler用于处理事务
- CommitProcessor.processRequest(request);// LinkedList queuedRequests,是已经发出的提议,要等待收到过半服务器ack的请求队列
- Leader.propose(request);//向所有的folllower发送提案
- Leader.processAck(this.sid, qp.getZxid(), sock.getLocalSocketAddress());
- p.ackSet.add(sid); //对于一个特定的提案,每个follower反馈的ACK信息
- if (self.getQuorumVerifier().containsQuorum(p.ackSet)){ //超过半数
toBeApplied.add(p);//用于 ToBeAppliedRequestProcessor处理
commit(zxid);//提交给集群中所有成员
zk.commitProcessor.commit(p.request);//提交给commitProcessor处理,LinkedList committedRequests,是已经收到过半服务器ack的请求队列,以为着该请求可以被提交了。
}
4. CommitProcessor.run();//匹配queuedRequests和committedRequests中的请求,并交给nextProcessor处理。
5. ToBeAppliedRequestProcessor.processRequest(request);//交给nextProcessor处理,如果toBeApplied中的第一个元素与request的zxid相等,则可以移除toBeApplied队首元素
zookeeper源码分析:选举流程和请求处理的更多相关文章
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- Zookeeper 源码分析-启动
Zookeeper 源码分析-启动 博客分类: Zookeeper 本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...
- apiserver源码分析——启动流程
前言 apiserver是k8s控制面的一个组件,在众多组件中唯一一个对接etcd,对外暴露http服务的形式为k8s中各种资源提供增删改查等服务.它是RESTful风格,每个资源的URI都会形如 / ...
- storm操作zookeeper源码分析-cluster.clj
storm操作zookeeper的主要函数都定义在命名空间backtype.storm.cluster中(即cluster.clj文件中).backtype.storm.cluster定义了两个重要p ...
- scheduler源码分析——调度流程
前言 当api-server处理完一个pod的创建请求后,此时可以通过kubectl把pod get出来,但是pod的状态是Pending.在这个Pod能运行在节点上之前,它还需要经过schedule ...
- zookeeper源码分析之leader选举
zookeeper提供顺序一致性.原子性.统一视图.可靠性保证服务zookeeper使用的是zab(atomic broadcast protocol)协议而非paxos协议zookeeper能处理并 ...
- zookeeper源码分析二FASTLEADER选举算法
如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是"electionAlg",其中1 ...
- struts2源码分析-初始化流程
这一篇文章主要是记录struts.xml的初始化,还原struts2.xml的初始化流程.源码依据struts2-2.3.16.3版本. struts2初始化入口,位于web.xml中: <fi ...
随机推荐
- 关于python3.8的一些新特性的解析与代码演示
python3.8测试版出来了,我们来介绍一些变动,代码演示一下,当然底层相关的细节变动就不介绍了 只允许传位置参数 还记得如果我们想让某些参数只能以关键字参数的方式传递该怎么做吗? def foo1 ...
- 运维学习篇之jenkins的安装(CentOS7)
一. 介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能二. 作用 1.持续的软件版本 ...
- springboot中使用filter
通过注解的方式实现filter过滤器. 创建Filter包,并在该包下创建MyFilter 示例代码: package com.bjpowernode.springboot.filter; impor ...
- zencart批量设置热卖商品 best seller、点击最高最受欢迎产品 most popular
zencart批量设置某分类下热卖商品数 best seller ; ,,,,,); zencart批量设置某产品点击最高最受欢迎产品 most popular ; ,,,,,);
- BZOJ4004 [JLOI2015]装备购买[贪心+线性基+高消]
一个物品可以被其他物品表出,说明另外的每个物品看成矩阵的一个行向量可以表出该物品代表的行向量. 于是构造矩阵,求最多选多少个物品,就是尽可能用已有的物品去表示,相当于去消去一些没必要物品, 类似于xo ...
- js - 执行上下文和作用域以及闭包
首先,咱们通常被"执行上下文","执行上下文环境","上下文环境","执行上下文栈"这些名词搞混.那我们一一来揭秘这些名 ...
- Linux系统上java调用C++ so库文件
PART1: java中使用jna替代jni调用c++/c生成的 dll/so库文件需要做的事项 1.引入JNA依赖或者直接下载JNAjar包 <!-- http ...
- eclipse - -解决复制的文件中文乱码问题
Window->Preferences->Web->JSP Files 面板选择 ISO 10646/Unicode(UTF-8)
- ICSharpCode.SharpZipLib.Zip 压缩文件
public class ZipFileHelper { List<string> urls = new List<string>(); void Director(strin ...
- Linux 系统中 grep 的ABC参数含义
1.grep -A 5 匹配行及后5行 2.grep -B 5 匹配行及前5行 3.grep -C 5 匹配行及前后各5行