ppt模板_0068_黑橙横条
2026/6/3 15:18:27
KafkaBroker 端用于管理日志目录(Log Directory)迁移和查询的核心逻辑,分别对应两个关键 API:
alterReplicaLogDirs(...):实现KIP-113中的ALTER_REPLICA_LOG_DIRS请求,用于将某个分区的日志从一个磁盘目录迁移到另一个。describeLogDirs(...):实现DESCRIBE_LOG_DIRS请求,用于查询每个日志目录中各分区的存储状态(大小、滞后等)。下面我将从设计目标、执行流程、关键机制、典型场景四个维度帮你深入理解。
Kafka 支持配置多个log.dirs(例如挂载多块 SSD),但默认情况下:
这会导致问题:
✅KIP-113 引入了“动态日志目录迁移”能力,允许管理员在线迁移分区日志。
alterReplicaLogDirs:迁移日志目录将指定分区(TopicPartition)的日志文件从当前目录迁移到目标目录(
destinationDir)。
if(Log.logFutureDirName(...).size>255)→ InvalidTopicExceptionif(!logManager.isLogDirOnline(destinationDir))→ KafkaStorageExceptiongetPartition(topicPartition)match{caseOnline(partition)=>...caseOffline=>throwcaseNone=>// 分区尚未创建(比如刚创建 topic,但还没选举 Leader)}LeaderAndIsrRequest(即还没成为副本)logManager.maybeUpdatePreferredLogDir(topicPartition,destinationDir)✅ 这样当后续创建分区时,会直接在
destinationDir中创建日志!
valpartition=getPartitionOrException(topicPartition)partition.localLogOrException// 确保本地有副本NotLeaderOrFollowerExceptionErrors.REPLICA_NOT_AVAILABLEif(partition.maybeCreateFutureReplica(destinationDir,...)){valfutureLog=futureLocalLogOrException(...)logManager.abortAndPauseCleaning(topicPartition)// 暂停 Log CompactionreplicaAlterLogDirsManager.addFetcherForPartitions(...)}destinationDir中创建一个新的“未来日志”(future log)ReplicaAlterDirThread)partition.setLog(futureLog))💡 这类似于副本同步机制,但源和目标都在同一个 Broker 上!
if(partition.futureReplicaDirChanged(destinationDir)){replicaAlterLogDirsManager.removeFetcherForPartitions(...)partition.removeFutureLocalReplica()}alterReplicaLogDirs指向不同目录describeLogDirs:查询日志目录状态返回每个
log.dir中包含的分区信息,包括:
- 当前日志(current log)大小 & offset lag
- 未来日志(future log)大小 & offset lag(如果正在迁移)
[{"logDir":"/disk1/kafka","errorCode":0,"topics":[{"name":"orders","partitions":[{"partitionIndex":0,"partitionSize":1024,"offsetLag":0,"isFutureKey":false},{"partitionIndex":0,"partitionSize":800,"offsetLag":224,"isFutureKey":true}]}]},{"logDir":"/disk2/kafka","errorCode":0,"topics":[]}]vallogsByDir=logManager.allLogs.groupBy(_.parentDir).setOffsetLag(getLogEndOffsetLag(...))offsetLag=Leader LEO - 当前日志 LEO✅ 管理员可通过此接口监控迁移进度!
| 机制 | 目的 |
|---|---|
| Future Replica | 实现无停机、安全的日志迁移 |
| Fetcher-based Copy | 复用现有副本同步逻辑,保证一致性 |
| Preferred Log Dir | 支持“预设目录”,适用于尚未创建的分区 |
| Pause Cleaning | 迁移期间暂停 Log Compaction,避免冲突 |
| Describe with Lag | 提供可观测性,便于运维 |
# 查看各目录使用情况kafka-log-dirs.sh --describe --bootstrap-server localhost:9092 --dirs /disk1,/disk2# 将大分区迁移到空闲磁盘kafka-reassign-partitions.sh --alter-replica-log-dirs...alterReplicaLogDirs设置偏好目录只能迁移本地副本
目标目录必须 online
迁移期间占用额外磁盘空间
不支持内部主题(如__consumer_offsets)
topic 名长度限制
topic-partition_dir,过长会超 255 字符这两段代码体现了 Kafka面向运维友好、高可用、可扩展的设计理念:
alterReplicaLogDirs:通过“未来副本 + 异步复制”实现安全在线迁移describeLogDirs:提供细粒度存储视图,支撑自动化运维它们共同构成了 Kafka存储层弹性调度的基础,是大规模集群管理的关键能力。
如果你正在做磁盘扩容、性能调优、容量规划,这些接口非常实用。
需要我进一步解释Future Replica 的切换时机或ReplicaAlterDirThread 的工作细节吗?