Kafka主题运维全指南:从基础配置到故障处理

#作者:张桐瑞

文章目录

  • 主题日常管理
  • 1. 修改主题分区。
  • 2. 修改主题级别参数。
  • 3. 变更副本数。
  • 4. 修改主题限速。
  • 5.主题分区迁移。
  • 6. 常见主题错误处理
    • 常见错误1:主题删除失败。
    • 常见错误2:__consumer_offsets占用太多的磁盘。

主题日常管理

所谓的日常管理,无非就是主题的增删改查。你可能会觉得,这有什么好讨论的,官网上不都有命令吗?这部分内容的确比较简单,但它是我们讨论后面内容的基础。而且,在讨论的过程中,我还会向你分享一些小技巧。另外,我们今天讨论的管理手段都是借助于Kafka自带的命令。事实上,在专栏后面,我们还会专门讨论如何使用Java API的方式来运维Kafka集群。

我们先来学习一下如何使用命令创建Kafka主题。Kafka提供了自带的kafka-topics脚本,用于帮助用户创建主题。该脚本文件位于Kafka安装目录的bin子目录下。如果你是在Windows上使用Kafka,那么该脚本位于bin路径的windows子目录下。一个典型的创建命令如下:
bin/kafka-topics.sh --bootstrap-server broker_host:port --create --topic my_topic_name --partitions 1 --replication-factor 1

create表明我们要创建主题,而partitions和replication factor分别设置了主题的分区数以及每个分区下的副本数。如果你之前使用过这个命令,你可能会感到奇怪:难道不是指定 –zookeeper参数吗?为什么现在变成 –bootstrap-server了呢?我来给出答案:从Kafka 2.2版本开始,社区推荐用 –bootstrap-server参数替换 –zookeeper参数,并且显式地将后者标记为“已过期”,因此,如果你已经在使用2.2版本了,那么创建主题请指定 –bootstrap-server参数。

社区推荐使用 –bootstrap-server而非 –zookeeper的原因主要有两个。

  1. 使用 –zookeeper会绕过Kafka的安全体系。这就是说,即使你为Kafka集群设置了安全认证,限制了主题的创建,如果你使用 –zookeeper的命令,依然能成功创建任意主题,不受认证体系的约束。这显然是Kafka集群的运维人员不希望看到的。
  2. 使用 –bootstrap-server与集群进行交互,越来越成为使用Kafka的标准姿势。换句话说,以后会有越来越少的命令和API需要与ZooKeeper进行连接。这样,我们只需要一套连接信息,就能与Kafka进行全方位的交互,不用像以前一样,必须同时维护ZooKeeper和Broker的连接信息。
    创建好主题之后,Kafka允许我们使用相同的脚本查询主题。你可以使用下面的命令,查询所有主题的列表。
    bin/kafka-topics.sh --bootstrap-server broker_host:port --list
    如果要查询单个主题的详细数据,你可以使用下面的命令。
bin/kafka-topics.sh --bootstrap-server broker_host:port --describe --topic <topic_name>

如果describe命令不指定具体的主题名称,那么Kafka默认会返回所有“可见”主题的详细数据给你。

这里的“可见”,是指发起这个命令的用户能够看到的Kafka主题。这和前面说到主题创建时,使用 –zookeeper和 –bootstrap-server的区别是一样的。如果指定了 –bootstrap-server,那么这条命令就会受到安全认证体系的约束,即对命令发起者进行权限验证,然后返回它能看到的主题。否则,如果指定 –zookeeper参数,那么默认会返回集群中所有的主题详细数据。基于这些原因,我建议你最好统一使用 –bootstrap-server连接参数。

说完了主题的“增”和“查”,我们说说如何“改”。Kafka中涉及到主题变更的地方有5处。

1. 修改主题分区。

其实就是增加分区,目前Kafka不允许减少某个主题的分区数。你可以使用kafka-topics脚本,结合 –alter参数来增加某个主题的分区数,命令如下:
bin/kafka-topics.sh --bootstrap-server broker_host:port --alter --topic <topic_name> --partitions <新分区数>
这里要注意的是,你指定的分区数一定要比原有分区数大,否则Kafka会抛出InvalidPartitionsException异常。

2. 修改主题级别参数。

在主题创建之后,我们可以使用kafka-configs脚本修改对应的参数。
这个用法我们在专栏第8讲中讨论过,现在先来复习一下。假设我们要设置主题级别参数max.message.bytes,那么命令如下:
bin/kafka-configs.sh --zookeeper zookeeper_host:port --entity-type topics --entity-name <topic_name> --alter --add-config max.message.bytes=10485760
也许你会觉得奇怪,为什么这个脚本就要指定 –zookeeper,而不是 –bootstrap-server呢?其实,这个脚本也能指定 –bootstrap-server参数,只是它是用来设置动态参数的。在专栏后面,我会详细介绍什么是动态参数,以及动态参数都有哪些。现在,你只需要了解设置常规的主题级别参数,还是使用 –zookeeper。

3. 变更副本数。

使用自带的kafka-reassign-partitions脚本,帮助我们增加主题的副本数。这里先留个悬念,稍后我会拿Kafka内部主题__consumer_offsets来演示如何增加主题副本数。

4. 修改主题限速。

这里主要是指设置Leader副本和Follower副本使用的带宽。有时候,我们想要让某个主题的副本在执行副本同步机制时,不要消耗过多的带宽。Kafka提供了这样的功能。我来举个例子。假设我有个主题,名为test,我想让该主题各个分区的Leader副本和Follower副本在处理副本同步时,不得占用超过100MBps的带宽。注意是大写B,即每秒不超过100MB。那么,我们应该怎么设置呢?

要达到这个目的,我们必须先设置Broker端参数leader.replication.throttled.rate和follower.replication.throttled.rate,命令如下:

bin/kafka-configs.sh --zookeeper zookeeper_host:port --alter --add-config 'leader.replication.throttled.rate=104857600,follower.replication.throttled.rate=104857600' --entity-type brokers --entity-name 0

这条命令结尾处的 –entity-name就是Broker ID。倘若该主题的副本分别在0、1、2、3多个Broker上,那么你还要依次为Broker 1、2、3执行这条命令。

设置好这个参数之后,我们还需要为该主题设置要限速的副本。在这个例子中,我们想要为所有副本都设置限速,因此统一使用通配符*来表示,命令如下:

bin/kafka-configs.sh --zookeeper zookeeper_host:port --alter --add-config 'leader.replication.throttled.replicas=*,follower.replication.throttled.replicas=*' --entity-type topics --entity-name test

5.主题分区迁移。

同样是使用kafka-reassign-partitions脚本,对主题各个分区的副本进行“手术”般的调整,比如把某些分区批量迁移到其他Broker上。这种变更比较复杂,我会在专栏后面专门和你分享如何做主题的分区迁移。
最后,我们来聊聊如何删除主题。命令很简单,我直接分享给你。
bin/kafka-topics.sh --bootstrap-server broker_host:port --delete --topic <topic_name>
删除主题的命令并不复杂,关键是删除操作是异步的,执行完这条命令不代表主题立即就被删除了。它仅仅是被标记成“已删除”状态而已。Kafka会在后台默默地开启主题删除操作。因此,通常情况下,你都需要耐心地等待一段时间。
特殊主题的管理与运维
说完了日常的主题管理操作,我们来聊聊Kafka内部主题consumer_offsets和transaction_state。前者你可能已经很熟悉了,后者是Kafka支持事务新引入的。如果在你的生产环境中,你看到很多带有consumer_offsets和transaction_state前缀的子目录,不用惊慌,这是正常的。这两个内部主题默认都有50个分区,因此,分区子目录会非常得多。
关于这两个内部主题,我的建议是不要手动创建或修改它们,还是让Kafka自动帮我们创建好了。不过这里有个比较隐晦的问题,那就是__consumer_offsets的副本数问题。

在Kafka 0.11之前,当Kafka自动创建该主题时,它会综合考虑当前运行的Broker台数和Broker端参数offsets.topic.replication.factor值,然后取两者的较小值作为该主题的副本数,但这就违背了用户设置offsets.topic.replication.factor的初衷。这正是很多用户感到困扰的地方:我的集群中有100台Broker,offsets.topic.replication.factor也设成了3,为什么我的__consumer_offsets主题只有1个副本?其实,这就是因为这个主题是在只有一台Broker启动时被创建的。

在0.11版本之后,社区修正了这个问题。也就是说,0.11之后,Kafka会严格遵守offsets.topic.replication.factor值。如果当前运行的Broker数量小于offsets.topic.replication.factor值,Kafka会创建主题失败,并显式抛出异常。

那么,如果该主题的副本值已经是1了,我们能否把它增加到3呢?当然可以。我们来看一下具体的方法。

第1步是创建一个json文件,显式提供50个分区对应的副本数。注意,replicas中的3台Broker排列顺序不同,目的是将Leader副本均匀地分散在Broker上。该文件具体格式如下:

{"version":1, "partitions":[{"topic":"__consumer_offsets","partition":0,"replicas":[0,1,2]}, {"topic":"__consumer_offsets","partition":1,"replicas":[0,2,1]},{"topic":"__consumer_offsets","partition":2,"replicas":[1,0,2]},{"topic":"__consumer_offsets","partition":3,"replicas":[1,2,0]},...{"topic":"__consumer_offsets","partition":49,"replicas":[0,1,2]}
]}`

第2步是执行kafka-reassign-partitions脚本,命令如下:

bin/kafka-reassign-partitions.sh --zookeeper zookeeper_host:port --reassignment-json-file reassign.json --execute

除了修改内部主题,我们可能还想查看这些内部主题的消息内容。特别是对于__consumer_offsets而言,由于它保存了消费者组的位移数据,有时候直接查看该主题消息是很方便的事情。下面的命令可以帮助我们直接查看消费者组提交的位移数据。

bin/kafka-console-consumer.sh --bootstrap-server kafka_host:port --topic __consumer_offsets --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --from-beginning

除了查看位移提交数据,我们还可以直接读取该主题消息,查看消费者组的状态信息。

bin/kafka-console-consumer.sh --bootstrap-server kafka_host:port --topic __consumer_offsets --formatter "kafka.coordinator.group.GroupMetadataManager\$GroupMetadataMessageFormatter" --from-beginning

对于内部主题__transaction_state而言,方法是相同的。你只需要指定kafka.coordinator.transaction.TransactionLog$TransactionLogMessageFormatter即可。

6. 常见主题错误处理

最后,我们来说说与主题相关的常见错误,以及相应的处理方法。

常见错误1:主题删除失败。

当运行完上面的删除命令后,很多人发现已删除主题的分区数据依然“躺在”硬盘上,没有被清除。这时该怎么办呢?

实际上,造成主题删除失败的原因有很多,最常见的原因有两个:副本所在的Broker宕机了;待删除主题的部分分区依然在执行迁移过程。

如果是因为前者,通常你重启对应的Broker之后,删除操作就能自动恢复;如果是因为后者,那就麻烦了,很可能两个操作会相互干扰。

不管什么原因,一旦你碰到主题无法删除的问题,可以采用这样的方法:
第1步,手动删除ZooKeeper节点/admin/delete_topics下以待删除主题为名的znode。

第2步,手动删除该主题在磁盘上的分区目录。

第3步,在ZooKeeper中执行rmr /controller,触发Controller重选举,刷新Controller缓存。
在执行最后一步时,你一定要谨慎,因为它可能造成大面积的分区Leader重选举。事实上,仅仅执行前两步也是可以的,只是Controller缓存中没有清空待删除主题罢了,也不影响使用。

常见错误2:__consumer_offsets占用太多的磁盘。

一旦你发现这个主题消耗了过多的磁盘空间,那么,你一定要显式地用jstack命令查看一下kafka-log-cleaner-thread前缀的线程状态。通常情况下,这都是因为该线程挂掉了,无法及时清理此内部主题。倘若真是这个原因导致的,那我们就只能重启相应的Broker了。另外,请你注意保留出错日志,因为这通常都是Bug导致的,最好提交到社区看一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Docker部署MySQLRedis容器与常见命令

目录 1. 检查WSL配置2. 设置WSL版本3. 拉取MySQL镜像4. 验证镜像5. 运行MySQL容器在WSL环境中使用以下命令启动MySQL容器查看容器/镜像的完整信息显式指定宿主机挂载路径可选&#xff1a;在Windows的cmd中使用以下命令启动MySQL容器 6. 管理容器启动已创建的容器查看运行中的容…

01__C++入门

一、C的语法框架 首先学习一门语言&#xff0c;我们需要了解语言的基本框架&#xff0c;这一小节&#xff0c;我们学习C的历史应用&#xff0c;c和c的区别和c的标准 二、认识C 1、C的历史 所有的主流C编译器都支持这个版本的C&#xff08;1998年的版本&#xff09;。 2、C的应…

2024 CKA题库+详尽解析| 15、备份还原Etcd

目录 免费获取题库配套 CKA_v1.31_模拟系统 15、 备份还原Etcd 题目&#xff1a; 开始操作: 1&#xff09;、切换集群 2&#xff09;、登录master并提权 3&#xff09;、备份Etcd现有数据 4&#xff09;、验证备份数据快照 5&#xff09;、查看节点和Pod状态 6&am…

Flotherm许可的并发用户数限制

在电子产品热设计领域&#xff0c;Flotherm软件以其卓越的性能和精确的仿真能力而受到广大用户的青睐。然而&#xff0c;在使用Flotherm软件时&#xff0c;了解其许可的并发用户数限制对于优化资源配置和提升工作效率至关重要。本文将详细介绍Flotherm软件许可的并发用户数限制…

读取宝塔方法,查找容别名存放位置

可以查到对应方法 根据参数名可知 查找到 得到位置

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…

git连接本地仓库以及gitee

参考:gitee创建新仓库并上传代码_gitee新建仓库导入代码-CSDN博客 git初始化以及添加git分支 在idea查看master主分支 报错 原因gitee推送更新失败问题记录&#xff1a;remote: error: hook declined to update refs/heads/master-CSDN博客 取消邮箱暴露

pocketflow库实现guardrail

目录 代码代码解释1. 系统架构2. 核心组件详解2.1 LLM调用函数2.2 UserInputNode&#xff08;用户输入节点&#xff09;2.3 GuardrailNode&#xff08;安全防护节点&#xff09;2.4 LLMNode&#xff08;LLM处理节点&#xff09; 3. 流程控制机制 示例运行 代码 from pocketflo…

Fetch API 使用详解:Bearer Token 与 localStorage 实践

Fetch API&#xff1a;现代浏览器内置的用于发送 HTTP 请求的 API&#xff0c;Bearer Token&#xff1a;一种基于令牌的身份验证方案&#xff0c;常用于 JWT 认证&#xff0c;localStorage&#xff1a;浏览器提供的持久化存储方案&#xff0c;用于在客户端存储数据。 token是我…

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…

驭码 CodeRider 2.0 产品体验:智能研发的革新之旅

驭码 CodeRider 2.0 产品体验&#xff1a;智能研发的革新之旅 在当今快速发展的软件开发领域&#xff0c;研发效率与质量始终是开发者和企业关注的核心。面对开发协作流程繁琐、代码生成补全不准、代码审核低效、知识协同困难以及部署成本与灵活性难以平衡等问题&#xff0c;…

NLP学习路线图(二十六):自注意力机制

一、为何需要你?序列建模的困境 在你出现之前,循环神经网络(RNN)及其变种LSTM、GRU是处理序列数据(如文本、语音、时间序列)的主流工具。它们按顺序逐个处理输入元素,将历史信息压缩在一个隐藏状态向量中传递。 瓶颈显现: 长程依赖遗忘: 随着序列增长,早期信息在传递…

【渲染】Unity-分析URP的延迟渲染-DeferredShading

我是一名资深游戏开发&#xff0c;小时候喜欢看十万个为什么 介绍 本文旨在搞清楚延迟渲染在unity下如何实现的&#xff0c;为自己写延迟渲染打一个基础&#xff0c;打开从知到行的大门延迟渲染 输出物体表面信息(rt1, rt2, rt3, …) 着色(rt1, rt2, rt3, …)研究完感觉核心…

华为OD机考- 简单的自动曝光/平均像素

import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…

java 乐观锁的实现和注意细节

文章目录 1. 前言乐观锁 vs. 悲观锁&#xff1a;基本概念对比使用场景及优势简述 2. 基于版本号的乐观锁实现代码示例注意事项 3. 基于CAS机制的乐观锁实现核心思想代码示例关键点说明 4. 框架中的乐观锁实践MyBatis中基于版本号的乐观锁实现示例代码 JPA&#xff08;Hibernate…

河北对口计算机高考C#笔记(2026高考适用)---持续更新~~~~

C#笔记 C#发展史 1998年,C#发布第一个版本。2002年,visual studio开发环境推出C#的特点 1.语法简洁,不允许直接操作内存,去掉了指针操作 2.彻底面向对象设计。 3.与Web紧密结合。 4.强大的安全机制,语法错误提示,引入垃圾回收器机制。 5.兼容性。 6.完善的错误,异常处理…

C# dll版本冲突解决方案

随着项目功能逐渐增加&#xff0c;引入三方库数量也会增多。不可避免遇到库的间接引用dll版本冲突&#xff0c;如System.Memory.dll、System.Buffer.dll等。编译会报警&#xff0c;运行可能偶发异常。 可使用ILMerge工具合并动态库&#xff0c;将一个库的多个dll合并为一个dll。…

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…

随机访问介质访问控制:网络中的“自由竞争”艺术

想象一场自由辩论赛——任何人随时可以发言&#xff0c;但可能多人同时开口导致混乱。这正是计算机网络中随机访问协议的核心挑战&#xff1a;如何让多个设备在共享信道中高效竞争&#xff1f;本文将深入解析五大随机访问技术及其智慧。 一、核心思想&#xff1a;自由竞争 冲突…

设计模式作业

package sdau;public class man {public static void main(String[] args) {show(new Cat()); // 以 Cat 对象调用 show 方法show(new Dog()); // 以 Dog 对象调用 show 方法Animal a new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eatCat c (Cat)a…