Leader Not Available
Leader Parition Error
txt
[Producer ] Could not connect to leader for partition CodeWallEEvent/1: Kafka::LeaderNotAvailable
Describe Topic Stat
bash
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic CodeWallEEvent
txt
Topic: CodeWallEEvent TopicId: YAJq9X4eQ3uuLmJpK-X4YA PartitionCount: 3 ReplicationFactor: 1 Configs: max.message.bytes=20971520
Topic: CodeWallEEvent Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: CodeWallEEvent Partition: 1 Leader: none Replicas: 100 Isr: 100
Topic: CodeWallEEvent Partition: 2 Leader: 0 Replicas: 0 Isr: 0
字段 | 含义 | 说明 |
---|---|---|
Partition | Kafka 分区编号(从 0 开始) | 是 Partition ID |
Leader | 当前该分区的主控 broker | Broker ID |
Replicas | 所有副本所在的 broker 列表 | Broker ID 列表 |
Isr | 当前同步完成的副本 broker 列表 | Broker ID 列表 |
Partition 1 is invalid: Leader: none
and Broker ID: 100
.
Delete Topic
bash
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic foo
Delete Topics with Prefix
With foo_
prefix.
bash
kafka-topics.sh --bootstrap-server localhost:9092 --list | grep '^foo_' | xargs -I{} kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic {}
Create Topic
Create topic foo
with 3 partition and 1 replicas.
bash
kafka-topics.sh --create \
--topic foo \
--bootstrap-server localhost:9092 \
--partitions 3 \
--replication-factor 1
Delete PVC
If all topic can be deleted, just delete the pvc.
bash
kubectl scale sts xxx --replicas=0
bash
kubectl delete pvc xxx
What is ISR
ISR 的全称是 In-Sync Replicas,意思是"同步中的副本"。 它是指与 Leader 副本保持同步的所有副本列表。 也就是说,这些副本都紧跟 Leader 的数据进度,延迟在 Kafka 容忍范围之内(由 replica.lag.time.max.ms
控制,默认 10 秒)。
功能
- Kafka 只能从 ISR 列表中的 Leader 处理写入,防止丢数据。
- Kafka 在 ack=all 模式下,消息只有在 ISR 中的所有副本都确认写入后,才返回确认给生产者。
- 如果某个 Follower 长时间落后于 Leader,Kafka 会将其 移出 ISR,不再认为它是"安全副本"。
例子
假设:
- replication.factor=3
- min.insync.replicas=2
- Producer 设置 acks=all
那么:
- 写入操作只会在 ISR ≥ 2 时才成功(即至少两个副本同步写入)。
- 如果 ISR 只剩下 Leader 自己(比如其他副本宕机或太慢),写入将失败。
Partition and Broker
Kafka 的 分区(partition) 和 broker(节点) 的关系非常关键,它们共同影响 Kafka 的 吞吐性能、可扩展性和高可用性。
维度 | 说明 |
---|---|
每个分区只能由一个 broker 作为 leader | 所以分区数应 ≥ broker 数,才能充分利用 broker |
一个 broker 可以拥有多个分区 | Kafka 不限制每个 broker 的分区数量,但太多分区会带来管理负担 |
分区决定并发度 | 越多分区,消费者并行处理能力越强,但也带来 overhead |
副本复制要依赖多个 broker | 若 replication-factor > 1,需要至少多个 broker 才能工作 |
Scale Down Broker
当你从多节点 Kafka 集群“缩容成一个 broker”,必须谨慎操作,否则会出现数据丢失、服务中断甚至 Kafka 启动失败的问题。
假设当前:
- 你有多个 broker(如 broker-0, broker-1, broker-2)
- 每个 topic 的 partition 和 replica 分布在不同节点
- 你想缩容为 只有 broker-0 一个节点
操作步骤
- 调整
replication.factor = 1
- 使用
kafka-reassign-partitions
重新分配副本到broker-0
- 确认副本分配情况
- 逐步关闭
broker-1
和broker-2