Kafka Broker 运维

Kafka Broker 工作流程、ZooKeeper 元数据观察、节点服役退役和副本迁移操作。

Kafka Broker 运维

1、Kafka Broker工作流程

1.1 Zookeeper存储的Kafka信息

1)启动Zookeeper客户端

[root@kafka102 zookeeper-3.5.9]$ bin/zkCli.sh
or
[root@kafka102 zookeeper-3.5.9]$ bin/zkCli.sh -server kafka102:2181

2)通过ls命令可以查看kafka相关信息

[zk: kafka102:2181(CONNECTED) 1] ls /kafka
[admin, brokers, cluster, config, consumers, controller, controller_epoch, feature, isr_change_notification, latest_producer_id_block, log_dir_event_notification]
节点路径核心作用关键细节补充说明
/kafka/admin集群管理操作的任务记录与状态存储1. 子节点 delete_topics:记录待删除的 Topic 及删除任务状态,保证删除操作幂等性;2. 子节点 reassign_partitions:存储分区重分配的计划、进度,中断后可续跑;3. 子节点 preferred_replica_election:记录优先副本选举任务状态。1./kafka/admin/delete_topics 仅在删除过程中临时存在,删除完成后节点会被自动清理;若删除速度快(数据量小、负载低),可能观察不到该节点;<br />2. reassign_partitionspreferred_replica_election 为 “按需创建” 节点,无对应操作时不会显示,属于正常现象。-
/kafka/brokers存储集群所有 Broker 及 Topic 分区的核心元数据(最核心节点)1. 子节点 ids:列出所有在线 Broker 的 ID,及 Broker 的地址、端口、版本等信息;2. 子节点 topics:存储所有 Topic 的元数据(分区数、副本分配、ISR 列表等);3. 子节点 seqid:自动生成 Broker ID 的自增序列(未手动指定 Broker ID 时生效)。
/kafka/cluster存储集群级全局标识核心为 id 子节点:记录集群唯一 ID,用于区分不同 Kafka 集群,避免元数据混淆。-
/kafka/config存储动态配置(无需重启集群生效)1. 子节点 topics:各 Topic 的自定义配置(如 retention.mssegment.bytes);2. 子节点 brokers:各 Broker 的动态配置(如 listenerslog.retention.hours);3. 子节点 clients/users:客户端配额、用户认证相关配置。-
/kafka/consumers兼容旧版消费者(0.9 之前)的消费偏移量存储新版消费者(0.9+)默认将偏移量存在 Kafka 内部 Topic __consumer_offsets,此节点仅用于兼容历史业务,通常为空。-
/kafka/controller记录当前集群的 Controller Broker 信息存储当前 Controller 的 Broker ID,是集群的 “指挥中心”,负责 Leader 选举、Broker 上下线管理;节点为临时节点,Controller 宕机后自动删除,触发新选举。-
/kafka/controller_epochController 纪元号,防止 “脑裂”每次 Controller 重新选举,纪元号自增 1;确保只有最新纪元的 Controller 指令被集群执行,避免多 Controller 冲突。-
/kafka/feature集群功能特性管理(兼容版本升级)存储各 Broker 支持的功能版本(如幂等性、事务),保证滚动升级时功能兼容,避免版本不一致导致异常。-
/kafka/isr_change_notificationISR 列表变更通知节点当分区的同步副本(ISR)列表变化(如副本滞后被踢出),Controller 会在此写入通知,触发监控 / 告警或数据同步逻辑。-
/kafka/latest_producer_id_block幂等 / 事务生产者的 PID 分配存储最后一次分配的 Producer ID(PID)块,保证每个幂等 / 事务生产者的 PID 全局唯一,避免重复。-
/kafka/log_dir_event_notification日志目录故障通知节点当 Broker 磁盘日志目录异常(满、损坏),在此写入事件,Controller 感知后触发分区迁移等容灾操作。-

模拟Kafka上下线,Zookeeper中数据变化

1)查看/kafka/brokers/ids路径上的节点

[zk: localhost:2181(CONNECTED) 2] ls /kafka/brokers/ids[0, 1, 2]

2)查看/kafka/controller路径上的数据

[zk: localhost:2181(CONNECTED) 5] get /kafka/controller
{"version":1,"brokerid":1,"timestamp":"1771677041573"}
cZxid = 0x8000001a3
ctime = Sat Feb 21 20:30:41 CST 2026
mZxid = 0x8000001a3
mtime = Sat Feb 21 20:30:41 CST 2026
pZxid = 0x8000001a3
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x29c7ff0ab5c0003
dataLength = 54
numChildren = 0

3)查看/kafka/brokers/topics/first/partitions/0/state路径上的数据

[zk: localhost:2181(CONNECTED) 6] get /kafka/brokers/topics/first/partitions/0/state
{"controller_epoch":10,"leader":0,"version":1,"leader_epoch":0,"isr":[0,2]}
cZxid = 0x80000021c
ctime = Sat Feb 21 22:39:05 CST 2026
mZxid = 0x80000021c
mtime = Sat Feb 21 22:39:05 CST 2026
pZxid = 0x80000021c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 75
numChildren = 0

4)停止kafka104上的kafka

[root@kafka104 kafka-3.2.1]$ bin/kafka-server-stop.sh

5)再次查看/kafka/brokers/ids路径上的节点

[zk: localhost:2181(CONNECTED) 3] ls /kafka/brokers/ids[0, 1]

6)再次查看/kafka/controller路径上的数据

[zk: localhost:2181(CONNECTED) 15] get /kafka/controller{"version":1,"brokerid":0,"timestamp":"1637292471777"}

7)再次查看/kafka/brokers/topics/first/partitions/0/state路径上的数据

[zk: localhost:2181(CONNECTED) 16] get /kafka/brokers/topics/first/partitions/0/state {"controller_epoch":24,"leader":0,"version":1,"leader_epoch":18,"isr":[0,1]}

8)启动kafka104上的kafka

[root@kafka104 kafka-3.2.1]$ bin/kafka-server-start.sh -daemon ./config/server.properties

9)再次观察

再次观察1)、2)、3)步骤中的内容

2、生产经验--节点服役和退役

2.1 服役新节点

1)新节点准备(环境准备)

(1)关闭kafka104,并右键执行克隆操作

(2)开启kafka105,并修改IP地址

[root@kafka105 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.2.105
PREFIX=24
GATEWAY=192.168.2.2
DNS1=192.168.10.2

(3)在kafka105上,修改主机名称为kafka105

(4)修改kafka105中kafka的broker.id为3

(5)删除kafka105中kafka下的datas和logs

[root@kafka105 kafka-3.2.1]$ rm -rf datas/*  logs/*

(6)启动kafka102、kafka103、kafka104上的kafka集群

[root@kafka102 ~]$ zk.sh start
[root@kafka102 ~]$ kf.sh start

(7)单独启动kafka105中的kafka服务

在启动kafka105节点的kafka之前,请先查看已启动的kafka集群是否有topic,如果没有,请提前创建一个topic,2个备份,3个分区

1.创建主题

bin/kafka-topics.sh --bootstrap-server kafka102:9092,kafka103:9092,kafka104:9092 --create --replication-factor 2 --partitions 3 --topic first

2.查看主题

[root@kafka102 kafka-3.2.1]$ xkafka-topic-list.sh
first

3.查看详情

[root@kafka102 kafka-3.2.1]$ xkafka-topic-describe.sh first
Topic: first	TopicId: wNbSexjDQ8S96Y4ov1hSOg	PartitionCount: 3	ReplicationFactor: 2	Configs: segment.bytes=1073741824
	Topic: first	Partition: 0	Leader: 2	Replicas: 2,1	Isr: 2,1
	Topic: first	Partition: 1	Leader: 1	Replicas: 1,0	Isr: 1,0
	Topic: first	Partition: 2	Leader: 0	Replicas: 0,2	Isr: 0,2

4.启动105

[root@kafka105 kafka-3.2.1]$ bin/kafka-server-start.sh -daemon config/server.properties

2)对已存在的topic执行负载均衡操作

(1)创建一个要均衡的主题

[root@kafka102 kafka-3.2.1]$ touch topics-to-move.json
[root@kafka102 kafka-3.2.1]$ vim topics-to-move.json
{
    "topics": [
        {"topic": "first"}
    ],
    "version": 1
}

(2)生成一个负载均衡的计划


[root@kafka102 kafka-3.2.1]# bin/kafka-reassign-partitions.sh --bootstrap-server kafka102:9092,kafka103:9092,kafka104:9092  --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2,3" --generate
Current partition replica assignment
{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[1,2],"log_dirs":["any","any"]},{"topic":"first","partition":1,"replicas":[0,1],"log_dirs":["any","any"]},{"topic":"first","partition":2,"replicas":[2,0],"log_dirs":["any","any"]}]}

Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[1,3],"log_dirs":["any","any"]},{"topic":"first","partition":1,"replicas":[2,0],"log_dirs":["any","any"]},{"topic":"first","partition":2,"replicas":[3,1],"log_dirs":["any","any"]}]}

(3)创建副本存储计划(所有副本存储在broker0、broker1、broker2、broker3中)

[root@kafka102 kafka-3.2.1]$ vim increase-replication-factor.json

(4)执行副本存储计划

[root@kafka102 kafka-3.2.1]$ bin/kafka-reassign-partitions.sh --bootstrap-server kafka102:9092,kafka103:9092,kafka104:9092 --reassignment-json-file increase-replication-factor.json --execute

(5)验证副本存储计划

[root@kafka102 kafka-3.2.1]$ bin/kafka-reassign-partitions.sh --bootstrap-server kafka102:9092 --reassignment-json-file increase-replication-factor.json --verify

(6)查看详情

[root@kafka102 kafka-3.2.1]$ xkafka-topic-describe.sh first
Topic: first	TopicId: wNbSexjDQ8S96Y4ov1hSOg	PartitionCount: 3	ReplicationFactor: 3	Configs: segment.bytes=1073741824
	Topic: first	Partition: 0	Leader: 2	Replicas: 2,3,0	Isr: 2,0,3
	Topic: first	Partition: 1	Leader: 3	Replicas: 3,0,1	Isr: 1,0,3
	Topic: first	Partition: 2	Leader: 0	Replicas: 0,1,2	Isr: 0,2,1

(7):作业

完成节点服役

2.2退役旧节点

主要思想逻辑

1)执行负载均衡操作

2)关闭kafka105节点上的kafka服务

先按照退役一台节点,生成执行计划,然后按照服役时操作流程执行负载均衡。

1)创建一个要均衡的主题

[root@kafka102 kafka-3.2.1]$ vim topics-to-move.json
{
    "topics": [
        {"topic": "first"}
    ],
    "version": 1
}

2)查看topic详情

[root@kafka102 kafka-3.2.1]$ xkafka-topic-describe.sh first
Topic: first	TopicId: wNbSexjDQ8S96Y4ov1hSOg	PartitionCount: 3	ReplicationFactor: 3	Configs: segment.bytes=1073741824
	Topic: first	Partition: 0	Leader: 2	Replicas: 2,3,0	Isr: 2,0,3
	Topic: first	Partition: 1	Leader: 3	Replicas: 3,0,1	Isr: 1,0,3
	Topic: first	Partition: 2	Leader: 0	Replicas: 0,1,2	Isr: 0,2,1

3)创建执行计划

bin/kafka-reassign-partitions.sh --bootstrap-server kafka102:9092  --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate

----
Current partition replica assignment
{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[1,3],"log_dirs":["any","any"]},{"topic":"first","partition":1,"replicas":[2,0],"log_dirs":["any","any"]},{"topic":"first","partition":2,"replicas":[3,1],"log_dirs":["any","any"]}]}

Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[2,1],"log_dirs":["any","any"]},{"topic":"first","partition":1,"replicas":[0,2],"log_dirs":["any","any"]},{"topic":"first","partition":2,"replicas":[1,0],"log_dirs":["any","any"]}]}

4)创建副本存储计划(所有副本存储在broker0、broker1、broker2中)

[root@kafka102 kafka-3.2.1]$ vim increase-replication-factor.json
{
	"version": 1,
	"partitions": [{
		"topic": "first",
		"partition": 0,
		"replicas": [2, 0, 1],
		"log_dirs": ["any", "any", "any"]
	}, {
		"topic": "first",
		"partition": 1,
		"replicas": [0, 1, 2],
		"log_dirs": ["any", "any", "any"]
	}, {
		"topic": "first",
		"partition": 2,
		"replicas": [1, 2, 0],
		"log_dirs": ["any", "any", "any"]
	}]
}

5)执行副本存储计划

[root@kafka102 kafka-3.2.1]$ bin/kafka-reassign-partitions.sh --bootstrap-server kafka102:9092 --reassignment-json-file increase-replication-factor.json --execute

Current partition replica assignment

{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[2,3,0],"log_dirs":["any","any","any"]},{"topic":"first","partition":1,"replicas":[3,0,1],"log_dirs":["any","any","any"]},{"topic":"first","partition":2,"replicas":[0,1,2],"log_dirs":["any","any","any"]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started partition reassignments for first-0,first-1,first-2

6)验证副本存储计划

[root@kafka102 kafka-3.2.1]$ bin/kafka-reassign-partitions.sh --bootstrap-server kafka102:9092 --reassignment-json-file increase-replication-factor.json --verify

Status of partition reassignment:
Reassignment of partition first-0 is complete.
Reassignment of partition first-1 is complete.
Reassignment of partition first-2 is complete.

Clearing broker-level throttles on brokers 0,1,2,3
Clearing topic-level throttles on topic first

7)查看topic详情

[root@kafka102 kafka-3.2.1]$ xkafka-topic-describe.sh first
Topic: first	TopicId: wNbSexjDQ8S96Y4ov1hSOg	PartitionCount: 3	ReplicationFactor: 3	Configs: segment.bytes=1073741824
	Topic: first	Partition: 0	Leader: 2	Replicas: 2,0,1	Isr: 2,0,1
	Topic: first	Partition: 1	Leader: 0	Replicas: 0,1,2	Isr: 1,0,2
	Topic: first	Partition: 2	Leader: 0	Replicas: 1,2,0	Isr: 0,2,1

8)关闭kafka105节点上的kafka服务

[root@kafka105 kafka-3.2.1]$ bin/kafka-server-stop.sh