大数据面试题之Zookeeper面试题

目录

1、介绍下Zookeeper是什么?

2、Zookeeper有什么作用?优缺点?有什么应用场景?

3、Zookeeper的选举策略,leader和follower的区别?

4、介绍下Zookeeper选举算法

5、Zookeeper的节点类型有哪些?分别作用是什么?

6、Zookeeper的节点数怎么设置比较好?

7、Zookeeper架构

8、Zookeeper的功能有哪些

9、Zookeeper的数据结构(树)?基于它实现的分布式锁?基于它实现的Master选举?基于它的集群管理? Zookeeper的注册(watch)机制使用场景?

10、介绍下Zookeeper消息的发布订阅功能

11、Zookeeper的分布式锁实现方式?

12、Zookeeper怎么保证一致性的

13、Zookeeper的zab协议(原子广播协议)?

14、ZAB是以什么算法为基础的?ZAB流程?

15、Zookeeper的通知机制

16、Zookeeper脑裂问题

17、Zookeeper的Paxos算法

18、Zookeeper的协议有哪些?

19、Zookeeper如何保证数据的一致性?

20、Zookeeper的数据存储在什么地方?

21、Zookeeper从三台扩容到七台怎么做?


1、介绍下Zookeeper是什么?

ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,它是Google的Chubby的一个开源实现,也
是Hadoop和HBase等分布式系统的重要组件。以下是关于ZooKeeper的详细介绍:

基本概念与定义:
ZooKeeper是一个为分布式应用提供一致性服务的软件,主要解决分布式系统中的一致性问题。
它封装了复杂易出错的关键服务,为用户提供简单易用的接口和性能高效、功能稳定的系统。

主要功能:
配置维护:ZooKeeper可以用来存储和管理分布式系统的配置信息,实现动态配置的更新和管理。

域名服务:提供命名服务,使客户端能够在分布式环境中找到特定的资源或服务。

分布式同步:通过提供分布式锁等机制,帮助多个进程或节点协调访问共享资源,避免竞争条件。

组服务:支持分布式系统中的组管理,如组成员的加入、离开等。

工作原理:
ZooKeeper基于Fast Paxos算法实现,通过选举产生一个leader(领导者),只有leader才能提交
proposer。

基本运转流程包括选举Leader、同步数据等步骤,确保集群中数据的一致性。
特性:
全局数据一致性:每个服务器都保存一份相同的数据副本,客户端无论连接到集群的任意节点上,看到的目录树都
是一致的。
可靠性:如果消息被其中一台服务器接收,那么将被所有的服务器接收。
顺序性:ZooKeeper保证全局有序和偏序,确保消息发布的顺序性。
数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态。
实时性:ZooKeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息或服务器失效的信息。

应用场景:
分布式协调:作为可靠的“协调者”,帮助分布式系统中的各个节点进行信息共享和同步,确保数据一致性。
领导者选举:支持领导者选举算法,用于在分布式系统中选举出一个节点作为“领导者”,确保系统的高可用性。
配置管理:用于存储和管理分布式系统的配置信息。
命名服务:提供命名服务,使客户端能够在分布式环境中找到特定的资源或服务。
分布式锁:提供分布式锁机制,帮助多个进程或节点协调访问共享资源。

接口与语言支持:
ZooKeeper包含一个简单的原语集,提供Java和C的接口。其中,分布锁和队列有Java和C两个版本,选举只有
Java版本。

综上:ZooKeeper是一个功能强大的分布式应用程序协调服务,通过提供一系列核心功能和特性,帮助开发人员
解决分布式系统中的一致性、可用性和并发控制等问题。

2、Zookeeper有什么作用?优缺点?有什么应用场景?

ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,它在分布式系统中发挥着至关重要的作用。
以下是关于ZooKeeper的详细介绍:

ZooKeeper的作用
提供一致性服务:ZooKeeper为分布式应用提供了一致性服务,确保在分布式系统中各个节点之间的数据保持一
致性。
管理元数据和状态信息:ZooKeeper存储和管理分布式系统中至关重要的元数据和状态信息,如配置参数、节点
状态、节点分组和负载平衡信息等。
协调分布式系统:ZooKeeper负责协调分布式系统中多个节点之间的通信和数据管理,确保它们保持一致和可
用。
保障可用性:ZooKeeper采用主从复制架构,在主节点故障的情况下,系统会自动选举一个新的主节点,保证服
务的持续可用性。
简化开发:ZooKeeper提供了一个简单的API,使开发人员能够轻松地编写分布式应用程序,而无需考虑底层的复
杂性。

ZooKeeper的优点
高可用性:ZooKeeper以集群方式部署,采用Leader-Follower模式,能够实现自动的Leader选举,保证服务
的高可用性。
一致性:ZooKeeper使用ZAB协议保证了数据的一致性,确保所有写操作都由Leader处理并通过复制机制传播给
Followers。
可靠性:ZooKeeper使用持久化日志来记录所有的写操作,即使Leader节点宕机,新的Leader也可以从日志中
恢复数据。
高性能:ZooKeeper使用内存数据库存储数据,快速地响应读操作,并通过Leader-Follower模式进行并行处
理,提高写操作的吞吐量。
分布式协调:ZooKeeper提供了丰富的原语,如锁、队列、通知等,支持复杂的分布式协调和通信操作。

ZooKeeper的缺点
单点故障:在ZooKeeper集群中,Leader是单点,如果Leader节点宕机,会导致整个集群的短暂不可用,尽管
选举会尽快选出新的Leader。
写入性能:由于所有的写操作都由Leader处理,并且需要进行复制,因此在高负载情况下,写入性能可能受到影
响。
数据限制:ZooKeeper的数据模型对于每个节点的数据有一定的大小限制,不适合存储大量的数据。

ZooKeeper的应用场景
配置管理:ZooKeeper可以用来管理分布式系统的配置信息,各个节点可以从ZooKeeper中获取配置信息,实现
配置的动态更新和管理。
命名服务:ZooKeeper可以用作命名服务,允许应用程序在ZooKeeper上创建、删除和查找节点,实现简单的命
名空间管理。
分布式锁:ZooKeeper提供了分布式锁的支持,允许多个节点在共享资源上进行协调,避免并发访问冲突。
分布式队列:ZooKeeper可以实现分布式队列,用于在多个节点之间传递消息和任务。
分布式选举:ZooKeeper的选举机制可以用来实现分布式系统中的Leader选举,确保在节点故障或变更时,集群
中能够重新选举新的Leader。
综上:ZooKeeper是一个功能强大的分布式协调服务,它在分布式系统中具有广泛的应用场景,并以其高可用性、
一致性、可靠性和高性能等优点赢得了广泛的认可。然而,ZooKeeper也存在一些缺点,如单点故障、写入性能
和数据限制等,需要在使用时加以注意。

3、Zookeeper的选举策略,leader和follower的区别?

Zookeeper的选举策略基于一种改进的Paxos算法,称为Fast Leader Election (FLE),旨在快速选出一个
Leader节点以管理整个Zookeeper集群。选举过程大致遵循以下步骤:

初始化:当Zookeeper集群启动时,每个节点(Server)都会进入LOOKING状态,表明它们正在寻找Leader。
选举发起:每个LOOKING状态的节点会发送一个选举请求(包含自身的服务器ID和最近接收的Zookeeper事务ID
(ZXID),用(myid, ZXID)表示),这个请求会被广播给集群中的所有其他节点。

投票:节点收到选举请求后,会对比收到的(myid, ZXID)与自己的(myid, ZXID),按照以下规则投票:

优先选择ZXID较大的节点(更高的ZXID意味着更先进的数据状态)。
如果ZXID相同,则选择服务器ID较大的节点(因为较大的ID理论上代表较新的服务器)。
节点会投给自己一票,并将投票信息广播出去。
多数原则:当一个节点收到超过半数节点的投票(包括自己的投票)时,它将成为Leader。其他节点收到新
Leader的通知后,会变为FOLLOWER状态,并与Leader建立连接,开始同步数据。
故障处理:如果选举过程中出现平票或Leader崩溃,集群会重新进入选举流程。
Leader和Follower的区别:

Leader:
负责管理整个集群,处理写请求,将更新操作转换成事务 Proposal 并广播给所有的Follower。
接收并协调Follower的反馈,只有当大多数Follower确认了一个Proposal,这个事务才会被提交。
负责维护集群状态的一致性,确保数据同步。
Follower:
处理来自客户端的读请求,如果遇到写请求则转发给Leader处理。
跟随Leader,参与事务的投票,以维护数据的一致性。
定期向Leader发送心跳,保持与Leader的连接,并且根据Leader的指令进行数据同步,以保证自身数据副本的
最新。
此外,Zookeeper集群中还有一种角色是Observer,它类似于Follower,但不参与选举过程和事务的投票,只
同步数据并服务于客户端的读请求,这有助于扩展系统的读能力而不影响写操作的性能和一致性。

4、介绍下Zookeeper选举算法

Zookeeper的选举算法是基于其原子消息广播协议ZooKeeper Atomic Broadcast (ZAB) 设计的,旨在快速
且可靠地选举出一个Leader节点,以确保分布式系统中数据的一致性和高可用性。选举算法的核心目的是在集群
启动时或Leader节点故障后,高效地确定一个新的Leader,同时确保大多数节点达成共识。以下是选举算法的基
本步骤和原理:

选举过程概览

初始化阶段:
所有节点初始状态为LOOKING,即都在寻找Leader状态。
每个节点启动时,会初始化自己的选举轮次(logicalclock),并为自己投票(Vote),投票内容包括服务器ID
(myid)和最近接收到的事务ID(ZXID)。

发现和投票阶段:
每个节点广播自己的投票到其他所有节点。
收到投票的节点会比较收到的投票与自己的投票,基于ZXID的新旧(优先级更高)以及myid的大小来决定是否更
改自己的投票。ZXID较新或在ZXID相同时myid较大的节点更优。
如果更改投票,节点会再次广播新的投票信息。

多数原则决策:
当一个节点收到超过半数节点相同的选择(包括自己的投票),则认为选举成功,该节点成为Leader。
其他节点收到新Leader的通知后,会变为FOLLOWER或OBSERVER状态,与Leader建立连接。

同步和广播阶段:
Leader负责将自身的数据同步给Follower,确保集群间数据的一致性。
一旦数据同步完成,Zookeeper集群即可对外提供服务,处理客户端的读写请求。

关键概念
ZXID:是一个64位的数字,高32位代表纪元(epoch),低32位代表事务ID。它用于确保事务的顺序性,ZXID越
大表示事务越新。
myid:每个Zookeeper节点配置文件中设定的一个唯一ID,用于在选举时进行服务器的优先级排序。
logicalclock:每个节点的选举轮次计数器,每进入一轮选举,此值递增,用于防止旧的选举消息干扰新的选
举。

特点
快速收敛:Zookeeper选举算法设计为快速收敛,确保在最短的时间内选出Leader,减少服务中断时间。
容错性:基于多数原则,确保即使部分节点故障,系统仍能选出有效的Leader。
一致性保证:通过确保Leader具有最新的数据视图,维持整个集群的数据一致性。

综上,Zookeeper的选举算法是一个复杂而精巧的机制,确保了在分布式环境中能够高效、可靠地选出Leader节
点,是Zookeeper实现高可用和数据一致性的基石。

5、Zookeeper的节点类型有哪些?分别作用是什么?

Zookeeper的节点类型主要分为两大类:一是节点角色(在集群中的角色),二是数据节点类型(根据生命周期和
特性分类)。下面是具体介绍:

节点角色类型:
领导者(Leader):
负责处理所有的写操作请求,维护集群的状态,以及协调和管理Follower和Observer节点。
领导者节点负责将更新操作转换为事务Proposal,并广播给集群中的Follower节点。

跟随者(Follower):
处理客户端的读请求,参与选举过程,并从Leader节点接收更新进行数据同步。
它们会响应Leader的提议,参与投票,以确保数据一致性和事务的原子性。

观察者(Observer):
观察者与Follower类似,但不参与选举过程及事务的投票过程。
它们只接收Leader的更新,提高集群的读取能力,而不会影响写操作的性能和一致性决策。

数据节点类型:

持久节点(Persistent):
一旦创建,除非被显式删除,否则一直存在。即使创建该节点的客户端会话结束,节点及其数据依然保留。
适用于存储那些需要长期存在的配置信息或状态信息。

临时节点(Ephemeral):
绑定到客户端会话,当会话结束(客户端断开连接或崩溃),这些节点会被自动删除。
适合实现分布式锁、服务注册与发现等场景,代表短暂存在的状态或资源。

持久顺序节点(Persistent Sequential):
结合了持久节点和顺序特性,创建时会在节点名后自动追加一个由父节点维护的单调递增序列号。
适用于实现分布式锁、队列等,顺序号可以帮助确定节点创建的先后顺序。

临时顺序节点(Ephemeral Sequential):
同时具备临时节点和顺序节点的特点,会话结束后节点消失,创建时也带有序列号。
在分布式系统中用于确保操作的唯一性和顺序,如实现公平锁、负载均衡选择等。

容器节点(Container,3.5版本后引入):
类似于持久节点,但是ZooKeeper服务端会监视此类节点的子节点数量,若子节点数为0,则自动删除容器节点。
适用于需要自动清理的场景,如动态服务发现和管理中的临时服务组。

持久TTL节点(Persistent TTL,需特殊配置开启):
带有生存时间(Time-To-Live)的持久节点,如果节点在一段时间内没有更新或没有子节点,将自动删除。
提供了自动清理过期数据的能力,适合存储周期性更新或有时效性的数据。

这些节点类型的设计满足了分布式系统中多样化的协调需求,如状态管理、配置同步、锁机制、队列服务等。

6、Zookeeper的节点数怎么设置比较好?

Zookeeper集群的节点数量设置应该基于对容错性、性能和资源消耗的综合考量。以下是一些推荐的设置原则:

最小节点数:Zookeeper推荐的最小节点数量是3。这是因为奇数个节点可以在出现网络分区(脑裂)的情况下,
确保至少有一半以上的节点(即多数节点)能够达成共识,选举出Leader,从而避免服务不可用。

常见配置:对于小型至中型集群,常见的配置是3个或5个节点。3个节点是最基本的配置,可以提供基本的容错能
力,但如果有任何一台节点故障,剩余节点刚好满足多数原则,这时再失去任何一个节点都会导致集群不可用。而
5个节点的配置提供了更高的容错性,允许两台节点故障而不影响集群的正常运行。

大型集群:对于需要更高可用性和性能的大规模部署,可以配置7个或更多节点。更多的节点可以进一步分散负
载,提高系统的整体吞吐量,并增强容错能力。

奇数原则:无论是小型还是大型集群,推荐使用奇数个节点,以确保在进行选举时,能够明确区分出多数和少数,
避免选票分裂的情况,保持集群的决策效率。

资源与成本:虽然增加节点可以提升系统的稳定性和性能,但也意味着更高的硬件成本、运维复杂度以及网络通信
的开销。因此,选择节点数量时也需要考虑实际的业务需求、预算和运维能力。

综上所述,Zookeeper集群的节点数应当基于业务的具体需求和资源条件来决定,但至少需要3个节点来保证基本
的可用性和数据一致性。对于大多数场景,5个节点是一个较为平衡的选择,既提供了足够的容错性,又不至于过
度消耗资源。在设计大规模或有特定容错需求的系统时,可以考虑配置更多的节点。

7、Zookeeper架构

Zookeeper的架构设计旨在提供一个高度可靠的分布式协调服务,确保分布式环境下的数据一致性。其核心组件
和设计原则如下:

核心组件

客户端(Zookeeper Client):
应用程序通过Zookeeper客户端与Zookeeper集群进行交互,执行数据读写操作,注册监听事件等。
客户端可以连接到集群中的任意一个服务器,并自动处理连接失败和重连问题。

服务器(Zookeeper Server):
Zookeeper集群通常由多个服务器节点组成,分为Leader、Follower和Observer三种角色。
Leader: 单个节点,负责处理写请求,管理集群成员关系,以及数据同步。
Follower: 跟随Leader,处理读请求,并参与Leader选举过程。
Observer: 类似于Follower,但不参与选举过程和写操作的投票,仅用于扩展读取能力。

集群模式
Quorum(法定人数)模式:这是生产环境中常用的模式,要求集群中有超过一半的节点正常工作,才能确保服务
的可用性。集群大小通常为奇数,以简化决策过程。
Standalone模式:单机部署,仅供测试或开发环境使用,不具备高可用性。

数据模型
Znode:Zookeeper的数据模型基于一个类似文件系统的树形结构,每个节点(称为Znode)都可以存储数据,
并且可以有子节点。Znodes可以是持久的或者临时的,还可以是顺序的。

选举机制
Leader Election:利用Fast Leader Election (FLE) 算法进行Leader选举,确保在集群启动或
Leader故障时快速选出新的Leader。选举过程基于服务器ID和事务ID(ZXID),确保选出拥有最新数据视图的节
点作为Leader。

同步与复制

ZAB协议(Zookeeper Atomic Broadcast):确保数据更新操作能原子性地广播到所有Follower,保证了数据的一致性。

数据复制:Leader负责将更新操作同步给Follower,确保集群中的数据副本一致。

监听与通知
Watch机制:客户端可以对Znode设置监听,当Znode发生变化时,Zookeeper会触发一个事件,通知客户端,
实现了事件驱动的编程模型。
容错与可靠性
奇数节点部署:为了确保高可用,Zookeeper集群通常部署为奇数个节点,这样即使有节点故障,也能维持多数
节点的正常运行。
会话管理:每个客户端与Zookeeper之间建立会话,通过心跳机制维护连接,如果客户端长时间未发送心跳,其
会话会被标记为已过期。

综上,Zookeeper的架构设计围绕着提供一个简单、强大、一致性的分布式协调服务,通过其独特的数据模型、
选举机制、数据复制策略和监听通知系统,支撑了大量分布式系统的关键服务。

8、Zookeeper的功能有哪些

ZooKeeper作为一个分布式协调服务,提供了多种关键功能,支撑着分布式系统中的众多应用场景。以下是
ZooKeeper的主要功能:

配置管理:允许分布式系统中的所有节点从ZooKeeper集中获取和更新配置信息,确保所有节点的配置一致性。
当配置发生变化时,相关节点可以实时得到通知并作出相应的调整。

命名服务:提供类似目录服务的命名空间,使得分布式系统中的应用能够通过一个路径式的名称来定位和访问资
源、服务或其他实体,便于管理和发现。

分布式锁与同步:ZooKeeper提供了一套分布式锁机制,使得多个分布式进程能够以互斥或同步的方式访问共享
资源,避免并发冲突。

组服务:支持组成员管理和组内通信,包括组成员的加入、离开、选举Leader等操作,适用于构建分布式系统中
的主备切换、任务分配等场景。

分布式队列:实现先进先出(FIFO)或特定逻辑的队列,帮助实现任务的有序处理或消息的传递。

选举与领导选举:通过ZAB协议实现快速且可靠地选举出一个Leader节点,确保在任何时候都有一个主控节点来
处理写操作和协调集群行为。

数据发布/订阅(配置中心):允许发布者将数据发布到ZooKeeper上,订阅者可以实时获取和订阅这些数据,实
现配置的集中管理和动态更新。

负载均衡:虽然ZooKeeper本身不直接提供负载均衡服务,但它可以与其他组件结合,通过服务发现机制间接支
持负载均衡,例如配合服务发现工具将服务实例注册到ZooKeeper,客户端从ZooKeeper获取服务列表进行负载
均衡。

分布式通知与协调:借助ZooKeeper的Watcher机制,客户端可以注册监听节点变化的事件,当节点数据或状态
发生变化时,ZooKeeper会实时通知客户端,实现分布式系统间的事件驱动协同。

高可用性保障:通过复制数据到多个ZooKeeper服务器,确保即使部分服务器失效,服务依然可用。

这些功能使得ZooKeeper成为构建分布式系统不可或缺的组件,广泛应用于配置管理、服务发现、分布式锁、主
备切换、负载均衡等多种场景。

9、Zookeeper的数据结构(树)?基于它实现的分布式锁?基于它实现的Master选举?基于它的集群管理? Zookeeper的注册(watch)机制使用场景?

Zookeeper的数据结构(树)
Zookeeper的数据结构是一个层次化的节点树,类似于文件系统的目录结构。这个树形结构的每个节点被称为
Znode。每个Znode可以存储少量数据(默认不超过1MB),并且可以拥有子节点,形成一个树状层级。Znodes可
以是持久节点(Persisten)、临时节点(Ephemeral)或带有顺序标识的节点(Sequential)。这种结构不仅
支持数据存储,还通过节点路径和属性实现丰富的元数据管理。

基于Zookeeper实现的分布式锁
分布式锁利用Zookeeper的临时顺序节点和Watcher机制。实现步骤如下:

锁创建:客户端在特定的锁目录下创建一个临时顺序节点。
锁判断:客户端检查自己创建的节点是否为该目录下的最小序号节点,如果是,则获得锁;如果不是,找到比自己
小的最近节点并对其设置Watcher
锁等待:当Watcher触发,表明前一个节点已被删除(即持有锁的客户端已完成操作),当前客户端再次尝试获取
锁。
锁释放:客户端完成操作后,删除自己创建的临时节点,从而释放锁。
基于Zookeeper实现的Master选举
Master选举通过创建临时节点实现:

选举过程:所有候选节点尝试在特定选举路径下创建临时节点,第一个成功的节点成为Master。
监控变更:非Master节点监控Master节点的Znode,一旦Master节点因故障下线(其临时节点自动删除),剩
余节点中的一个将重新创建临时节点并成为新的Master。
平滑过渡:通过Watcher机制,所有节点能立即感知到Master状态的变化,确保服务的连续性。
基于Zookeeper的集群管理
Zookeeper用于集群管理主要体现在以下几个方面:

配置同步:集中存储集群配置,各节点可从Zookeeper获取并实时更新配置。
健康监测:通过心跳检测和Watcher机制监控集群节点状态,及时发现异常。
服务发现:服务提供者在Zookeeper注册服务,消费者动态发现服务地址,实现服务的动态扩展和负载均衡。
主备切换:利用选举机制,自动进行主备节点切换,确保服务高可用。
Zookeeper的注册(Watch)机制使用场景
Zookeeper的Watch机制允许客户端注册监听某个Znode的变化(数据更新、子节点变化或节点删除),一旦发生
变化,Zookeeper会异步通知客户端。这一机制广泛应用于:

实时数据更新:客户端监听配置节点,实现配置的实时推送。
事件驱动编程:基于节点变化触发的业务流程,如状态变更后的自动处理。
通知与协调:在分布式系统中,用于通知其他节点进行状态同步或行动。
故障恢复:监控关键节点,实现快速故障检测和恢复逻辑。

总之,Zookeeper的数据结构、分布式锁、Master选举、集群管理以及Watch机制共同构成了一个强大的分布式
协调框架,广泛应用于现代分布式系统的设计与实现中。

10、介绍下Zookeeper消息的发布订阅功能

ZooKeeper 提供了一种高效的消息发布与订阅功能,常用于分布式系统中的配置管理、状态同步和通知服务。这
一功能基于其核心的Watcher机制和节点数据变更通知特性来实现。以下是关于Zookeeper发布订阅功能的详细
介绍:

核心概念

数据节点(ZNode):ZooKeeper的数据模型是一个树形结构,每个节点(ZNode)可以存储数据,客户端可以通
过路径访问这些节点。

Watcher机制:ZooKeeper的Watcher是一种轻量级的一次性触发器,客户端可以在读取数据或检查节点是否存
在时设置Watcher。当被监视的ZNode发生变更(数据更新、子节点增删、节点删除)时,ZooKeeper会异步通
知相关的客户端。

发布订阅流程

数据发布:发布者(可以是任何客户端或服务)将数据写入或更新到ZooKeeper的一个或多个指定的ZNode上。
这一步骤相当于将消息“发布”到ZooKeeper。

数据订阅:订阅者(客户端)通过向ZooKeeper注册Watcher来“订阅”感兴趣的ZNode。这意味着订阅者告诉
ZooKeeper,当这些ZNode的状态发生变化时,希望得到通知。

通知触发:一旦发布者更新了ZNode,ZooKeeper会根据先前注册的Watcher,向所有订阅了该节点变化的客户
端发送事件通知。这一步骤是“推送”模式的体现,尽管ZooKeeper的推送实际上是客户端通过Watcher触发的拉
取。

数据拉取:接收到通知的客户端通过Watcher回调函数得知变化,然后需要主动向ZooKeeper发起请求以获取最
新的数据内容。这里体现了“拉取”模式,因为最终的数据获取是由客户端发起的。

使用场景

配置管理:应用程序可以订阅配置ZNode,当配置发生变化时,所有订阅者都能即时更新配置,无需重启服务。

服务发现:服务提供者将自身信息写入ZooKeeper,服务消费者订阅相应节点,自动发现可用服务实例。

分布式锁与同步:通过监控锁节点的变化,实现分布式锁的获取与释放,以及任务的协调同步。

集群管理:管理集群成员信息,当集群状态变化时,及时通知所有成员,便于进行主备切换、负载均衡等操作。


特点总结
实时性:Watcher机制保证了数据变化的实时通知。
灵活性:客户端可以根据需要订阅任意节点,实现灵活的消息订阅模式。
轻量级:Watcher是一次性的,每次通知后需重新注册,减少系统负担。
可靠性:结合ZooKeeper的高可用特性,确保了消息通知的可靠性。
综上,ZooKeeper的消息发布与订阅功能,通过其独特的Watcher机制,为分布式系统提供了高效、灵活的事件
通知服务,是构建复杂分布式应用的重要基础。

11、Zookeeper的分布式锁实现方式?

Zookeeper 实现分布式锁的常见方式是利用临时有序节点(Ephemeral Sequential Node)和Watcher事件
监听机制。下面是分布式锁实现的具体步骤:

实现步骤:

创建临时有序节点:

当客户端想要获取锁时,会在Zookeeper预先定义的一个锁节点(通常是一个父节点,如/locks/)下创建一个
临时的有序节点。由于是有序节点,Zookeeper会自动为每个节点添加一个唯一的序号,这样就可以根据节点序
号来确定锁的顺序。

判断是否获得锁:
客户端读取/locks/下的所有子节点,并对它们进行排序。如果客户端创建的节点序号是最小的,那么就认为它获
得了锁。

等待锁:
如果客户端发现自己创建的节点不是最小的,它就需要等待。这时,客户端会对它前一个节点(即序号比它小的那
个节点)设置一个Watcher监听。这样,当这个前驱节点被删除(意味着锁被释放)时,Zookeeper会触发
Watcher通知,客户端收到通知后会再次尝试获取锁。

获取锁成功:
当客户端收到Watcher通知,说明前一个节点已经被删除,此时客户端再次检查自己是否成为了最小的节点。如果
是,则认为获取锁成功,可以执行临界区代码。

释放锁:
当客户端完成操作后,需要释放锁。这很简单,只需删除之前创建的临时节点即可。由于是临时节点,当客户端与
Zookeeper的会话断开时(例如客户端崩溃),Zookeeper也会自动删除该节点,从而实现锁的自动释放。

综上:Zookeeper确保了分布式锁的互斥性和可靠性,有效解决了分布式系统中多线程或多进程间资源竞争的问
题。

12、Zookeeper怎么保证一致性的

ZooKeeper保证数据一致性的核心在于其使用的ZAB(Zookeeper Atomic Broadcast,Zookeeper原子广
播)协议。以下是ZAB协议确保一致性的关键步骤和机制:

Leader选举:
当ZooKeeper集群启动或领导者(Leader)失效时,所有服务器进入选举状态,使用如FastLeaderElection
等算法选出一个新的Leader。选举过程中考虑服务器的ID和最近的事务ID(ZXID),确保选出具有最新数据视图
的服务器作为Leader。

崩溃恢复模式:
一旦Leader被选举出来,集群进入崩溃恢复模式。Leader需要确保所有Follower节点的数据与自己一致。
Leader会发送自己的最后一条事务的ZXID给Follower,Follower根据这个ZXID进行数据同步,如果发现自己
的数据不一致或落后,会从Leader或其他拥有最新数据的Follower那里同步数据。

消息广播模式:
数据同步完成后,集群转为消息广播模式。所有客户端的写请求都必须通过Leader处理。Leader接收到写请求
后,会生成一个事务Proposal(提议),并为该Proposal分配一个唯一的ZXID,然后将其广播给所有
Follower。Follower接收到Proposal后,会将其以事务日志的形式写入本地磁盘,并向Leader发送ACK确
认。

事务提交:
Leader收到半数以上Follower的ACK后,会向所有Follower发送Commit消息,指示它们可以提交该事务到内
存数据库中,这样事务就完成了提交。这样确保了同一事务在所有服务器上按照相同的顺序提交,保持数据一致
性。

顺序保证:
ZooKeeper确保所有事务请求按照其接收的顺序被处理,这一特性通过其原子广播协议和Leader的顺序分配
ZXID来实现。每个事务都有一个唯一的ZXID,它是全局递增的,确保了任何时刻,所有服务器上的事务序列都是
相同的。

会话与 watches:
ZooKeeper还通过维护客户端会话和watcher机制来提供一定程度的一致性视图。会话帮助跟踪客户端的状态,
而watches允许客户端注册对特定数据节点变化的监听,当数据发生变化时,相关客户端会收到通知,从而能够及
时更新其本地缓存或状态。

综上:通过ZAB协议的严格流程和Leader选举、数据同步、消息广播等机制,ZooKeeper确保了在分布式环境中
数据的一致性和高可用性。

13、Zookeeper的zab协议(原子广播协议)?

ZooKeeper Atomic Broadcast (ZAB) 协议是专为ZooKeeper设计的一种支持崩溃恢复的原子广播协议。它
是ZooKeeper实现分布式数据一致性与高可用性的核心算法。ZAB协议确保在部分服务器失败的情况下,仍然能够
保证客户端观察到的数据一致性。ZAB协议有两个主要阶段:崩溃恢复(Crash Recovery)和消息广播
(Message Broadcasting)。

崩溃恢复(Crash Recovery)

选举Leader:在ZooKeeper集群启动或Leader节点崩溃时,所有节点进入选举状态,通过一系列投票过程选出
一个新的Leader。选举过程中考虑了节点的ID和最近的事务提议ID,确保选出的Leader拥有最新的数据视图。

数据同步:新Leader负责将自身的数据状态同步给其它Follower节点,确保所有Follower节点数据与Leader
保持一致。这个过程可能包括事务日志的传输和快照的分发,以完成数据同步。

确认Leader:一旦所有Follower节点与Leader完成了数据同步,崩溃恢复阶段结束,进入消息广播阶段。

消息广播(Message Broadcasting)

原子广播:在消息广播阶段,客户端的所有写操作请求都会被转发给Leader。Leader将这些请求转换成事务提案
(Proposal),并使用ZAB协议的原子广播机制将提案广播给所有的Follower。

事务提交:Leader等待超过半数的Follower确认接收提案(即Quorum确认),然后才提交事务,这个过程保证
了事务的原子性和持久性。一旦事务被提交,Leader会向所有Follower发送Commit消息,Follower接收到
Commit消息后会提交事务到本地存储。

客户端响应:Leader在事务被大多数Follower确认后,才会通知客户端操作成功,确保了客户端看到的是已提
交的事务结果。

关键特性

崩溃恢复优先:ZAB协议设计上优先保证集群可以从崩溃状态恢复,之后再处理客户端的读写请求。

强一致性:通过确保所有更新操作被按顺序应用,ZAB协议保证了所有客户端看到的数据视图是一致的。

主备模型:ZAB协议促使ZooKeeper采用主备架构,Leader负责处理写请求并广播更新,Follower则负责服务
读请求和参与协议的投票过程。

ZAB协议借鉴了Paxos算法的思想,但针对ZooKeeper的需求进行了特定优化,尤其是在处理崩溃恢复的场景上,
更强调快速恢复和数据一致性。

14、ZAB是以什么算法为基础的?ZAB流程?

ZAB(ZooKeeper Atomic Broadcast)算法是基于Paxos思想来实现的一种保证分布式架构中数据一致性的
算法。ZAB协议主要包含了原子广播协议和崩溃恢复协议两部分。以下是ZAB协议的主要流程和特点:

ZAB算法基础
Paxos思想:ZAB算法的设计借鉴了Paxos的分布式一致性算法思想,确保在分布式系统中各个节点之间数据的一
致性。

ZAB流程

1. 原子广播协议
原子性:保证操作要么全部完成,要么全部不完成,不存在中间状态。
广播机制:在分布式多节点中,不是所有节点都会接收到广播,但会过半通过。
处理流程:

客户端发送请求给Follower。
Follower将请求转发给Leader。
Leader将请求转化为事务提议,并为其分配一个事务序列号(ZXID)。
Leader将提议广播给所有的Follower,并放入对应Follower的FIFO队列中。
Follower执行提议并反馈结果给Leader。
如果集群中有过半的Follower正确反馈,Leader将广播commit消息,提交提议。

2. 崩溃恢复协议

Leader选举:在Leader节点崩溃后,从Follower节点中通过一定的选举机制(如Quorum选举)选出一个新的
Leader。
数据同步:新Leader确保自己拥有最新数据后,将最新数据同步给其他Follower节点,以保持集群数据的一致
性。

3. ZAB算法的四个阶段

Election(选举):选举出一个预主节点(预Leader)。
Discovery(发现):预主节点将自己的epoch同步给所有Follower,并同步最新的数据。
Synchronization(同步):完成数据同步操作,确保集群数据的一致性。
Boardcast(广播):预主节点成为真正的Leader后,开始接受客户端请求,并将请求广播给Follower节点。

总结
ZAB协议通过原子广播和崩溃恢复两个主要部分,以及上述的详细流程,确保了ZooKeeper分布式系统中数据的一
致性和可用性。

15、Zookeeper的通知机制

Zookeeper的通知机制是基于一种观察者模式(Watcher机制)实现的,它允许客户端注册监听特定事件并在这
些事件发生时接收通知。以下是Zookeeper通知机制的关键特点和工作流程:

关键特点:
一次性触发:Zookeeper中的Watcher是一次性触发器,即一旦触发并通知客户端后,该Watcher就会被自动删
除。如果客户端需要持续监听某个事件,必须在收到通知后重新注册Watcher。
轻量级:Watcher通知非常轻量,仅包含少量信息,如事件类型、状态和相关路径,实际数据并不随通知发送。客
户端在接收到通知后,通常需要发起另一个请求来获取具体的数据变化。
异步回调:通知机制是异步的,这意味着客户端注册Watcher后不会阻塞,而是在事件触发时通过回调函数通知客
户端。

工作流程:
客户端注册Watcher:当客户端调用如getData(), getChildren()或exists()等API时,可以同时传递一个
Watcher对象。这个操作实质上是在Zookeeper服务器端为指定的ZNode注册了一个监听。

服务端处理Watcher:Zookeeper服务器会保存这些Watcher,并在相应的ZNode发生更改(数据更新、子节点
增删、节点删除等)时处理这些Watcher。

客户端回调触发:一旦触发了Watcher,Zookeeper服务器会向客户端发送一个事件通知包。客户端接收到通知
后,会执行之前注册的Watcher所关联的回调函数,进而客户端可以根据通知内容作出相应的处理。

客户端重新注册Watcher:由于Watcher是一次性的,因此客户端在收到事件通知并处理完逻辑后,如果需要继
续监控相同事件,需要重新注册Watcher。

使用场景:
数据变更通知:监控特定ZNode的数据变化,以便及时更新本地缓存或触发业务逻辑。
节点存在性监控:检查某个节点是否存在,用于资源存在性校验或初始化检查。
子节点变更:监控目录节点的子节点列表变化,适用于服务发现、配置更新等场景。
主选举与状态同步:在分布式系统中,用于监控领导者节点变化或进行状态同步。

Zookeeper的通知机制为分布式系统提供了强大的事件驱动能力,使得系统各组件能高效地响应状态变化,从而
实现了灵活的协调和管理功能。

16、Zookeeper脑裂问题

Zookeeper中的脑裂问题是指在一个Zookeeper集群中,由于某种原因(如网络故障、配置错误等),导致多个
节点同时认为自己是leader(领导者),而其他节点则认为自己是follower(跟随者),从而导致整个集群无法
正常工作的情况。

可能导致Zookeeper脑裂问题的原因:

网络故障:Zookeeper集群中的节点需要通过网络进行通信。如果网络出现故障或通信链路出现问题,导致节点
之间的通信中断,就可能出现脑裂问题。

节点故障:集群中的节点可能由于硬件故障、网络故障或软件错误等原因而出现故障。当一个节点失效时,
Zookeeper集群可能会将其视为一个不同的节点,从而导致脑裂问题的出现。

配置错误:Zookeeper集群的配置可能存在错误,例如节点数量不正确、网络配置不正确或配置文件中的错误参
数值等。这些配置错误可能导致Zookeeper集群无法正常工作,从而引发脑裂问题。

分布式系统问题:在分布式系统中,由于网络延迟、数据同步等问题,可能导致Zookeeper集群中的一些节点无
法正确地接收其他节点的更新。这可能导致Zookeeper集群中的一些节点认为其他节点已经失效或不存在,从而
导致脑裂问题的出现。

Zookeeper脑裂问题的解决方案:

使用可靠的分布式网络:确保Zookeeper集群之间的网络连接稳定、可靠,减少网络故障的发生。

使用可靠的节点故障检测机制:及时发现并处理故障节点,避免因为节点故障导致脑裂问题。

配置检查和调整:对Zookeeper集群的配置进行检查和调整,确保集群的配置正确和一致性。

Quorums(法定人数)方式:通过设定Quorums(如3个节点的集群,Quorums=2),确保集群中超过半数节点投
票才能选举出Leader。这种方式可以确保leader的唯一性,避免脑裂问题的出现。

Redundant communications(冗余通信)方式:在集群中采用多种通信方式,防止一种通信方式失效导致集
群中的节点无法通信。

Fencing(共享资源)方式:使用共享资源来确保只有一个节点能够获得资源锁并成为Leader,其他节点则无法
成为Leader。

心跳检测:在Zookeeper集群中添加心跳检测机制,确保节点之间的通信正常。当检测到某个节点的心跳丢失
时,可以触发相应的处理逻辑,如重新选举Leader等。

通过以上措施,可以有效地减少Zookeeper脑裂问题的发生,确保Zookeeper集群的稳定运行。

17、Zookeeper的Paxos算法

Zookeeper中的Paxos算法是一种基于消息传递的具有高容错性的一致性算法,主要用于在分布式系统中就某个
值(决议)达成一致。以下是Paxos算法在Zookeeper中的清晰描述:

1. Paxos算法简介
提出者:Paxos算法由莱斯利·兰伯特(Leslie Lamport)在1990年提出。
目标:解决在分布式系统中如何就某个值(决议)达成一致的问题。
基础:基于消息传递的通信模型,适用于可能发生异常(如机器宕机、网络异常等)的分布式系统。

2. Paxos算法中的角色
Proposer(提案者):负责提出提案的节点。
Acceptor(接受者):负责投票并决定是否接受提案的节点。
Learner(学习者):当提案被选定后,同步并执行提案的节点。

3. Paxos算法流程
Paxos算法包含两个阶段:准备阶段(Prepare)和接受阶段(Accept)。

准备阶段(Prepare):

提案编号:Proposer生成一个全局唯一且递增的提案编号N。
发送Prepare请求:Proposer向所有Acceptor发送Prepare(N)请求,试探性地询问是否支持该编号的提案。
Acceptor响应:
如果Acceptor接受的提案编号大于或等于N,则它不会响应Prepare(N)请求。
如果Acceptor接受的提案编号小于N,则它会承诺不再接受编号小于N的提案,并返回之前接受的提案中编号最大
的那个提案的Value和编号。

接受阶段(Accept):

选择提案:Proposer从多数Acceptor的响应中选择编号最大的提案的Value,作为本次要发起的提案。
发送Propose请求:Proposer携带当前提案编号和Value,向所有Acceptor发送Propose请求。
Acceptor接受提案:Acceptor在不违背之前承诺的情况下,接受并持久化当前提案的编号和Value。
形成决议:当Proposer收到多数Acceptor的Accept响应后,决议形成,并将形成的决议发送给所有Learner。

4. Paxos算法的保证
一致性保证:Paxos算法保证了在分布式系统中,即使存在故障和网络异常,也能就某个值达成一致。
安全性:Paxos算法的前提是信道是安全、可靠的且不被篡改的,这在大多数局域网部署的系统中是成立的。
容错性:Paxos算法具有高度容错性,能够在多个节点故障的情况下继续工作。

5. 与Zookeeper的关系
Zookeeper是一个分布式协调服务,用于维护配置信息、命名、提供分布式同步和提供组服务等。Zookeeper使
用了Paxos算法来保证其数据在多个副本之间的一致性。特别是在leader选举和写操作等关键场景中,Paxos算
法确保了Zookeeper集群的稳定性和可靠性。

18、Zookeeper的协议有哪些?

ZooKeeper主要依赖于一个核心的协议来保证其分布式环境中数据的一致性和服务的高可用性,这个协议就是
ZooKeeper Atomic Broadcast (ZAB)。ZAB协议是特别为ZooKeeper设计的,旨在提供一种崩溃恢复和原
子广播的消息传递协议,确保在任何时候,即使面对网络分割或者服务器故障,集群中的所有服务器都能达到一致
的状态。

ZAB协议主要包含以下两个关键阶段:

崩溃恢复(Crash Recovery):在集群启动或领导者(Leader)节点失效时,ZAB协议会进入崩溃恢复模式,
通过选举产生新的Leader,并确保所有Follower节点与Leader的数据同步,以此来恢复服务。

消息广播(Atomic Broadcast):一旦集群处于稳定状态,即Leader已经选举出来且所有Follower都与其同
步完成,ZAB协议就会进入消息广播模式。在这个阶段,客户端的写请求会被Leader转化为事务提案
(Proposal),并通过ZAB协议的原子广播机制发送给所有Follower,确保事务的有序性和一致性。

除了ZAB协议之外,ZooKeeper在客户端与服务器之间交互时,还广泛采用了Watcher机制,这是一种事件通知
机制,虽然不算是协议,但它是ZooKeeper提供服务的基础特性之一。Watcher允许客户端注册对ZNode的监
视,当这些ZNode的状态发生变化时,ZooKeeper服务器会向客户端发送一个事件通知,触发客户端的回调处理
逻辑。

总的来说,ZooKeeper的核心协议是ZAB,用于维护集群状态的一致性,而Watcher机制则是ZooKeeper提供的
一个重要的客户端交互方式,两者共同支撑起ZooKeeper在分布式环境中的协调服务。

19、Zookeeper如何保证数据的一致性?

Zookeeper 保证数据一致性主要通过以下几种方式:

原子广播:Zookeeper 使用一种称为 ZAB(ZooKeeper Atomic Broadcast)的原子广播协议。所有的写操
作都必须通过 Leader 节点,Leader 会将操作以事务的形式广播到所有的 Follower 节点,并确保大多数节
点成功响应后,才认为该操作提交成功。

顺序一致性:Zookeeper 为每个更新操作分配一个全局唯一的递增事务 ID(zxid)。客户端的读请求只会看到
已经完成的事务,保证了操作的顺序一致性。

数据副本:Zookeeper 中的数据在多个节点上进行复制存储。Follower 节点会从 Leader 节点同步数据,以
保持数据的一致性。

会话机制:客户端与 Zookeeper 服务器建立会话。在会话期间,服务器会跟踪客户端的状态,并确保客户端能
够及时感知到数据的变化。

故障恢复:当 Leader 节点出现故障时,Zookeeper 能够快速进行选举,选出新的 Leader 节点,并保证新 
Leader 节点拥有最新的已提交事务,从而继续提供一致的数据服务。

综上所述,通过这些机制的协同作用,Zookeeper 有效地保证了数据的一致性。

20、Zookeeper的数据存储在什么地方?

Zookeeper 中的数据主要存储在内存中。
Zookeeper 将所有数据存储在内存中的一棵数据树(ZNode Tree)中,采用了类似文件系统的层级树状结构进
行管理。每个节点称为 ZNode,ZNode 可以存储数据以及一些属性信息。

Zookeeper 还会将数据的变更记录到事务日志中,以便在服务器重启或出现故障时进行数据恢复。事务日志可以
存储在磁盘上,以保证数据的持久性。

此外,Zookeeper 还可以定期将内存中的数据快照保存到磁盘上,以便在需要时快速恢复数据。

Zookeeper 的数据存储方式使其能够提供高效的数据访问和快速的故障恢复能力,适用于分布式系统中的协调和
管理任务。

21、Zookeeper从三台扩容到七台怎么做?

Zookeeper 可以通过扩容来增加服务器数量,以提高性能和可靠性。以下是一般的扩容步骤:

准备新服务器:选择新的服务器,并在其上安装 Zookeeper 软件。确保新服务器与现有服务器具有相同的硬件
配置和操作系统。

配置 Zookeeper:在新服务器上,修改 Zookeeper 的配置文件(通常是 zoo.cfg),添加新服务器的信息。
指定新服务器的 IP 地址和端口号,并设置其他相关参数,如数据目录和日志文件路径。

启动新服务器:启动新服务器上的 Zookeeper 进程。可以使用启动脚本或命令来启动 Zookeeper 服务。

连接到现有集群:在现有 Zookeeper 集群中的一台服务器上,使用 Zookeeper 客户端连接到集群。可以使用
命令行工具或编程语言提供的 Zookeeper 客户端库来连接。

添加新服务器到集群:使用 Zookeeper 客户端,执行添加新服务器的操作。这通常涉及向 Zookeeper 集群发
送请求,将新服务器的信息添加到集群中。

同步数据:一旦新服务器被添加到集群中,Zookeeper 会自动进行数据同步。新服务器将从现有服务器获取数
据,并与其他服务器保持一致。

测试和验证:在扩容完成后,进行测试和验证以确保新服务器正常工作。可以检查服务器的状态、数据的一致性,
并进行一些读写操作来验证集群的性能和可靠性。

需要注意的是,具体的扩容步骤可能因 Zookeeper 的版本和配置而有所不同。在进行扩容之前,建议参考 
Zookeeper 的官方文档、相关的技术资料,并根据实际情况进行适当的调整和测试。

此外,还需要考虑一些因素,如服务器的性能、网络带宽、数据分布等,以确保扩容后的集群能够正常运行,并满
足系统的需求。如果可能的话,可以在测试环境中进行模拟和测试,以验证扩容方案的可行性。

参考:大数据面试题V3.0,约870篇牛客大数据面经480道面试题_牛客网

通义千问、文心一言、豆包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值