副问题[/!--empirenews.page--]
在zk处事器集群启动进程中,经QuorumPeerMain中,不仅会建设ZooKeeperServer工具,同时会天生QuorumPeer工具,代表了ZooKeeper集群中的一台呆板。在整个呆板运行时代,认真维护该呆板的运行状态,同时会按照环境提倡Leader推举。下图是 《从PAXOS到ZOOKEEPER漫衍式同等性道理与实践》的处事器启动流程。
QuorumPeer是一个独立的线程,维护着zk呆板的状态。
- @Overridepublic synchronized void start() {
- loadDataBase();
- cnxnFactory.start();
- startLeaderElection(); super.start();
- }
本次首要先容的是推举相干的内容,至于其他操纵可以看其他博客。之后的行文都是从startLeaderElection中衍生出来的。
根基观念:
SID:处事器ID,用来标示ZooKeeper集群中的呆板,每台呆板不能一再,和myid的值一向
ZXID:事宜IDVote: 选票,详细的数据布局后头有
Quorum:过半呆板数
推举轮次:logicalclock,zk处事器Leader推举的轮次
处事器范例:
在zk中,引入了Leader、Follwer和Observer三种脚色。zk集群中的全部呆板通过一个Leader推举进程来选定一台被称为Leader的呆板,Leader处事器为客户端提供读和写处事。Follower和Observer都可以或许提供读处事,独一的区别在于,Observer呆板不参加Leader推举进程,也不参加写操纵的过半写乐成计策。因此,Observer存在的意义是:在不影响写机能的环境下晋升集群的读机能。
处事器状态:
+ LOOKING:Leader推举阶段+ FOLLOWING:Follower处事器和Leader保持同步状态+ LEADING:Leader处事器作为主历程率领状态。+ OBSERVING:调查者状态,表白当前处事器是Observer,不参加投票
推举的目标就是选择出吻合的Leader呆板,由Leader呆板抉择事宜性的Proposal处理赏罚进程,实现类两阶段提交协议(详细是ZAB协议)
QuorumPeer维护集群呆板状态
QuorumPeer的职责就是不绝地检测当前的zk呆板的状态,执行对应的逻辑,简朴来说,就是按照处事所处的差异状态执行差异的逻辑。删除了一部门逻辑后,代码如下:
- @Overridepublic void run() {
- setName("QuorumPeer" + "[myid=" + getId() + "]" +
- cnxnFactory.getLocalAddress());
- try {
- while (running) {
- switch (getPeerState()) {
- case LOOKING:
- LOG.info("LOOKING");
- try {
- setBCVote(null); setCurrentVote(makeLEStrategy().lookForLeader());
- }
- catch (Exception e) {
- LOG.warn("Unexpected exception", e); setPeerState(ServerState.LOOKING);
- }
- break;
- case OBSERVING:
- try {
- LOG.info("OBSERVING"); setObserver(makeObserver(logFactory)); observer.observeLeader();
- } catch (Exception e) { LOG.warn("Unexpected exception",e );
- } finally {
- observer.shutdown();
- setObserver(null);
- setPeerState(ServerState.LOOKING);
- }
- break;
- case FOLLOWING:
- try {
- LOG.info("FOLLOWING"); setFollower(makeFollower(logFactory)); follower.followLeader();
- } catch (Exception e) {
- LOG.warn("Unexpected exception",e);
- } finally {
- follower.shutdown();
- setFollower(null);
- setPeerState(ServerState.LOOKING);
- }
- break;
- case LEADING:
- LOG.info("LEADING");
- try {
- setLeader(makeLeader(logFactory));
- leader.lead();
- setLeader(null);
- } catch (Exception e) { LOG.warn("Unexpected exception",e);
- } finally {
- if (leader != null) {
- leader.shutdown("Forcing shutdown"); setLeader(null);
- }
- setPeerState(ServerState.LOOKING);
- }
- break;
- }
- }
- } finally {
- LOG.warn("QuorumPeer main thread exited");
- }
- }
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|