Kafka 基础教程 — 管理Kafka(命令行工具)详解

 作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题


代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等


联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等

释放21集全网最深ConcurrentHashMap的vip视频,复现每一行源码

管理Kafka

Kafka 提供了一些命令行工具,用于管理集群的变更。这些工具使用 Java 类实现,Kafka 提供了一些脚本来调用这些 Java 类。不过,它们只提供了一些基本的功能,无法完成那 些复杂的操作。

虽然 Kafka 实现了操作主题的认证和授权控制,但还不支持集群的其他大部 分操作。也就是说,在没有认证的情况下也可以使用这些命令行工具,在没 有安全检查和审计的情况下也可以执行诸如主题变更之类的操作。

1、主题操作(kafka-topic.sh)

使用 kafka-topics.sh 工具可以执行主题的大部分操作(配置变更部分已经被弃用并被移动 到 kafka-configs.sh 工具当中)。我们可以用它创建、修改、删除和查看集群里的主题。要使用该工具的全部功能,需要通过 --bootstrap-server 参数提供broker的连接字符串。

1.1、创建主题(–create)

在集群里创建一个主题需要用到 3 个参数。这些参数是必须提供的,尽管有些已经有了broker 级别的默认值。

  1. 主题名字:题名字可以包含字母、数字、下划线以及英文状态下的破折号和句号。主题名字的开头部分包含两个下划线是合法的,但不建议这么做。具有这种 格式的主题一般是集群的内部主题(比如 __consumer_offsets 主题用于保存 消费者群组的偏移量)。也不建议在单个集群里使用英文状态下的句号和下 划线来命名,因为主题的名字会被用在度量指标上,句号会被替换成下划线
    (比如“topic.1”会变成“topic_1”)。
  2. 复制系数:主题的副本数量。
  3. 分区:主题的分区数量

语法:

    kafka-topics.sh --bootstrap-server <zookeeper connect> --create --topic <string> --replication-factor <integer> --partitions <integer>

示例:

    # 使用以下命令创建一个叫作my-topic的主题,主题包含8个分区,每个分区拥有1个副本。
    kafka-topics.sh --bootstrap-server localhost:9092 --create --topic my-topic --replication-factor 1 -- partitions 8

忽略重复创建主题的错误
在自动化系统里调用这个脚本时,可以使用 --if-not-exists 参数,这样即 使主题已经存在,也不会抛出重复创建主题的错误。

1.2、增加分区(–alter)

主题基于分区进行伸缩和复制,增加分区主要是 为了扩展主题容量或者降低单个分区的吞吐量。如果要在单个消费者群组内运行更多的消 费者,那么主题数量也需要相应增加,因为一个分区只能由群组里的一个消费者读取。

  • 调整基于键的主题
    从消费者角度来看,为基于键的主题添加分区是很困难的。因为如果改变了 分区的数量,键到分区之间的映射也会发生变化。所以,对于基于键的主题 来说,建议在一开始就设置好分区数量,避免以后对其进行调整。
  • 忽略主题不存在的错误
    在使用 --alter 命令修改主题时,如果指定了 --if-exists 参数,主题不存 在的错误就会被忽略。如果要修改的主题不存在,该命令并不会返回任何错 误。在主题不存在的时候本应该创建主题,但它却把错误隐藏起来,因此不 建议使用这个参数。

示例:

    #将my-topic主题的分区增加到16
    kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic my-topic --partitions 16

1.3、减少分区数量(无)

我们无法减少主题的分区数量。因为如果删除了分区,分区里的数据也一并 被删除,导致数据不一致。我们也无法将这些数据分配给其他分区,因为这 样做很难,而且会出现消息乱序。所以,如果一定要减少分区数量,只能删 除整个主题,然后重新创建它。

1.4、删除主题(–delete)

如果一个主题不再被使用,只要它还存在于集群里,就会占用一定数量的磁盘空间和文件 句柄。把它删除就可以释放被占用的资源。为了能够删除主题,broker 的 delete.topic. enable 参数必须被设置为 true。如果该参数被设为 false,删除主题的请求会被忽略。

示例:

    # 删除my-topic主题
    kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic my-topic

1.5、列出集群里的所有主题(–list)

可以使用主题工具列出集群里的所有主题。每个主题占用一行输出,主题之间没有特定的顺序。

示例:

    kafka-topics.sh --bootstrap-server localhost:9092 --list

202404032127129971.png

1.6、列出主题详细信息(–describe)

主题工具还能用来获取主题的详细信息。信息里包含了分区数量、主题的覆盖配置以及 每个分区的副本清单。如果通过 --topic 参数指定特定的主题,就可以只列出指定主题 的详细信息。

示例:

    kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic my-topic

202404032127134042.png

describe 命令还提供了一些参数,用于过滤输出结果,这在诊断集群问题时会很有用。不要为这些参数指定 --topic 参数(因为这些参数的目的是为了找出集群里所有满足条件的 主题和分区)。这些参数也无法与 list 命令一起使用(最后一部分会详细说明原因)。

使用 --topics-with-overrides 参数可以找出所有包含覆盖配置的主题,它只会列出包含了 与集群不一样配置的主题。

有两个参数可用于找出有问题的分区。
--under-replicated-partitions 参数可以列出 所有包含不同步副本的分区。
--unavailable-partitions 参数可以列出所有没有首领 的分区,这些分区已经处于离线状态,对于生产者和消费者来说是不可用的。

    # 列出包含不同步副本的分区
    kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions

1.7、修改或删除配置(–config)

覆盖已有的topic参数:

    kafka-topics.sh --bootstrap-server zk_host:port  --topic TEST --alter --config flush.messages=1

删除topic级别配置参数:

    kafka-topics.sh --bootstrap-server zk_host:port --alter --topic TEST --delete-config flush.messages=1

2、消费者群组(kafka- consumer-groups.sh )

在 Kafka 里,有两个地方保存着消费者群组的信息。对于旧版本的消费者来说,它们的信 息保存在 Zookeeper 上;对于新版本的消费者来说,它们的信息保存在 broker 上。kafka- consumer-groups.sh 工具可以用于列出上述两种消费者群组。它也可以用于删除消费者群 组和偏移量信息,不过这个功能仅限于旧版本的消费者群组(信息保存在 Zookeeper 上)。 在对旧版本的消费者群组进行操作时,需要通过 --zookeeper 参数指定 Zookeeper 的地址; 在对新版本的消费者群组进行操作时,则需要使用 --bootstrap-server 参数指定 broker 的 主机名和端口。

语法:

    kafka-consumer-groups.sh [-h] [--bootstrap-server <server to use>] [--command-config <command configuration property file>]
      [--group <consumer-group>] [--new-consumer | --zookeeper] [--describe] [--delete] [--reset-offsets]
      [--reset-offsets-by-duration <duration controlling how far back to reset>] [--reset-offsets-by-topic <topic to reset>]
      [--reset-offsets-by-times] [--all-topics] [--topic <topic>] [--exclude-internal] [--dry-run]
  • -–bootstrap-server:Kafka集群的地址,多个地址使用逗号分隔。
  • -–command-config:kafka的安全认证配置文件路径。
  • -–group:指定要操作的消费组。
  • -–describe:列出消费组的详情。
  • -–delete:删除消费组。
  • -–reset-offsets:重置消费组的偏移量。
  • -–reset-offsets-by-duration:指定重置的时间(从现在往前)。
  • -–reset-offsets-by-topic:指定重置的topic和partition。
  • -–reset-offsets-by-times:指定重置的时间点。
  • -–new-consumer:使用新消费者API。
  • -–zookeeper:使用旧的Zookeeper API。
  • -–all-topics:列出所有topic的所有消费组。
  • -–topic:指定要操作的topic。
  • -–exclude-internal:不列出.kafka/*的topic。
  • -–dry-run:仅输出要执行的操作,不实际运行。

2.1、列出群组(–list)

在使用旧版本的消费者客户端时,可以使用 --zookeeper 和 --list 参数列出消费者群 组;在使用新版本的消费者客户端时,则要使用 --bootstrap-server、–list 参数。

示例:列出旧版本的消费者群组。

    kafka-consumer-groups.sh --zookeeper localhost:2181/kafka-cluster --list

示例:列出新版本的消费者群组。

    kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

2.2、获取群组详细信息(–describe)

使用 --describe,并通过 --group 指定特定的群组, 就可以获取该群组的详细信息。它会列出群组里所有主题的信息和每个分区的偏移量。

示例:获取消费者群组testGroup的详细信息

    kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group testGroup

202404032127141773.png

字段 描述
GROUP 消费者群组的名字
TOPIC 正在被读取的主题名字
PARTITION 正在被读取的分区ID
CURRENT-OFFSET 消费者群组最近提交的偏移量,也就是消费者在分区里读取的当前位置
LOG-END-OFFSET 当前高水位偏移量,也就是最近一个被读取消息的偏移量,同时也是最近一个被提交到集群的偏移量
LAG 消费者的CURRENT-OFFSET和broker的LOG-END-OFFSET之间的差距
CONSUMER-ID 消费者群组里正在读取该分区的消费者。这是一个消费者的ID
HOST 消费者主机IP

2.3、偏移量管理(–reset-offsets)

能够执行成功的一个前提是 消费组这会是不可用状态;

  1. 执行模式:
    –dry-run:这个参数表示预执行,会打印出来将要处理的结果;
    –excute:真正执行;
  1. 执行范围:
    –group:指定具体的消费组;
    –all-group:指定所有的消费组;
  1. 重置模式:
    相关重置Offset的模式;
参数 描述 示例
--to-earliest 重置offset到最开始的offset(未被删除的最早的offset)
--to-current 直接重置offset到当前的offset,也就是LOE
--to-latest 重置到最后一个offset
--to-detetime 重置到指定时间的offset;格式为:YYYY-MM-DDTHH:mm:SS.sss --to-datetime“2021-6-26T00:00:00.000”
--to-offset 重置到指定的offset,但是通常情况下,匹配到多个分区,这里是将匹配到的所有分区都重置到这一个值;如果目标最大offset<to-offset,这个时候重置为目标最大offset;如果目标最小offset>to-offset,则重置为最小; --to-offset300
--shift-by 按照偏移量增加或者减少多少个offsete;正数向前增加、负数向后退 --shift-by100、--shift-by-100
--from-
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值