Kafka 4.0 发布,彻底移除 ZooKeeper!

最近 Apache Kafka 4.0 版本发布,这是 Kafka 的一个重要里程碑。Kafka 移除 ZooKeeper 早在几年前就开始准备,4.0 版本是第一个可以完全不使用 ZooKeeper 的版本。

Kafka 4.0 默认允许在 KRaft 模式下,大大简化了集群的部署和管理,消除了集成 ZooKeeper 的复杂性。

在 KRaft 模式下,一些配置、指标和功能发生了不小的变化,今天我们来看一下都有哪些改变。

删除了密码编码相关的配置

这些配置在 ZooKeeper 模式下使用,用来定义和备份密码,这个密钥用于加密加密敏感数据(如密码)。需要指定加密的算法和密钥生成方法(如 AES、RSA),并控制密钥长度和加密强度。相关参数如下:

复制代码
password.encoder.secret
password.encoder.old.secret
password.encoder.keyfactory.algorithm
password.encoder.cipher.algorithm
password.encoder.key.length
password.encoder.iterations

在 KRaft 模式下,Kafka 将敏感数据存储在 records,这些敏感数据不需要加密。

移除下面配置

复制代码
Removed control.plane.listener.name

Kafka 依赖 ZooKeeper 管理元数据,但是一些内部操作(比如 Broker Controller 和普通 Broker 之间通信)依然需要 Kafka 内部控制面板来协调。

在 KRaft 模式下,Kafka 消除了对 ZooKeeper 的依赖,控制面板功能完全集成到 Kafka 内部。处理角色明确分开:brokers 处理与数据相关的请求,而 broker controllers 管理跟元数据相关的请求。controllers 使用 Raft 协议进行内部通信,操作方式与 ZooKeeper 模型不同。使用以下参数来配置控制面板监听器:

复制代码
controller.listener.names
listeners
listener.security.protocol.map

删除优雅停服相关配置

使用外部注册中心,多数情况是需要配置优雅停服的。这些配置在 ZooKeeper 模式下用于定义主动停服的最大重试次数和重试回退时间。它可以降低意外 Controller 变更和数据不一致的风险。

复制代码
controlled.shutdown.max.retries
controlled.shutdown.retry.backoff.ms

在 KRaft 模式下,Kafka 使用 Raft 协议来管理元数据。Broker 关闭过程跟基于仲裁模式的 ZooKeeper 模式不同。Raft 协议的 Controller 切换依赖自动领导者切换,元数据由 Controller 更新,关闭过程更加可靠和高效。

删除了生成 Broker id 相关的配置

这些配置在 ZooKeeper 模式下用于自动生成 Broker id 并控制 Broker id 生成过程。

复制代码
reserved.broker.max.id
broker.id.generation.enable

node id

Kafka在 KRaft 模式下使用 node id 来标识 server。

复制代码
node.id

删除了 Broker 协议版本相关的配置

复制代码
inter.broker.protocol.version

这些配置在 ZooKeeper 模式下用于定义 Broker 之间的通信协议版本。在 KRaft 模式下,Kafka 使用 metadata.version 来控制集群的特征级别,并且可以使用 bin/Kafka-features.sh 脚本进行管理。

移除 ZooKeeper 相关的动态配置

复制代码
advertised.listeners

在 KRaft 模式下,要修改这些配置,就需要重启 Broker。

删除了领导者不平衡配置

复制代码
leader.imbalance.per.broker.percentage

这个配置只在 ZooKeeper 中使用。用于限制 ZooKeeper 中的选举领导者的频率。

移除 ZooKeeper 相关配置

复制代码
zookeeper.connect
zookeeper.session.timeout.ms
zookeeper.connection.timeout.ms
zookeeper.set.acl
zookeeper.max.in.flight.requests
zookeeper.ssl.client.enable
zookeeper.clientCnxnSocket
zookeeper.ssl.keystore.location
zookeeper.ssl.keystore.password
zookeeper.ssl.keystore.type
zookeeper.ssl.truststore.location
zookeeper.ssl.truststore.password
zookeeper.ssl.truststore.type
zookeeper.ssl.protocol
zookeeper.ssl.enabled.protocols
zookeeper.ssl.cipher.suites
zookeeper.ssl.endpoint.identification.algorithm
zookeeper.ssl.crl.enable
zookeeper.ssl.ocsp.enable

删除了 ZooKeeper 相关监控指标

下面参数监控网络处理器平均空闲率:

复制代码
ControlPlaneNetworkProcessorAvgIdlePercent

下面指标监控所有处理器上断开的连接总数:

复制代码
ControlPlaneExpiredConnectionsKilledCount

在 KRaft 模式下,Kafka 提供了网络处理器连接过期指标。指标如下:

复制代码
NetworkProcessorAvgIdlePercent
ExpiredConnectionsKilledCount

删除了 ZooKeeper 独有指标

复制代码
kafka.controller:type=ControllerChannelManager,name=QueueSize
kafka.controller:type=ControllerChannelManager,name=RequestRateAndQueueTimeMs
kafka.controller:type=ControllerEventManager,name=EventQueueSize
kafka.controller:type=ControllerEventManager,name=EventQueueTimeMs
kafka.controller:type=ControllerStats,name=AutoLeaderBalanceRateAndTimeMs
kafka.controller:type=ControllerStats,name=ControlledShutdownRateAndTimeMs
kafka.controller:type=ControllerStats,name=ControllerChangeRateAndTimeMs
kafka.controller:type=ControllerStats,name=ControllerShutdownRateAndTimeMs
kafka.controller:type=ControllerStats,name=IdleRateAndTimeMs
kafka.controller:type=ControllerStats,name=IsrChangeRateAndTimeMs
kafka.controller:type=ControllerStats,name=LeaderAndIsrResponseReceivedRateAndTimeMs
kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMs
kafka.controller:type=ControllerStats,name=ListPartitionReassignmentRateAndTimeMs
kafka.controller:type=ControllerStats,name=LogDirChangeRateAndTimeMs
kafka.controller:type=ControllerStats,name=ManualLeaderBalanceRateAndTimeMs
kafka.controller:type=KafkaController,name=MigratingZkBrokerCount
kafka.controller:type=ControllerStats,name=PartitionReassignmentRateAndTimeMs
kafka.controller:type=ControllerStats,name=TopicChangeRateAndTimeMs
kafka.controller:type=ControllerStats,name=TopicDeletionRateAndTimeMs
kafka.controller:type=KafkaController,name=TopicsIneligibleToDeleteCount
kafka.controller:type=ControllerStats,name=TopicUncleanLeaderElectionEnableRateAndTimeMs
kafka.controller:type=ControllerStats,name=UncleanLeaderElectionEnableRateAndTimeMs
kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec
kafka.controller:type=ControllerStats,name=UpdateFeaturesRateAndTimeMs
kafka.controller:type=ControllerStats,name=UpdateMetadataResponseReceivedRateAndTimeMs
kafka.controller:type=KafkaController,name=ActiveBrokerCount
kafka.controller:type=KafkaController,name=ActiveControllerCount
kafka.controller:type=KafkaController,name=ControllerState
kafka.controller:type=KafkaController,name=FencedBrokerCount
kafka.controller:type=KafkaController,name=GlobalPartitionCount
kafka.controller:type=KafkaController,name=GlobalTopicCount
kafka.controller:type=KafkaController,name=OfflinePartitionsCount
kafka.controller:type=KafkaController,name=PreferredReplicaImbalanceCount
kafka.controller:type=KafkaController,name=ReplicasIneligibleToDeleteCount
kafka.controller:type=KafkaController,name=ReplicasToDeleteCount
kafka.controller:type=KafkaController,name=TopicsToDeleteCount
kafka.controller:type=KafkaController,name=ZkMigrationState
kafka.server:type=DelayedOperationPurgatory,name=PurgatorySize,delayedOperation=ElectLeader
kafka.server:type=DelayedOperationPurgatory,name=PurgatorySize,delayedOperation=topic
kafka.server:type=DelayedOperationPurgatory,name=NumDelayedOperations,delayedOperation=ElectLeader
kafka.server:type=DelayedOperationPurgatory,name=NumDelayedOperations,delayedOperation=topic
kafka.server:type=SessionExpireListener,name=SessionState
kafka.server:type=SessionExpireListener,name=ZooKeeperAuthFailuresPerSec
kafka.server:type=SessionExpireListener,name=ZooKeeperDisconnectsPerSec
kafka.server:type=SessionExpireListener,name=ZooKeeperExpiresPerSec
kafka.server:type=SessionExpireListener,name=ZooKeeperReadOnlyConnectsPerSec
kafka.server:type=SessionExpireListener,name=ZooKeeperSaslAuthenticationsPerSec
kafka.server:type=SessionExpireListener,name=ZooKeeperSyncConnectsPerSec
kafka.server:type=ZooKeeperClientMetrics,name=ZooKeeperRequestLatencyMs

最后

移除了这么多配置,部署不用再考虑 ZooKeeper,架构上整洁了太多。

相关推荐
Gl�ria9 小时前
ZooKeeper 写入机制
zookeeper
江畔柳前堤16 小时前
云原生 × AI 全景图谱:从 Kubernetes 到 Agent 基础设施的一次认知跃迁
人工智能·分布式·gpt·云原生·kubernetes·原型模式·agi
Thomas214319 小时前
kafka 存储flink changelog两种方式和形态
分布式·flink·kafka
GIR12319 小时前
首发:2026年分布式储能系统市场分析报告——覆盖发展前景、占有率与十五五规划
分布式
leo_messi9420 小时前
面试知识点梳理及相关面试题(十六)-- 分布式设计
分布式·面试·职场和发展
IT大白鼠1 天前
MySQL 分布式集群系列 · 第四篇——实操部署指南:从零搭建生产级 MySQL NDB 集群
数据库·分布式·mysql
IT大白鼠1 天前
MySQL 分布式集群系列 · 第三篇——核心原理精讲:NDB 自动分片、多主写入与数据同步
数据库·分布式·mysql
禾吾2 天前
Kafka基础-安装、基础命令等
kafka
cpolar技术支持2 天前
Kafka Streams 窗口统计怎么验收:本地跑订单流聚合,用 cpolar 给同事看只读结果页
java·docker·kafka·cpolar·kafka streams
星恒讯工业路由器2 天前
分布式光伏站点分散难联网?4G/5G点对多点自组网方案解析
分布式·物联网·5g·分布式光伏·自组网·点对多点通信·4g/5g