Kafka笔记7
Kafka提供了一些命令行工具,用于管理集群变更。这些工具使用Java实现,Kafka提供了一些脚本调用这些Java类。
9.1主题操作
使用Kafka-topics.sh工具可以执行主题大部分工作,我们可以用它创建,修改,删除和查看集群的主题。要使用该工具的全部功能,需要通过—zookeeper参数提供zookeeper连接字符串。
创建主题
创建主题需要三个参数:主题名,复制系数和分区
例如:创建名为my-topic的主题,包含8个分区,每个分区拥有2个副本
Kafka-topics.sh —zookeeper zoo1.example.com:2181/kafka-cluster —create my-topic —replicaton-factor 2 —partition 8
增加分区
增加分区主要是为了扩展主题容量或者降低单个分区的吞吐量,如果单个消费者群组内运行更多消费者,也需要增加分区。
例如:将my-topic主题分区数量增加到16
Kafka-topics.sh —zookeeper zoo1.example.com:2181/kafka-cluster —alter —topic my-topic —partition 16
无法减少分区数量,如果一定要删,可以先删除主题,然后重新创建
删除主题
为了删除主题,broker的delete.topic.enable必须为true,如果为false,删除主题的请求会被忽略。
Kafka-topics.sh —zookeeper zoo1.example.com:2181/kafka-cluster —delete —topic my-topic
列出集群所有主题
Kafka-topics.sh —zookeeper zoo1.example.com:2181/kafka-cluster —list
列出所有主题详细信息
Kafka-topics.sh —zookeeper zoo1.example.com:2181/kafka-cluster —describe
使用—topics-with-overrides参数可以找到所有包含覆盖配置的主题,它会列出包含了与集群不一样的配置的主题。
有两个参数可以找出有问题的分区。
使用—under-replicated-partitions参数可以列出所有包含不同步副本的分区。
使用—unavailable-partitions参数的可以列出所有没有首领的分区。这些分区已经离线,对于生产者和消费者都不可用。
Kafka-topics.sh —zookeeper zoo1.example.com:2181/kafka-cluster —describe —under-replicated-partitions
9.2消费者群组
Kafka有两个地方保存消费者群组信息,旧版本在zookeeper,新版本在broker,Kafka-consumer-groups.sh 可以列出上述两种消费者群组。它可以用于删除消费者群组和偏移量,旧版本需要zookeeper地址,新版本需要broker地址。
列出并描述群组
示例:列出旧版本消费者群组
Kafka-consumer-groups.sh —zookeeper zoo1.example.com:2181/kafka-cluster —list
示例:列出新版本消费者群组
Kafka-consumer-groups.sh —new-consumer —bootstrap-server kafka1.example.com:9092/kafka-cluster —list
对于列出任意群组来说,使用—describe代替—list,通过—group指定特定群组就可以获取群组的详细信息。它会列出群组所有主题的信息和每个分区偏移量。
示例:列出旧版本消费者群组testgroup的详细信息
Kafka-consumer-groups.sh —new-consumer —bootstrap-server kafka1.example.com:9092/kafka-cluster —describe —group test group
删除消费者群组
只有旧版本消费者客户端支持删除群组。删除群组将从zookeeper删除群组和所有偏移量。执行操作之前,必须关闭所有消费者。
示例:删除消费者群组testgroup
Kafka-consumer-groups.sh —zookeeper zoo1.example.com:2181/kafka-cluster —delete —group test group
该命令也可以用于不删除整个群组的情况下删除单个主题的偏移量。(删除之前,必须关闭消费者)
示例:从消费者群组testgroup删除my-topic的主题偏移量。
Kafka-consumer-groups.sh —zookeeper zoo1.example.com:2181/kafka-cluster —delete —group test group —topic my-topic
偏移量管理
除了可以显示和删除消费者群组的偏移量之外,还可以获取偏移量,并保存批次的最新偏移量,从而实现偏移量重置。
1.导出偏移量
可以使用Kafka-run-class.sh调用底层Java类实现导出,会生成一个文件,包含分区和偏移量信息
示例:将群组testgroup的偏移量导出到offsets文件
Kafka-run-calss.sh kafka.tools.ExportZkoffsets —zkconnect zoo1.example.com:2181/kafka-cluster —group testgroup —output-file offsets
2.导入偏移量
导入偏移量之前,必须先关闭消费者。
示例:从offsets文件将偏移量导入消费者群组testgroup
Kafka-run-calss.sh kafka.tools.ImportZkoffsets —zkconnect zoo1.example.com:2181/kafka-cluster —group testgroup —input-file offsets
9.3动态配置变更
我们可以在集群运行状态时覆盖主题配置和客户端配置。不管是在工具还是文档,它们所说的动态配置参数都是基于主题或客户端的,都是可以被覆盖的。
覆盖主题的默认配置
更改主题配置的命令格式如下:
Kafka-configs.sh —zookeeper zoo1.example.com:2181/kafka-cluster -alter —entitiy-type topics —entity-name <topicname> —add-config key=value[key=value]
示例:将主题my-topic的消息保留时间设为1小时
Kafka-configs.sh —zookeeper zoo1.example.com:2181/kafka-cluster -alter —entitiy-type topics —entity-name my-topic —add-config retention.ms=3600000
覆盖客户端的默认配置
对于Kafka客户端来说,只能覆盖生产者配额和消费者配额。这两个参数都以字节每秒为参数,表示客户端每个broker上的生成速率和消费速率
更改客户端配置的命令如下:
Kafka-configs.sh —zookeeper zoo1.example.com:2181/kafka-cluster —alter —entity-type clients —entity-name <client id>
—add-config key=value
可用的客户端配置参数,producer_bytes-rate,consumer_bytes_rate
列出被覆盖的配置
使用命令行参数可以列出所有被覆盖的配置,从而用于检查主题和客户端配置。示例:列出主题my-topic所有被覆盖的配置
Kafka-configs.sh —zookeeper zoo1.example.com:2181/kafka-cluster —describe —entity-type topics —entity-name my-topic
移除被覆盖的配置
动态的配置完全可以被移除,从而恢复到集群的默认配置。可以使用alter命令和—delete-config参数来删除被覆盖的配置。
示例:删除主题my-topic的retention.ms覆盖配置
Kafka-configs.sh —zookeeper zoo1.example.com:2181/kafka-cluster
—alter —entity-type topics —entity-name my-topic
—delete-config retention.ms
9.4分区管理
Kafka提供两个脚本管理分区,一个用于重新选举首领,一个用于将分区分配给broker,结合这两个工具,就可以实现集群流量的负载均衡。
使用多个分区副本可以提升可靠性,不过只有其中一个副本可以成为分区首领,只有首领所在broker可以进行生产和消费活动。Kafka将副本清单第一个同步副本选为首领,但在关闭并重启broker之后,并不会自动恢复原先的首领身份。broker有一个配置可以用于启动自动首领再均衡,不过不建议在生产环境使用该功能。
通过触发首选的副本选举,可以让broker重新获得首领。当该事件被触发时,集群控制器会为分区重新选择理想的首领。也可以通过Kafka-preferred-replica-election.sh 工具手动触发选举。
示例:启动首选的副本选举
Kafka-preferred-replica-election.sh —zookeeper zoo1.example.com:2181/kafka-cluster
进行选举时,集群的元数据必须被写到zookeeper上,如果元数据超过了节点运行的大小(默认时1MB),选举就会失败。
这个时候需要把分区清单信息写到json文件,分多个步骤进行:
示例:通过在partitions.json文件里指定分区清单来启动副本选举
Kafka-perferred-replica-election.sh —zookeeper zoo1.example.com:2181/kafka-cluster —path-to-json-file partitons.json
9.4.2修改分区副本
有时需要修改分区副本,以下时需要修改分区副本的场景
1.主题分区在整个集群的不均衡分布造成集群负载不均衡
2.broker离线造成分区不同步
3.新加入的broker需要从集群获得负载。
可以使用Kafka-reassign-partitions.sh 工具来修改分区。
第一步:根据broker清单和主题清单生成一组迁移步骤;
第二步,执行迁移步骤;
第三步:可以使用生成的迁移步骤验证分区重分配的进度和完成情况。
示例:为topics.json文件里的主题生成迁移步骤,将这些主题迁移到broker0和broker1上。
Kafka-reassign-partitions.sh —zookeeper zoo1.example.com:2181/kafka-cluster —generate —topics-to-move-json-file topics.json —broker-list 0,1
这个工具会在控制台输出两个json,分别描述里当前分区和建议分区分配方案,可以把第一个json保存起来,以备回滚。
第二个json应该被保存到另一个文件,作为Kafka-reassign-partitons.sh工具的输入来执行第二个步骤。
示例:使用reassign.json来执行建议的分区分配方案
Kafka-reassign-partitions.sh —zookeeper zoo1.example.com:2181/kafka-cluster —execute —reassignment-json-file reassign.json
该命令会将指定分区的副本重新分配到新的broker上。
在重分配进行过程中或完成之后,可以使用Kafka-reassign-partitions.sh工具验证重分配的状态。
示例:验证reassign.json文件里指定的分区重分配情况。
Kafka-reassign-partitions.sh —zookeeper zoo1.example.com:2181/kafka-cluster —verify —reassignment-json-file reassign.json
9.4.3修改复制系数
分区重分配工具提供了一些特性,可以改变分区的复制系数
9.4.4转储日志片段
如果需要查看某个特定消息的内容,可以使用工具来解码分区的日志片段。该工具可以让你在不读取消息的情况下查看消息的内容。它接受一个以逗号分隔的日志片段文件清单作为参数,并打印出每个消息的概要信息和数据内容。
示例:解码日志片段0001.log,显示消息的概要信息
Kafka-run-class.sh kafka.tools.DumpLogSegments —files 0001.log
示例:解码日志片段0001.log,显示消息的数据内容
Kafka-run-class.sh kafka.tools.DumpLogSegments —files 0001.log —print-data-log
这个片段也可以用于检查日志片段的索引文件。有两个参数可以用于指定不同程度的验证,—index-sanity-check将会检查无用的索引。而—verify-index-only将会检查索引的匹配度,但不会打印出所有索引。
示例:验证日志片段0001.log索引文件的正确性
Kafka-run-class.sh kafka.tools.DumpLogSegments —files 0001.index,0001.log —index-sanity-check
9.4.5副本验证
分区复制原理与消费者客户端类似,跟随者broker定期将上一个偏移量到当前偏移量之间的数据复制到磁盘上。如果复制停止并重启,它会从上一个检查点继续复制,如果之前复制的日志被删除,跟随者不做任何补偿。
可以使用Kafka-replica-verification.sh工具验证集群分区副本的一致性。它会从指定分区副本获取消息,并检查所有副本是否具有相同消息。使用正则表达式将待验证主题的名字传给他,还需要显示提供broker地址清单。
示例:对broker1和broker2上以my-开头的主题副本进行验证
Kafka-replica-verification.sh —broker-list kafka1.example.com:9092,kafka2.example.com:9092 —topic-white-list ‘my-.*’
9.5消费和生产
如果需要手动读取和生成消息,可以借助Kafka-console-consumer.sh和Kafka-console-producer.sh两个工具,它们包装Java客户端,让用户不需要编写应用程序就可以与Kafka主题进行交互。
9.5.1控制台消费者
Kafka-console-consumer.sh 工具提供一种从一个或多个主题读取消息的方式。消息被打印到标准输出,消息之间以空行分隔,默认情况下没有格式化。
有一些参数时必选的。
第一步:指定是否要使用新版本消费者,并指导Kafka地址。如果使用旧版本消费者,只需要提供—zookeeper参数,后面跟Kafka集群的连接字符串。
第二步:需要指定主题,有三个可选参数分别是
—topic
—whitelist
—blacklist
示例:使用旧版消费者读取单个主题my-topic
Kafka-console-consumer.sh —zookeeper
zoo1.example.com:2181/Kafka-cluster —topic my-topic
除了基本参数外,也可以把其它参数传给控制台消费者,可以通过两种方式:
第一:将配置参数写到一个文件,然后通过—consumer.config filename指定配置文件
第二:直接在命令行以—consumer-property key=value的格式传递一个或多个参数。
控制台消费者的其他常用配置:
—formatter classname
指定消息格式化器的类名,用于解码消息,默认是Kafka.tools.DefaultFormatter
—from-beginning
指定从最旧的偏移量读取数据,否则就从最新偏移量开始读取
—max-messages num
指定退出之前最多读取多少消息
—partition num
指定只读取ID为num的分区
读取偏移量主题
有时候我们需要指定提交的消费者群组的偏移量少多少,这个可以通过让控制台消费者读取一个特定__consumer__offsets来实现.
为了解码这个主题,需要使用Kafka.coordinator.GroupMetadataManager$OffsetsMessageFormatter格式化器。
示例:从偏移量主题读取一个消息
Kafka-console-consumer.sh —zookeeper zoo1.example.com:2181/kafka-cluster —topic __consumer__offsets —formatter ‘kafka.coordinator.GroupMetadataManager$OffsetsMessageFormatter’
9.5.2控制台生产者
Kafka-console-producer.sh工具可以用于想Kafka主题写入消息。默认情况下,一行时一个消息,键值以tab分隔,如果没有tab,那么键为null
有两个参数必须指定:
—broker-list参数指定了一个或多个broker,逗号分隔
—topic指定了目标主题
与控制台消费者一样,控制台生产者可以接受普通生产者的配置参数,通过两种方式实现:
第一:通过—producer.config file指定配置文件
第二:在命令行—producer-property key=value传递一个或多个参数
有很多参数可以调整行为:
—key-serializer classname
指定消息键的编码器名
—value-serializer classname
指定消息的value的编码器名
—compression-codec string
指定压缩类型
—sync
指定以同步方式生成消息,也就是说,发送下一个消息之前会等待当前消息得到确认。
9.7不安全的操作
移动集群控制器
取消分区重分配
移动待删除的主题
手动删除主题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端