ZooKeeper是一个分布式的,开放源码分布式应用程序协调服务,是Google的Chubby一个开源的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Kafka 和 ZooKeeper 在分布式系统中扮演着不同的角色,并且它们之间有着紧密的合作关系。

Zookeeper

zookeeper 是什么?

ZooKeeper‌是一个开源的分布式协调服务,由Apache开发。它主要用于解决分布式系统中的一致性问题,如配置管理、节点选举和分布式锁等‌。ZooKeeper主要功能包括:

  • 配置管理‌:集中管理分布式系统中的配置信息。
  • 命名服务‌:提供唯一的命名服务,帮助分布式系统中的服务发现,客户端能根据指定名字获取资源或服务的地址,提供者等信息。
  • 分布式锁‌:实现分布式环境中的锁机制。zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可有多个线程同时读同一个资源,若要使用写锁也只能有一个线程使用。
  • 集群管理‌:管理集群中的节点,确保数据的一致性和系统的可靠性。监控节点存活状态、运行请求等。
  • 主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,使用 zookeeper 可以协助完成这个过程。

zookeeper 有几种部署模式?(三种)

单机部署:一台集群上运行;
集群部署:多台集群运行;
伪集群部署:一台集群启动多个 zookeeper 实例运行。

zookeeper 怎么保证主从节点的状态同步?

zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 zab 协议。zab 协议有两种模式,分别是恢复模式(选主)和广播模式(同步)当服务启动或者在领导者崩溃后,zab 就进入了恢复模式,当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leaderserver 具有相同的系统状态。

集群中为什么要有主节点?

在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,所以就需要主节点。

集群中有 3 台服务器,一个节点宕机了,zookeeper 还可以用吗?

可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用

zookeeper 的通知机制?

客户端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些客户端会收到 zookeeper 的通知,然后客户端可以根据 znode 变化来做出业务上的改变

Kafka与ZooKeeper的关系

Kafka依赖 ZooKeeper来管理集群元数据、控制器选举和消费者组协调等任务。ZooKeeper 为 Kafka 提供了选主(leader election)、集群成员管理等核心功能,确保Kafka能够在多个节点之间进行有效的通信和管理‌。随着 Kafka 的发展,其对 ZooKeeper的依赖也带来了一些问题:

  • 复杂性增加‌:ZooKeeper 是一个独立的外部组件,增加了运维的复杂度。
  • 性能瓶颈‌:在高负载情况下,ZooKeeper 可能成为系统的瓶颈,限制Kafka的扩展能力。
  • 一致性问题‌:Kafka内部的一致性模型与 ZooKeeper 的一致性模型有所不同,可能导致状态不一致,影响系统的稳定性和消息传递的可靠性‌。