解决方案
通过以下命令可以发现是哪个进程占用了端口,并查看该进程的存储位置,我这里的问题发现是 Zookeeper 在不断地重启,之前并没有自己安装过,想到 Kafka 之前的版本是依赖于 Zookeeper 的,便猜测是 Kafka 的问题,通过 brew list 命令查看了安装的目录发现了 Zookeeper,于是 brew install 命令卸载发现卸载失败 Kafka 有功能依赖,于是先卸载 Kafka,再卸载 Zookeeper 显示成功,问题解决。
lsof -i :8080
- lsof:这是一个工具的名称,代表“list open files”,即列出打开的文件。
- -i:这是lsof命令的一个选项,用于选择仅显示符合条件的网络连接信息。
ps -f -p 4444
是一个用于显示进程信息的命令。其中:
-f
选项表示以全格式显示进程信息,包括 UID、PID 等详细信息。-p 4444
选项表示只显示进程号为 4444 的进程信息。
原因分析
ZooKeeper在Kafka集群中扮演着重要的角色,它主要用于协调Kafka集群中的各个Broker(服务器),以及保存Kafka集群的元数据信息。以下是ZooKeeper在Kafka中的主要作用:
- 集群管理:ZooKeeper帮助Kafka管理集群中的Broker,包括Broker的加入和退出。当有新的Broker加入或现有的Broker退出时,ZooKeeper能够感知到这些变化,并通知集群中的其他Broker。
- 领导者选举:在Kafka中,每个主题的分区都有一个领导者(Leader)Broker,负责处理该分区的所有读写请求。当领导者的Broker失效时,ZooKeeper会负责进行新的领导者选举,确保分区的可用性。
- 元数据存储:ZooKeeper用于存储Kafka集群的元数据信息,如主题、分区信息、分区副本位置等。这些信息对于Kafka的运行至关重要,例如,生产者和消费者需要通过这些信息来找到对应分区的领导者Broker。
- 分布式锁和同步:ZooKeeper提供了分布式锁机制,可以帮助Kafka在分布式环境中实现各种同步操作,如确保配置信息的准确更新,避免数据不一致等问题。
- 配置管理:Kafka的配置信息可以通过ZooKeeper进行管理和同步,确保集群中所有Broker使用相同的配置。
- 控制器选举:在Kafka集群中,有一个Broker会被选举为控制器(Controller),负责管理分区和副本的状态变化。ZooKeeper负责协调这一选举过程。
- 故障转移:当Broker发生故障时,ZooKeeper能够帮助Kafka快速地转移故障,通过重新选举领导者来恢复服务的可用性。
综上所述,ZooKeeper在Kafka中起到了协调管理、元数据存储、选举和同步等关键作用,是Kafka高可用性和分布式特性的重要支撑。随着Kafka的版本迭代,新版本中逐渐引入了KRaft模式,旨在减少对ZooKeeper的依赖,实现元数据管理的内聚化。