作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司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 级别的默认值。
- 主题名字:题名字可以包含字母、数字、下划线以及英文状态下的破折号和句号。主题名字的开头部分包含两个下划线是合法的,但不建议这么做。具有这种 格式的主题一般是集群的内部主题(比如 __consumer_offsets 主题用于保存 消费者群组的偏移量)。也不建议在单个集群里使用英文状态下的句号和下 划线来命名,因为主题的名字会被用在度量指标上,句号会被替换成下划线
(比如“topic.1”会变成“topic_1”)。 - 复制系数:主题的副本数量。
- 分区:主题的分区数量
语法:
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

1.6、列出主题详细信息(–describe)
主题工具还能用来获取主题的详细信息。信息里包含了分区数量、主题的覆盖配置以及 每个分区的副本清单。如果通过 --topic 参数指定特定的主题,就可以只列出指定主题 的详细信息。
示例:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic my-topic

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

| 字段 | 描述 |
|---|---|
| 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)
能够执行成功的一个前提是 消费组这会是不可用状态;
- 执行模式:
–dry-run:这个参数表示预执行,会打印出来将要处理的结果;
–excute:真正执行;
- 执行范围:
–group:指定具体的消费组;
–all-group:指定所有的消费组;
- 重置模式:
相关重置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- |

最低0.47元/天 解锁文章
630

被折叠的 条评论
为什么被折叠?



