关于zookeeper的架构和两大机制问题

写在前面:个人整理,抛砖引玉,有不当之处望各位大佬及时指出修改,共同进步!

什么是zookeeper?

它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

架构

zookeeper是一个标准的分布式软件,主要是MS架构(master/salve主从架构)。其中包含一个主节点(Master)和多个从节点(Slave)。

主节点负责处理客户端的请求,并维护整个Zookeeper集群的状态。它负责协调和管理从节点的工作,包括分配任务、监控从节点的状态和处理故障恢复等。

从节点负责处理客户端的请求,并通过与主节点保持心跳来维持与主节点的连接。从节点通过复制主节点的数据来保持与主节点的数据一致性,并在主节点故障时接管主节点的职责。

关于为什么搭建zk集群通常选择奇数台2n+1

1.高可用性
    Zookeeper采用了主从复制的方式来保证高可用性。在一个Zookeeper集群中,只有大多数节点存活时,集群才能正常工作。如果选择偶数台服务器,当有一半节点故障时,无法达到大多数节点存活的要求,集群将无法正常工作。而选择奇数台服务器,可以容忍一台服务器的故障,仍然能够保证大多数节点存活,从而提高了集群的可用性。

2.投票机制
    在Zookeeper集群中,每个节点都有投票权。当有新的节点加入或者有节点故障时,集群会进行重新选举,选择一个新的Leader节点。在进行选举时,每个节点都会投票给自己认为合适的节点。如果选择偶数台服务器,可能会出现选票平局的情况,导致选举无法进行。而选择奇数台服务器,可以避免选票平局的情况,保证选举的正常进行。

3.均衡负载
    在Zookeeper集群中,每个节点都会承担一定的负载。如果选择偶数台服务器,可能会导致负载不均衡的情况出现。而选择奇数台服务器,可以更好地均衡负载,提高集群的性能和稳定性。

zookeeper的特性

即全局数据的一致性,主要体现在:
   1. zk集群中的每个角色所在的节点都保存一份完整的数据
   2. 客户端可以连接任意一个角色节点
   3. 所看到的数据都是一样的

zookeeper的选举机制(面试重点)

如何触发?

1.服务节点初始化启动

当节点初始起动时会在集群中寻找Leader节点,如果找到则与Leader建立连接,其自身状态变化follower或observer。如果没有找到Leader,当前节点状态将变化LOOKING,进入选举流程。

2.半数以上的节点无法和Leader建立连接

当节点初始起动时会在集群中寻找Leader节点,如果找到则与Leader建立连接,其自身状态变化follower或observer。如果没有找到Leader,当前节点状态将变化LOOKING,进入选举流程。

怎么选举?

如图所示:

简单讲就是少数服从多数。

第一轮投票全部投给自己

第二轮投票给myid比自己大的相邻节点,投票之前先判断自身的票数和其他节点的票数,如果得票超过半数,则选举结束,否则往下投票继续进行。

上面三台机器,选举一目了然。那么更多机器如何选择?方法异曲同工,如下:

首先第一台机器启动,把票投给自己,此时票数为1,没有超过半数,保持looking状态。

然后第二台机器启动,把票投给自己,此时第一台机器判断出第二台ID比自己大,把票投给第二台(即上文所说判断自己相邻节点ID,把票投给ID比自己大的机器),此时得票情况分别为0和2,但依然没有超过半数,二者继续保持looking状态。

再然后第三台机器启动,老规矩把票给自己,上述同理,1.2把票给了3,第三台得三票,此时已经超过了半数,第三台称为leader。

最后,leader已经产生,第四台 第五台少数服从多数,成为follower。

此外,还可能存在第二种情况,即leader挂掉不存在,则集群中恢复looking重新选举,依然遵从过半数少数服从多数原则。

附:节点状态
    LOOKING状态表示节点正在参与选举
    LEADING状态表示节点是当前的Leader
    FOLLOWING状态表示节点是一个Follower

zookeeper的监听机制

 ZooKeeper对节点的watch监听是永久的吗?

不是。

举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。

谁监听谁——zk客户端(用户)监听zk服务

监听什么

监听目录树的变化
    znode增加
    znode删除
    znode数据被修改
    znode子节点变化

监听步骤

        首先 客户端主动设置监听
        然后 zk服务执行监听
        最后 事件发生触发监听 通知给设置监听的客户端

监听特点

        先注册再触发

        一次性效果

        异步通知

        事件封装 event

端口及其作用

2888:Follower与Leader交换信息的端口。

3888:万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

下面用一张图简单概括:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值