前言
本章讲解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)。
由于三位议员在同一个议会工作,那么决定法案的通过就需要三位议员投票决定。
有一天政府同时收到了三位市民提交的法案------
- 市民A主张政府应该增加10%的工作岗位
- 市民B主张政府应该增加20%的工作岗位
- 市民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选举议长步骤:
选举议长的前提条件:
- 初始化ZK
- 议长挂了
----------------------------------------------初始化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)
让我们来回顾一下前面的场景:
有一天政府同时收到了三位市民提交的法案------
- 市民A主张政府应该增加10%的工作岗位
- 市民B主张政府应该增加20%的工作岗位
- 市民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)递归删除节点(该节点存在子节点一并删除)