写在前面:个人整理,抛砖引玉,有不当之处望各位大佬及时指出修改,共同进步!
什么是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,而这个端口就是用来执行选举时服务器相互通信的端口。
下面用一张图简单概括: