大数据-62 Kafka Topic 管理与运维实战:命令详解 + 副本分配策略 + JavaAPI

77 阅读8分钟

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2开源大模型解读与实践,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年08月04日更新到: Java-89 深入浅出 MySQL 搞懂 MySQL Undo/Redo Log,彻底掌握事务回滚与持久化 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

请添加图片描述

章节内容

上节我们完成了如下的内容,基本都是特性概念相关的:

  • Kafka 主题与分区
  • Kafka 自定义反序列化
  • Kafka 拦截器
  • Kafka 位移提交
  • Kafka 位移管理
  • Kafka 重平衡

在这里插入图片描述

kafka-topics

相关参数

在这里插入图片描述 在这里插入图片描述

创建主题

kafka-topics.sh --zookeeper h121.wzk.icu:2181 --create --topic topic_test_1 --partitions 1 --replication-factor 1

查看主题

kafka-topics.sh --zookeeper h121.wzk.icu:2181 --list
kafak-topics.sh --zookeeper h121.wzk.icu:2181 --describe --topic topic_test_1

修改主题

kafka-topics.sh --zookeeper h121.wzk.icu:2181 --create --topic topic_test_1 --partitions 2 --replication-factor 1

删除主题

kafka-topics.sh --zookeeper h121.wzk.icu:2181 --delete --topic topic_test_1

增加分区

通过命令行工具操作,只能够增加,不能够减少。

kafka-topics.sh --zookeeper h121.wzk.icu:2181 --create --topic topic_test_1 --partitions 1 --replication-factor 1
kafka-topics.sh --zookeeper h121.wzk.icu:2181 --alter --topic topic_test_2 --partions 2

分区副本分配策略详解

Kafka的分区副本分配遵循三个核心原则,以确保集群的高可用性和数据可靠性:

副本分配目标

  1. Broker间均衡分布

    • 副本尽可能均匀地分布在所有可用的Broker上,避免单个Broker负载过重
    • 示例:在6个Broker的集群中,每个分区的3个副本应该尽可能分散在3个不同的Broker上
  2. 跨Broker冗余

    • 同一分区的多个副本必须分布在不同的Broker上
    • 这样当某个Broker宕机时,该Broker上的所有主分区副本都可以从其他Broker上的副本中选举出新的主副本
  3. 跨机架容灾(可选)

    • 如果配置了机架信息(rack.id),会尽量将同一分区的副本分散在不同机架
    • 这可以防止单个机架故障导致数据不可用
    • 示例:2个副本在不同机架,第三个副本在第三个机架或随机分布

无机架信息的分配算法

当集群未配置机架信息时,采用以下分配逻辑:

  1. 第一个副本分配

    • 从Broker列表中随机选择一个起始位置开始轮询
    • 例如:Broker列表为[1,2,3,4,5,6],随机选择起始位置3,则分配顺序为3→4→5→6→1→2
    • 这种随机起始的轮询方式避免了每次都从固定位置开始导致的分配不均
  2. 后续副本分配

    • 对第一个副本的Broker ID增加特定偏移量来确定其他副本位置
    • 偏移量计算公式:(前一个副本Broker ID + 固定增量) % Broker总数
    • 固定增量通常取质数(如3),以确保良好的分布性
    • 示例:第一个副本在Broker3,Broker总数6,固定增量3
      • 第二个副本:(3+3)%6=0 → Broker6
      • 第三个副本:(6+3)%6=3 → 回到Broker3时会跳过,选择下一个可用Broker
  3. 分配调整

    • 如果计算出的Broker已包含该分区的副本,则顺延选择下一个可用Broker
    • 确保同一分区的多个副本不会分配到同一个Broker上

这种分配策略在保证数据安全性的同时,也维持了集群的负载均衡,是Kafka高可用架构的重要基础。

必要参数

在这里插入图片描述

KafkaAdminClient

除了使用Kafka的Bin目录下的脚本来管理Kafka集群,开发者还可以通过编程方式调用Kafka提供的管理API将这些管理功能集成到自己的系统中,实现更灵活的集群管理方案。

在Kafka 0.11版本之前,主要可以通过以下两种方式实现编程化管理:

  1. 使用kafka-core包(Kafka服务端实现,基于Scala)中的AdminClient类
  2. 使用AdminUtils工具类 这些方式可以完成基本的集群管理操作,如创建/删除Topic、查看Broker状态等。

在Kafka 0.11版本之后,官方引入了一个新的管理客户端架构:

  1. 新增了位于kafka-client包下的AdminClient抽象类
  2. 其具体实现类为KafkaAdminClient
  3. 这个新的API设计更加完善,提供了更丰富的管理功能,包括:
    • 完整的Topic管理(创建/删除/修改配置)
    • 分区管理(增加分区、重新分配分区)
    • 配置管理(动态更新配置)
    • ACL权限管理
    • 消费者组管理
    • 副本管理

使用示例:

Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
try (AdminClient adminClient = AdminClient.create(props)) {
    // 创建Topic
    NewTopic newTopic = new NewTopic("my-topic", 3, (short)1);
    CreateTopicsResult result = adminClient.createTopics(
        Collections.singleton(newTopic));
    // 等待创建完成
    result.all().get();
}

新的AdminClient API相比之前的方案具有以下优势:

  1. 完全基于Java实现,不再依赖Scala
  2. 异步非阻塞设计
  3. 更全面的管理功能覆盖
  4. 更好的错误处理和返回结果
  5. 与Kafka其他客户端API保持一致的编程风格

这种编程化的管理方式特别适合需要将Kafka管理功能集成到运维系统或自动化平台的场景,可以实现:

  • 自动化部署和配置管理
  • 动态资源调配
  • 监控告警系统集成
  • 自助式管理Portal等企业级功能

基本功能介绍

Kafka 提供了一系列基础管理功能,用于集群和主题的日常运维管理。以下是详细功能说明:

主题管理功能

  1. 创建主题 (createTopics)

    • 可指定分区数、副本数、副本分配策略等参数
    • 示例:创建名为"test_topic"的主题,设置3个分区和2个副本
    • 支持批量创建多个主题
  2. 删除主题 (deleteTopics)

    • 可指定立即删除或延迟删除
    • 支持批量删除多个主题
    • 删除前会自动检查主题是否正在被使用
  3. 列出所有主题 (listTopics)

    • 返回集群中所有主题的列表
    • 可配合正则表达式过滤主题名称
    • 支持分页查询大量主题
  4. 查询主题详情 (describeTopics)

    • 获取主题的完整配置信息
    • 包括分区分布、副本位置、ISR列表等
    • 支持查询多个主题的详细信息
  5. 增加分区 (createPartitions)

    • 动态扩展主题的分区数量
    • 需指定新增分区数及可选的分区分配方案
    • 注意:分区数只能增加不能减少

集群管理功能

  1. 查询集群信息 (describeCluster)

    • 获取集群ID、控制器节点等元数据
    • 列出所有Broker节点及其状态
    • 查看集群当前资源使用情况
  2. 配置管理

    • 查询配置 (describeConfigs):获取Broker、主题或客户端的配置详情
    • 修改配置 (alterConfigs):动态更新配置参数
      • 支持批量修改多个资源配置
      • 可设置临时或永久配置变更

日志目录管理

  1. 修改副本日志目录 (alterReplicaLogDirs)

    • 将分区副本迁移到指定的日志目录
    • 支持在线迁移不影响可用性
    • 可用于磁盘空间均衡或故障恢复
  2. 日志目录查询

    • describeLogDirs:查询Broker节点上所有日志目录的使用情况
    • describedReplicaLogDirs:获取特定副本的日志目录信息

应用场景示例

  • 容量规划时使用describeTopics分析分区分布
  • 磁盘扩容后使用alterReplicaLogDirs重新平衡存储
  • 业务高峰前用createPartitions扩展主题容量
  • 日常维护使用describeCluster监控集群健康状态

这些功能共同构成了Kafka基础管理API,可通过Kafka命令行工具或AdminClient API调用。

操作步骤

  • 客户端根据方法的调用,创建出相应的协议请求,比如创建:Topic的createTopics方法,其内部就是发送CreateTopicRequest请求。
  • 客户端发送请求到KafkaBroker
  • KafkaBroker处理相应的请求并回执,CreateTopicResponse,客户端接受并解析处理。

如果要自己实现一个功能,需要:

  • 自定义XXOptions
  • 自定义XXResult返回值
  • 自定义Call,挑选合适的XXRequest和XXResponse

偏移量管理

在Kafka 1.0.2版本,在 __consumer_offsets 主题中保存各个消费组的偏移量。 早期是子啊ZooKeeper中管理消费偏移量。

脚本参数

脚本名称为:bin/kafka-consumer-groups.sh 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

查看GroupID消费

查看当前有哪些GroupID正在进行消费,这里没有指定Topic,查看的是所有Topic消费的GroupId的列表。

kafka-consumer-groups.sh --bootstrap-server h121.wzk.icu:9092 --list

查看指定ID消费

kafka-consumer-groups.sh --bootstrap-server h121.wzk.icu:9092 --describe --group group 

设置偏移量为最早

kafka-consumer-groups.sh --bootstrap-server h121.wzk.icu:9092 --reset-offsets --group group --to-earliest --topic test_demo

设置偏移量为最新

kafka-consumer-groups.sh --bootstrap-server h121.wzk.icu:9092  --reset-offsets --group group --to-latest --topic test_demo