Zookeeper面试题合集

前言

前文介绍了搜索引擎ES,本文我们继续学习分布式杀器:Zookeeper

Zookeeper面试题合集

  1. Zookeeper是什么?

它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。Zookeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Zookeeper是一个典型的分布式数据一致性解决方案,其设计目的是将复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的系统,并以一系列简单易用的原子操作提供给用户使用。

  1. Zookeeper提供了哪些特性?

顺序一致性(Sequential Consistency):Zookeeper保证客户端的更新顺序与它们被发送的顺序一致。这意味着,来自相同客户端提交的事务,将按照其提交顺序依次执行。
原子性(Atomicity):Zookeeper保证了事务的原子性。在Zookeeper集群中提交事务,事务将“全部完成”或“全部未完成”,不存在“部分完成”的情况。
单一系统镜像(Single System Image):无论客户端连接到Zookeeper集群的哪个节点,其获得的数据视图都是相同的。这保证了数据的一致性。
可靠性(Reliability):一旦一个更新操作被应用,其产生的状态变化将永久保留,直到其他事务进行覆盖。事务一旦完成,其产生的状态变化将永久保留。
实时性(Timeliness):在特定的一段时间内,客户端看到的系统需要被保证是实时的。在此时间内,任何系统的改变被客户端看到,或者被客户端侦测到。

  1. Zookeeper如何保证事务的顺序一致性?

ZAB协议:ZAB协议是ZooKeeper自主开发的一种原子广播协议。它将ZooKeeper服务集群中的每个服务器划分为两类:Leader(领导者)和Follower(跟随者)。Leader负责处理客户端请求并维护系统状态,而Followers则负责复制Leader的状态。当客户端发送一个事务请求到ZooKeeper集群时,Leader会将该请求附加到自己的事务日志中,并广播给所有的Followers。这些Followers会按照Leader发送的顺序逐个执行事务请求。
提案编号:每个事务请求在被广播前,会
被分配一个唯一的递增编号,称为提案编
号。这个编号在整个集群中都是唯一的,用于标识事务的顺序。
Leader的角色:Leader会协调整个过程,确保提案按照相同的顺序被广播给所有Followers。Leader会为每个提案生成一个全局唯一的提案编号,并将提案和提案编号一起广播。
Quorum的多数派决策:ZooKeeper采用了Quorum的思想来保证顺序一致性。Quorum是指在一个分布式系统中,至少需要多少个节点达成一致才能进行下一步操作。通常情况下,ZooKeeper集群的Quorum数量为奇数,以确保有足够的节点来解决冲突。ZooKeeper采用了多数派决策的方式来保证顺序一致性。在一个Quorum中,大多数节点必须就某个提案达成一致,才认为这个提案是提交的。
提交过程:一
旦多数节点接受了某个提案,Leader就会将该提案标记为“已提交”
。一旦提交,提案所对应的操作就会被应用到状态机上,从而实现一致性的状态更新。
读操作的一致性:对于读操作,客户端可以从任何一个节点获取数据。ZooKeeper保证如果一个节点已经在一次请求中成功地执行了某个提案,那么在后续的读操作中,客户端将能够看到该提案所引起的状态变化。

  1. Zookeeper如何进行选举?

初始化选举:当Zookeeper集群启动时,每个Server会给自己投上一票,每次投票会包含所投票服务器的myid和zxid,然后集群中的服务器会将各自的投票结果同步给集群中其他服务器。
处理投票:服务器之间会进行投票比对,规则如下:**优先检查zxid,较大的服务器优先作为Leader。**如果zxid相同,则myid较大的服务器作为Leader。如:zk1和zk2进行比对,此时zk2胜出,zk1更新自己的投票为:zk1(2, 0)。
统计投票结果:每轮投票比对之后都会统计投票结果,确认是否有超过半数的机器都得到相同的投票结果,如果是,则选出Leader,否则继续投票。
改变服务器状态:一旦Leader确定后,Leader会通知其他Follower集群已经成为Uptodate状态,Follower在收到Uptodate消息后,接收Client的请求并开始对外提供服务。

  1. Zookeeper的数据模型是什么?

Zookeeper的数据模型是一个树形结构,非常像电脑中的文件系统。这个数据模型有一个根文件夹,下面还有很多子文件夹。Zookeeper的数据模型采用树形层次结构,每个节点被称为ZNode。每个ZNode都可以拥有子节点,并且兼具文件和目录两种特点。它既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分,并可以具有子ZNode。用户对ZNode具有增、删、改、查等操作(权限允许的情况下)。每个ZNode存储的数据量不宜过大,因为每个节点还可以拥有N个子节点,最上层是根节点以“/”来代表。此外,ZNode具有原子性操作,读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。
此外,ZNode分为
临时节点和永久节点
。临时节点在客户端会话断开后消失,而且临时节点下不能存在子节点。永久节点就相当于进行了持久化,只能人为的去删除;临时节点也可以人为的删除,但是在session失效后,临时节点的所有数据都会丢失。ZNode保持同级节点的唯一性,也就是说一个节点下面不能有两个完全一样的节点。ZNode还分为有序节点和无序节点。有序节点有一个唯一的序号标识符,而这个序号标识符在创建时就确定且不会改变。

  1. Zookeeper的持久化机制是什么?

Zookeeper的持久化机制涉及到数据存储和事务日志的持久化。
首先,Zookeeper的数据存储有两种方式:内存数据库和磁盘数据库。默认情况下,Zookeeper使用内存数据库,从磁盘加载先前保存在内存中的数据一旦开始处理客户端请求,它会将所有更改记录在内存中,并异步将这些更改写入磁盘。这种机制确保了数据的实时性。另一方面,磁盘数据库作为可选的数据存储方式,将Zookeeper数据写入磁盘,并在启动时读取磁盘上的数据。在写入磁盘时,Zookeeper使用了一种称为“快照”的机制,该机制会将整个Zookeeper数据树保存到磁盘上的一个文件中。
其次,Zookeeper
的事务日志持久化是通过记录每一次事务操作到日志文件实现的
。这些日志文件对于数据的恢复和事务的完整性非常重要。每当有一个新的事务操作时,Zookeeper就会将这个操作记录到一个新的日志文件中,文件名通常包含一个特定的ZXID(表示该文件起始的事务ID)。这种日志文件格式有助于在需要时重放这些操作,从而恢复数据。
此外,为了加快数据恢复的速度,Zookeeper还提供**了对树结构和session信息进行数据快照持久化的操作。**数据快照会记录Zookeeper服务器上某一时刻的全量内存数据内容,并写入指定磁盘文件中。这些快照文件的格式通常包含一个特定的ZXID,用于确定数据恢复的起始点。

  1. Zookeeper如何实现分布式锁?

Zookeeper实现分布式锁的原理是使用临时节点+事件通知的方式实现。多个客户端在Zookeeper上创建临时节点,因为临时节点的路径是唯一的,所以只能有一个创建成功,哪个客户端能创建成功就能获得锁。当一个客户端创建节点后,其他客户端只能等待**。当一个客户端执行完逻辑后,删除节点,其他客户端监听到节点被删除,则去争夺资源创建节点。

  1. Zookeeper脑裂是什么?如何解决?

Zookeeper脑裂是指由于网络分区导致Zookeeper集群中的不同部分相互认为自己是主节点,从而产生数据不一致和可用性问题。
解决Zookeeper脑裂问题主要有以下几种方式:
Quorums机制(超过半数): 如果出现多个分区,则每个分区不满足超过总数的一半条件,所以要么只有一个leader,要么选举失败,这种方式是保持数据一致性,舍弃可用性的一种实现。
Weight机制(加权机制): 通过Quorums机制只有超过半数才能提供服务,这样如果集群很大,出现分区则无法使用,故可以给节点设置权重,一些节点权重较高,这样计算出来超过一定权重值则也可以选举leader。这种方式由于机器的权重不一样,故某些分区也是可以选举leader成功的,故可以继续提供服务,即保留可用性。所以可用性方面相对于Quorums机制是有提高的。
Fencing机制(共享资源加锁机制): 集群节点可以看到共享资源说明在集群中,可以获取共享资源的锁则成为leader。这种方式偏向于可用性,数据一致性较弱。
此外,为防止脑裂问题,Zookeeper还提供了多种解决方案。其中一个解决方案是使用数据复制和复制一致性协议(Raft)来确保所有节点的数据同步。如果一个网络分区发生时,Zookeeper能够通过复制数据来保持一致性,即使在某些节点之间无法直接通信的情况下。 快照和日志: Zookeeper使用快照和日志来跟踪集群的状态和操作。当一个节点失败或网络分区发生时,Zookeeper可以通过回滚到快照状态来恢复一致性。此外,Zookeeper还使用日志来记录所有重要的操作和事件,以便在需要时进行故障排除和恢复。 分布式锁: Zookeeper还提供了一种称为分布式锁的功能,可以确保在分布式环境中只有一个节点能够执行某些操作。这可以防止多个节点同时执行相同的操作,从而导致脑裂问题。

  1. Zookeeper在分布式系统中的作用是什么?

协调和管理:Zookeeper为分布式系统提供了一个中心化的协调和管理机制。通过Zookeeper,各个节点可以共享配置信息,发现其他服务,以及进行分布式协调和同步。
数据一致性:Zookeeper确保了分布式系统中的数据一致性。它使用了一种称为Zab协议的原子广播机制,确保了各个节点能够获取到相同的更新操作顺序,从而保持数据的一致性。
分布式锁:Zookeeper提供了分布式锁功能,用于解决分布式系统中的资源竞争问题。通过Zookeeper的分布式锁机制,可以保证同一时间只有一个节点能够访问共享资源。
命名服务
:Zookeeper提供了命名服务,使得分布式系统中的节点能够通过统一的命名空间来标识和定位其他节点。

集群管理:Zookeeper可以对分布式系统中的节点进行集群管理,包括监控节点的状态、实现故障检测、成员变更通知等功能。
数据发布订阅:Zookeeper可以实现数据发布订阅功能,使得节点可以发布和订阅感兴趣的主题,实现消息的广播和订阅。
分布式队列:Zookeeper可以实现分布式队列,支持先进先出(FIFO)策略,帮助系统完成任务调度和协同工作。
心跳检测:Zookeeper可以通过心跳检测机制,检测系统中节点的存活状态,及时发现和处理故障节点。

  1. 了解ZooKeeper的系统架构吗?

其系统架构包括以下几个主要组成部分:
客户端库:ZooKeeper提供了丰富的客户端库,包括Java、C++、Python等语言版本,用户可以通过这些库与ZooKeeper服务器进行交互。
服务器节点:ZooKeeper由一组服务器节点组成,每个节点都运行着一个ZooKeeper实例。这些节点通过心跳检测和集群成员管理机制来保证服务的高可用性和一致性。
数据存储:ZooKeeper使用一种称为Zab的分布式数据一致性算法来保证数据的一致性。每个ZooKeeper实例都维护着一个分布式的数据存储,用于存储和管理共享数据。
请求处理:客户端库通过与ZooKeeper服务器建立连接,发送请求并接收响应。ZooKeeper会对请求进行路由和分发,将请求发送到相应的服务器节点进行处理。
集群管理:ZooKeeper通过心跳检测和集群成员管理机制来维护集群的健康状态和成员关系。当某个节点出现故障时,ZooKeeper会自动将其从集群中剔除,并重新分配任务给其他健康的节点。
配置管理:ZooKeeper提供了一种集中式的配置管理机制,用于管理和维护分布式系统的配置信息。它支持自动同步配置信息,并提供了方便的接口供应用程序使用。
此外,ZooKeeper还具有以下特点:
顺序一致性:从同一个客户端发起的事务请求,将会严格按照其发起顺序被应用到ZooKeeper中。
原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用某一事务,不会出现集群中部分机器应用了事务,另一部分没有应用的情况。
单一视图:无论客户端连接的是哪个ZooKeeper服务端,其获取的服务端数据模型都是一致的。
总之,ZooKeeper的系统架构通过多个组件和机制的协同工作,实现了分布式协调和一致性管理等功能

  1. ZK中的租户

在ZooKeeper中,租户是指使用ZooKeeper服务的用户或应用程序ZooKeeper通过租户的概念来管理用户和资源,并提供了一系列功能和服务,以支持租户的隔离和资源管理。
在ZooKeeper中,租户可以通过以下方式进行管理和隔离:
独立数据库:每个租户可以拥有自己的独立数据库,数据库中的数据互不影响。这种方式可以提供较高的隔离级别和安全性,但需要为每个租户维护一个独立的数据库,增加了维护成本和资源消耗。
共享数据库:多个租户共享同一个数据库,但通过不同的租户模型或租户特定的表来隔离每个租户的数据。这种方式可以降低维护成本和资源消耗,但隔离级别较低,需要加强对租户数据的访问控制和权限管理。
虚拟化技术:ZooKeeper可以通过虚拟化技术将物理资源(如服务器、存储和网络等)进行虚拟化,并为每个租户分配独立的虚拟资源。这种方式可以提供较高的隔离级别和安全性,但需要加强对虚拟资源的监控和管理。
ZooKeeper提供了以下功能和服务来支持租户的管理和隔离:
数据模型隔离:ZooKeeper提供了一种抽象的数据模型,允许租户定义自己的数据结构并对其进行管理和操作。通过这种方式,不同租户的数据可以独立存储和管理,保证了数据的隔离性。
访问控制和权限管理:ZooKeeper提供了细粒度的访问控制和权限管理功能,可以对每个租户的数据进行访问控制和权限验证。通过这种方式,可以确保每个租户的数据安全性和隐私性。
资源隔离和管理:ZooKeeper可以为每个租户分配独立的虚拟资源,包括CPU、内存、存储和网络等。通过这种方式,可以保证每个租户的性能和稳定性,避免资源争用和冲突。
监控和管理:ZooKeeper提供了对租户的监控和管理功能,包括对租户的运行状态、性能指标、日志记录等进行实时监控和管理。通过这种方式,可以及时发现和处理问题,确保租户的稳定性和可靠性。
总之**,ZooKeeper中的租户是指使用ZooKeeper服务的用户或应用程序,通过不同的管理和隔离方式,可以实现不同租户的数据互不影响和安全性保证。ZooKeeper提供了数据模型隔离、访问控制和权限管理、资源隔离和管理以及监控和管理等功能和服务来支持租户的管理和隔离。**

猜你喜欢

转载自blog.csdn.net/for62/article/details/135890848