Zookeeper笔记6-zk安装和集群搭建
本章会回顾一下ZAB协议,然后介绍一下集群搭建的配置文件。
前言
回顾一下ZAB
协议。Zab
协议包括两个核心:
第一,原子广播
客户端提交事务请求时Leader
节点为每一个请求生成一个事务Proposal
,将其发送给集群中所有的Follower
节点,收到过半Follower
的反馈后开始对事务进行提交。
这也导致了Leader
崩溃后可能会出现数据不一致的情况,ZAB使用了崩溃恢复来处理数字不一致问题;
消息广播使用了TCP协议进行通讯所有保证了接受和发送事务的顺序性。广播消息时Leader
节点为每个事务Proposal
分配一个全局递增的ZXID
(事务ID),每个事务Proposal
都按照ZXID
顺序来处理;
Leader
节点为每一个Follower
节点分配一个队列按事务ZXID
顺序放入到队列中,且根据队列的规则FIFO来进行事务的发送。
Follower
节点收到事务Proposal
后会将该事务以事务日志方式写入到本地磁盘中,成功后反馈Ack
消息给Leader
节点。
收到过半ACK
反馈之后,同时向所有的Follower
节点广播Commit
消息,Follower
节点收到Commit
后开始对事务进行提交;
第二,Master选举
里面用的算法叫做:Fast Leader Election
。
epoch
:选举轮数,即周期,就是之前说的逻辑时钟logicClock
Zxid
:Zxid
是一个 64 位的数字,其中低 32 位是一个简单的单调递增的计数器,针对客户端每一个事务请求,计数器加 1;而高 32 位则代表Leader
周期epoch
的编号,每个当选产生一个新的Leader
服务器,就会从这个Leader
服务器上取出其本地日志中最大事务的ZXID
,并从中读取epoch
值,然后加 1,以此作为新的epoch
,并将低 32 位从 0 开始计数。
成为leader的条件
- 选
epoch
最大的 epoch
相等,选zxid
最大的epoch
和zxid
都相等,选择server id
最大的(就是我们配置zoo.cfg
中的myid
)
选举的基本步骤
- 每个从节点都向其他节点发送选自身为
Leader
的Vote
投票请求,等待回复; - 从节点接受到的
Vote
如果比自身的大(ZXID更新)时则投票,并更新自身的Vote
,否则拒绝投票; - 每个从节点中维护着一个投票记录表,当某个节点收到过半的投票时,结束投票并把该从节点选为
Leader
,投票结束;
具体一点的步骤:
- 1、发起一轮投票选举,推举自己作为
leader
,通知所有的服务器,等待接收外部选票。 - 2、只要当前服务器状态为
LOOKING
,进入循环,不断地读取其它Server
发来的通知、进行比较、更新自己的投票、发送自己的投票、统计投票结果,直到leader
选出或出错退出。具体做法:- 2.1 如果发送过来的逻辑时钟大于目前的逻辑时钟,那么说明这是更新的一次选举投票,此时更新本机的逻辑时钟(
logicalclock
),清空投票箱(因为已经过期没有用了)调用totalOrderPredicate
函数判断对方的投票是否优于当前的投票(见下面代码),是的话用对方推荐的leader
更新下一次的投票,否则使用初始的投票(投自己),调用sendNotifications()
通知所有服务器我的选择,跳到2.4。 - 2.2 如果对方处于上轮投票,不予理睬,回到2。
- 2.3 如果对方也处于本轮投票,调用
totalOrderPredicate
函数判断对方的投票是否优于当前的投票,是的话更新当前的投票,否则使用初始的投票(投自己)并新生成notification
消息放入发送队列。调用sendNotifications()
通知所有服务器我的选择。 - 2.4 将收到的投票放入自己的投票箱中。
- 2.5 调用计票器的
containsQuorum
函数,判断所推荐的leader是否得到集群多数人的同意,如果得到多数人同意,那么还需等待一段时间,看是否有比当前更优的提议,如果没有,则认为投票结束。根据投票结果修改自己的状态。以上任何一条不满足,则继续循环。
- 2.1 如果发送过来的逻辑时钟大于目前的逻辑时钟,那么说明这是更新的一次选举投票,此时更新本机的逻辑时钟(
关于totalOrderPredicate
:
1 | protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) { |
总结起来就是一句话:若干个节点,第一次都是投给自己;后面就是,尽量向数据最新的节点靠拢,可以理解为:每个节点贫富有差距,富有的节点让贫穷的节点投自己一票,那么贫穷的节点会接受,反之不行,那么最先拿到超过一半的贫穷的节点的投票,就成为leader。(贫穷与富有都是相对的,越富有越可能成为leader)。
zk集群搭建
首先准备三份解压文件,每一份中都新建一个叫data
的文件夹:里面新建一个叫做myid的文件,第一个写1,后面递增。
每一份中配置文件改为zoo.cfg
。zk1对应的zoo.cfg:
1 | # The number of milliseconds of each tick 心跳检测时间 |
后面一次递增这个clientPort
和data
文件夹位置。
依次启动即可。