zookeeper安装

安装

1.下载安装包
2.解压 -zxvf apache-zookeeper-3.6.1-bin.tar.gz
3.cp zoo_sample.cfg zoo.cfg
4.sh zkServer.sh start 启动服务
5.sh zkCli.sh -server ip:port启动客户端

集群配置

  1. 切换到该目录下
  2. E:\develop\apache-zookeeper-3.6.1-bin\conf
  3. 修改zoo.cfg配置添加,2188随意
  4. server.1=192.168.0.101:2188:3181
  5. server.2=192.168.0.102:2188:3181
  6. server.3=192.168.0.103:2188:3181
  7. server.4=192.168.0.104:2188:3181
  8. ##################################################
  9. id的取值范围:1~255;用id来标识该机器在集群中的机器序号
  10. 2888follower节点与leader节点交换信息的端口号
  11. 3181是如果leader节点挂掉了,需要一个端口号来重新选举
  12. 创建myid
  13. 在每一个服务器的dataDir目录下创建一个myid的文件,文件就一行数据,数据的内容是每台机器对应的server ID的数据
  14. cd temp
  15. mkdir zookeeper
  16. ls
  17. cd zookeeper
  18. ls
  19. vim myid
  20. 文本内容:serverId

zookeeper 使用场景

发布订阅/配置中心

分布式锁

image.png

负载均衡

ID生成器

分布式队列

统一命名服务

Master选举

zookeeper几个原理分析

zookeeper 集群角色

leader

leader是zookeeper集群的核心。
1.事务请求(CURD)的唯一调度和处理者,保证集群事务处理的顺序性
2.集群内部各个服务器的调度者

follower

1.处理客户端非事务请求,以及转发事务请求给leader服务器
2.参与事务请求的提案(客户端的一个请求,需要半数以上服务器投票通过以后才能通知leader commit;
leader 发起一个提案,要求followere投票。)
3.参与leader 选举的投票

observer

1.观察zookeeper集群中最新状态并将这些状态同步到observer服务器上
2.增加observer不影响集群中事务处理能力,同时还能提升集群的非事务处理能力。

Zookeeper的集群组成

zookeeper一般是由 2n+1 台服务器组成


Leader选举

FastLeaderElection

serviceid:在配置server集群的时候,给定服务器的标识id(myid)
zid:服务器在运行的时候产生的数据ID,zxid的值越大,表示数据越新
Epoch:选举的轮数
server的状态:Looking、Following、Observering、Leading

第一次初始化启动的时候:Looking
1.使用集群中的server都会推荐自己为leader,然后把(myid,zxid,eooch)作为广播信息,广播给集群中的其他server,然后等待服务器返回。
2.每个服务器都会接收其他服务器的投票,集群中的每个服务器在接收到投票后,开始判断有效性
2.1判断逻辑时钟(sid),如果sid大于当前的sid,说明自己保存的sid是过期的,更新sid,同时clear其他服务器发送过来的选举数据。判断释放需要更新自己的选举情况。
2.2如果sid小于目前的sid,说明对方的sid过期了,也就意味着对方服务器的选举轮数是过期的。这个时候,只需要将自己的信息发送给对方
2.3如果sid等于目前的sid,根据规则来判断释放有资格获取leader.
接收到来自其他服务器的投票后,针对每一个投票,都需要将别人的投票和自己的投票进行比较,比较zxid最大的服务器优先。
3.统计投票
image.png

ZAB协议

拜占庭问题
paxos协议主要就是如果保证在分布式网络环境下,各个服务器如果达成一致最终保证数据一致性问题
ZAB协议,基于paxos协议的一个改进。
zab协议为分布式协调服务zookeeper专门设计的一种支持崩溃恢复原子广播协议
zookeeper并没有完全采用paxos算法,而是采用zab (Zookeeper atomic broadcast)协议。

zab协议的原理

1.在zookeeper的主备模式下,通过zab协议来保证集群中各个副本数据的一致性。
2.zookeeper使用的是单一的主进程来接收并处理所有的事务请求,并采用zab协议,把数据的状态变更以事务请求的形式广播到其他的节点
3.zab协议在主备模型架构中保证了同一时刻只能有一个主进程来广播服务器的状态变更。
4.所有的事务请求必须由全局的服务器来协调处理,这个的服务器叫leader、其他的服务器叫follower
leader节点主要负责把客户端的事务请求转化成一个事务提议(proposal),并分发给集群中的所有follower节点
再等待所有follower节点的反馈。一旦超过半数以上的服务器正确的反馈,那么leader就会commit这条消息。
奔溃恢复
原子广播
image.png

zab工作的原理

1.什么情况下zab协议会进入崩溃恢复
1.当服务器启动时
2.当leader 服务器出现网络中断、崩溃恢复或者重启的情况
3.集群中已经不存在过半的服务器与该leader保持正常通信
2.zab协议进入崩溃模式会做什么
1.当leader出现问题,zab协议进入崩溃恢复模式,并选举出新的leader,当新的leader选举出来以后,如果集群中已经过半机器完成了leader服务器的状态同步(数据同步),退出崩溃模式,进入消息广播模式
2.当新的机器加入到集群中的时候,如果已经存在leader服务器,那么新加入的服务器会自觉进入数据恢复模式,找到leader进行数据同步。

问题

假设一个事务在leader服务器被提交了,并且已经有过半的followeer返回了ack,在leader节点把commit消息发送给folower机器之前,leader服务器挂了怎么办
zab协议一定需要保证已经被leader提交的事务也能够被所有follower提交。
zab协议需要保证在崩溃恢复中跳过那些已经被丢弃的事务。