ZooKeeper入门(二)ZooKeeper之Paxos及客户端使用

前言

       本章讲解ZK的安装以及使用

方法

1.概念

相信大家上一章节阅读下来会感觉到十分的吃力,那么本章将会使用通俗的说法进行讲解,帮助大家消化。

本章虽然是讲解ZK的安装,但实际上我们在学习MQ的时候就已经搭建过了,这里省略,我提供一个ZK的集群安装的传送门:https://blog.csdn.net/qq_21046965/article/details/88383895

经过了ZK集群创建,我们的103,104,105分别有一个ZK,我们可以将这三个ZK理解为现实生活中的三位政府议员(ZKServer)。

我们将上述的议员命名为103议员、104议员、105议员,它们拥有制定法律的权利。

2.ZK之Paxos算法

我们已经创建好了这三个议员,那么它们将行使制定法律的权利。

而每一个ZK客户端相当于市民,这里我们指定三个ZK客户端,市民A和市民B以及市民C,市民拥有向议员提出修改法案的权利(增删改ZK节点信息)。

我们每位议员都有一本法案提交记录册,其中记载了法案的编号(递增,默认为0)。

由于三位议员在同一个议会工作,那么决定法案的通过就需要三位议员投票决定。

有一天政府同时收到了三位市民提交的法案------

  1. 市民A主张政府应该增加10%的工作岗位
  2. 市民B主张政府应该增加20%的工作岗位
  3. 市民C主张政府应该增加30%的工作岗位

由于上述三位市民提交的是同一法案(都是增加工作岗位),所以法案编号就都定为1。

非常巧合的是,103议员收到了市民A的请求,发现我手册上的法案编号为0小于市民A提出的法案编号1,所以当即表示同意,并将自己的记录册更新编号为1。市民B和市民C向103议员发送请求时,由于法案没有大于其手册编号,所以被其怒斥后赶走

104议员收到了市民B的请求,发现我手册上的法案编号为0小于市民A提出的法案编号1,所以当即表示同意,和103议员一样,他没有同意A和C的提议。

105议员收到了市民C的请求,发现我手册上的法案编号为0小于市民A提出的法案编号1,所以当即表示同意,和103议员一样,他没有同意A和B的提议。

这个时候大家有没有发现一个问题,政府到底该认同哪项法案呢,完全的懵圈,政府陷入混乱!!!

政府经过慎重考虑,决定选举议长来解决这个问题!!!

议长的作用在于,它将手底下议员收到的提案进行收集,然后统一询问所有议员的意见,当半数以上的议员同意该提案,那么提案即告通过。


ZK选举议长步骤:

选举议长的前提条件:

  1. 初始化ZK
  2. 议长挂了

----------------------------------------------初始化ZK-------------------------------------------

ZK集群中有两个已经启动了,即开始选举议长。

首先103和104议员上班了。

每位议员的票面上印有(myid, ZXID),其中ZXID初始化默认为0,myid则是我们配置ZK集群时指定的数字。

第一阶段

每位议员都认为自己应该做议长,所以都先给自己投上了宝贵的一票!!

103议员认为我自己应该做议长,所以投票(1,0)给自己,然后将消息通知议会其他议员。

104议员认为我自己应该做议长,所以投票(2,0)给自己,然后将消息通知议会其他议员。

第二阶段

104议员收到了来自103议员的投票信息,于是他对比了一下自己的票面,首先看ZXID发现一样,再次看myid,发现自己的大。所以没有给103议员投票,再次向议会发送消息通知其他议员为自己投票。

103议员收到了来自104议员的投票信息,于是他对比了一下自己的票面,首先看ZXID发现一样,再次看myid,发现自己的小。于是他将票面更新为(2,0),第二次投票它投给了104议员。

系统经过统计后发现,104议员的得票数多于半数议员,所以104议员即成为了议长。议会其他议员自动沦为议员。

----------------------------------------------议长挂了-------------------------------------------

在该情况发生以前,103议长和104以及105议员各司其职,将政府管理的井井有条。

好景不长,一次意外导致103议长受了重伤,在医院中其无法行使议长的权利。政府面临再次混乱的风险!

为了防止政府出现混乱,议会104议员和105议员紧急磋商,决定进行二次选举,选出新的议长!

选举的过程和初始化的大致相同,只不过其票面的ZXID可能不会一样了,这时候将根绝ZXID进行投票选择新任议长。


假设我们已经选举出了议长103(leader),议长手下议员104议员(follow)和105议员(follow)

让我们来回顾一下前面的场景:

有一天政府同时收到了三位市民提交的法案------

  1. 市民A主张政府应该增加10%的工作岗位
  2. 市民B主张政府应该增加20%的工作岗位
  3. 市民C主张政府应该增加30%的工作岗位

市民A家里比较有钱,所以他通过某种手段联系上了新任的议长103,提出了他的请求,议长收到了它的提案没有立即同意,将自己的手册法案编号更改为1.

市民B市民C分别向104议员以及105议员发送请求,得到的答复却是要将该法案提交到议长那里,先由议长阅示!但是市民A已经捷足先登了。所以当议长103看到手下104和105议员提交上来的提案编号不大于1时,立刻拒绝了它们两个的提议!A和B的提议落空了,但是它们依然有再次提交它们提案的权利。

与此同时,议长宣布对市民A的法案提议进行表决,由于该法案的编号均大于104和105议员的手册编号,该法案获得通过!议长宣布法案正式通过,所以发消息给议员104和议员105(ZAB),议员104和议员105随即将法案落实,编号设置为1.

3.zk的客户端使用

我们启动一个ZK的客户端:

./zkCli.sh

通过ls /命令我们可以获得zk下的节点信息,zk的节点和linux的文件系统结构相类似。

1)创建节点

语法:create /节点名称  节点值

我们使用ls命令查看子节点信息:

 

 2)查看子节点信息

语法:ls /根节点名称

3)获取节点信息

 语法:get /节点名称

其中记载了该节点的详细信息。比如值123

4)设置节点值

语法:set /节点名称 节点值

5)删除指定节点(该节点存在子节点则无法删除)

 

6)递归删除节点(该节点存在子节点一并删除) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值