bash-5.1# kafka-topics.sh --version
2.8.1 (Commit:839b886f9b732b15)
在 Kafka 中,主题(Topic)的数据存储受 retention.ms
(数据保留时间)和 retention.bytes
(存储容量)限制。当主题数据占用过多磁盘空间时,需要调整这些参数。
重点是不能进行重启,因为重启会影响业务,这是关键问题
但配置修改和运维过程中可能遇到各种问题,本文将深入探讨以下内容:
retention.ms
配置Isr: 0
)的排查思路使用 kafka-topics.sh
查看主题的完整配置和分区状态:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic hawk_log
示例输出:
Topic: hawk_log TopicId: Pi2TJRFxQSWcnToN3jDPsQ PartitionCount: 1 ReplicationFactor: 1
Configs: segment.bytes=1073741824
Topic: hawk_log Partition: 0 Leader: 0 Replicas: 0 Isr: 0
关键字段解析:
PartitionCount: 1
:主题仅有一个分区(Partition 0)。ReplicationFactor: 1
:无数据冗余,副本数为 1(生产环境建议至少 3)。Replicas: 0
:所有副本位于 Broker ID 0。Isr: 0
:当前同步的副本列表为空,说明副本未正确同步。尝试直接通过 kafka-topics.sh
修改配置时会报错:
kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic hawk_log --config retention.ms=86400000
错误提示:
Option combination "[bootstrap-server],[config]" can't be used with option "[alter]"
原因:
kafka-topics.sh
主要用于主题的创建、删除、列表查询等基础操作。kafka-configs.sh
实现,这是 Kafka 设计上的职责分离。执行以下命令调整 retention.ms
:
kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name hawk_log \
--alter \
--add-config retention.ms=86400000 # 1天(单位:毫秒)
验证配置生效:
kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name hawk_log \
--describe
输出应包含 retention.ms=86400000
:
Configs for topic 'hawk_log' are retention.ms=86400000,segment.bytes=1073741824
retention.ms
:数据保留时间(默认 7 天)。retention.bytes
:分区最大数据容量(默认 -1,无限制)。log.retention.check.interval.ms
(默认 5 分钟)已配置,Kafka 会周期性检查清理条件。异常场景:Isr: 0
表示所有副本均未同步,可能导致数据不可用。
# 确认 Broker 进程运行
ps -ef | grep kafka
# 检查服务端口监听
netstat -tuln | grep 9092
日志路径通常为 $KAFKA_HOME/logs/server.log
:
# 查找 ERROR 或 WARN 级别日志
grep -E "ERROR|WARN" server.log
# 关键错误示例:
# - Broker registration failed (ZooKeeper 连接问题)
# - Not enough replicas in ISR (副本同步失败)
Kafka 依赖 ZooKeeper 管理元数据,需确保 ZooKeeper 集群健康:
# 进入 ZK 命令行工具
zkCli.sh -server localhost:2181
# 查看 Broker 注册信息
ls /brokers/ids
如果 Broker 已恢复但 ISR 仍异常,可尝试重新选举 Leader:
kafka-leader-election.sh --bootstrap-server localhost:9092 \
--topic hawk_log \
--partition 0 \
--election-type preferred
适用场景:副本损坏或 Broker 不可恢复。
reassign.json
:{
"version": 1,
"partitions": [
{
"topic": "hawk_log",
"partition": 0,
"replicas": [0] // 假设 Broker 0 已恢复,仍分配给它
}
]
}
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--reassignment-json-file reassign.json \
--execute
ReplicationFactor
至少为 3,确保高可用。UnderReplicatedPartitions
、IsrShrinksPerSec
。kafka-log-dirs.sh --bootstrap-server localhost:9092 --describe --topic-list hawk_log
Q1:修改 retention.ms 后数据未立即删除?
log.retention.check.interval.ms
控制(默认 5 分钟),且只清理非活跃段。Q2:如何同时设置时间与容量保留策略?
--add-config retention.ms=86400000,retention.bytes=1073741824
Q3:ReplicationFactor=1 的风险是什么?
Q4:ISR 长时间未恢复怎么办?
通过本文,你掌握了以下技能:
kafka-configs.sh
而非 kafka-topics.sh
。Kafka 运维需要细致的问题定位和预防性设计,希望本指南助你游刃有余应对各类挑战!