ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Kafka 3.6.1 安装部署与集群实战:命令行操作及可视化工具详解

Kafka 3.6.1 安装部署与集群实战:命令行操作及可视化工具详解 搞Kafka这个事说难不难说简单也真有不少坑。如果你是刚接触消息队列或者已经很熟练但想确认一下集群部署的细节这篇关于Kafka 3.6.1 安装部署、集群启动、命令行操作与 Kafka Tool 可视化工具的实战记录应该对你有帮助。消息队列在现代后端架构里的位置太重要了特别是Kafka在日志收集、用户行为追踪、流量削峰、事件驱动架构这些场景里几乎成了标配。很多公司用 Kafka 不只是做个简单的消息中转而是把它当作整个数据流转的主动脉所以部署一套稳定、可控的 Kafka 环境是后续开发调试的数据基础。这篇文章会从零开始详细演示如何部署 Kafka 3.6.1 单机与集群、启动多个 broker、用命令行做生产消费验证以及用 Kafka Tool现在叫 Offset Explorer来直观管理集群。无论你是学生、测试人员还是刚开始搞后端开发的工程师按着这套流程走一遍基本就能把 Kafka 的整体运作逻辑摸清了。1. 环境准备与版本选型1.1 环境要求与版本选择我这套实操环境用的是 CentOS 7.9 虚拟机内存分配了 4GBCPU 给了 4 核。这个配置跑单机 Kafka 完全够用如果要做集群测试建议单台虚拟机的内存不要低于 2GB不然三个 broker 进程加上 ZooKeeper 会把内存吃得很紧。版本选型上我使用的 Kafka 版本是3.6.1。这个版本在当前阶段兼具稳定性和功能完整性。需要特别说明的是从 Kafka 3.5 开始Kafka 社区已经将KRaft 模式Kafka Raft Metadata Mode标记为生产可用不再强制依赖 ZooKeeper。不过考虑到大多数存量老系统、网上资料和团队既有经验都还是围绕 ZooKeeper 架构而且 ZooKeeper 模式在排查问题时有更成熟的方案可参考所以本文和大多数生产环境一样采用 ZooKeeper 模式进行部署。如果你的业务是全新搭建且团队对 KRaft 有足够了解也可以考虑使用 KRaft但刚入门的话还是建议先从 ZooKeeper 模式熟悉整体机制。依赖的 Java 环境方面Kafka 3.6.1 需要JDK 8 及以上官方推荐 JDK 11 或 JDK 17。我这里用的是 JDK 1.8jdk8u411实测跑起来没有任何问题但如果追求更好的 GC 表现和性能JDK 11 是更好的选择。1.2 基础软件准备在正式安装 Kafka 之前先把基础依赖清理干净。需要确认 Java 环境是否就绪检查方式很简单java -version输出类似下面这样就说明 Java 已安装openjdk version 1.8.0_411 OpenJDK Runtime Environment (build 1.8.0_411-1) OpenJDK 64-Bit Server VM (build 25.411-b06, mixed mode)如果连 Java 都没有CentOS 上可以用下面的命令安装 OpenJDK 8yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64还需要确认/etc/hosts的配置尤其是在虚拟机环境里。hosts 文件配置不好会引发很多诡异的网络问题比如 broker 启动成功但客户端连不上。我的 hosts 配置如下cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.56.11 kafka01把虚拟机 IP 和主机名映射加上集群部署时每个节点都需要这样配置。这一步最好提前做掉不然后面改 broker 的 advertised.listeners 会是个麻烦。还要检查防火墙和 SELinux。如果是自己的测试环境建议直接关闭# 检查防火墙状态 systemctl status firewalld # 关闭防火墙测试环境推荐 systemctl stop firewalld systemctl disable firewalld # 临时禁用 SELinux setenforce 0生产环境当然不能这么干但如果你是本地做实验这一步可以省掉很多连接问题。2. Kafka 3.6.1 安装部署二进制包方式2.1 下载与解压Kafka 官方不提供编译好的 rpm 或 deb 包最通用的方式是使用二进制压缩包。下载地址就是 Apache Kafka 官网在 Download 页面找到kafka_2.13-3.6.1.tgz这个文件。这里2.13是 Scala 编译版本Kafka 本身由 Java 和 Scala 混合编写但运行时不关心 Scala 版本你只需要下载 tar 包解压就能用。我用wget下载并解压到/opt/kafka目录cd /opt wget https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar -zxvf kafka_2.13-3.6.1.tgz ln -s /opt/kafka_2.13-3.6.1 /opt/kafka创建软链接kafka指向实际目录是为了方便后续升级版本和环境变量配置。解压完成后看下目录结构ls -lh /opt/kafka重点关注的目录是bin里面有启动脚本、config所有配置文件、libs依赖 jar 包。bin目录下有.sh脚本对应 Windows 版还有.bat脚本。2.2 核心配置文件详解Kafka 的大部分核心配置都在config/server.properties里。这个文件很长但需要真正理解的参数其实没几个。我先把关键配置项过一遍。broker.id当前 broker 在集群中的唯一标识必须整型且集群内唯一。单机部署时保持默认的0即可集群部署时每个节点的 broker.id 不能重复。listeners与advertised.listeners这两个参数玩 Kafka 的人最容易搞混也是坑最多的地方。listeners定义 broker 启动时绑定的地址和端口也就是 broker 真正监听的 socket。advertised.listeners是 broker 注册到 ZooKeeper、告诉客户端和其他 broker 你可以通过这个地址访问我 的地址。如果是单机部署且客户端也在同一台机器上listenersPLAINTEXT://localhost:9092就行。但如果客户端要从其他机器连接就必须把advertised.listeners设置为当前机器的局域网 IP写成PLAINTEXT://192.168.56.11:9092。很多生产环境问题都是这里配错导致的——broker 进程起来了9092端口也监听着但客户端就是连接超时。log.dirsKafka 消息数据的存储目录注意是目录不是单个文件。我习惯把日志和程序分开数据目录和 Kafka 在系统盘的分区互相不影响这样即使系统盘故障或者/opt目录空间不足也不会直接丢数据。zookeeper.connectZooKeeper 连接地址格式是host:port。单机就是localhost:2181集群就是多个地址用逗号分隔。num.partitions新建 topic 时默认的分区数默认 1。我建议测试环境改成 3因为分区数太少没法体会到 Kafka 分区并行的优势。生产环境需要根据业务量计算这个后面再聊。offsets.topic.replication.factor消费组偏移量offset存储主题的副本因子。这里必须设为大于等于 2否则集群环境下如果某个 broker 宕机可能会丢失消费位点信息。测试环境可以保持默认的 1但生产环境一定要调整。log.retention.hours消息保留时长默认 168 小时即 7 天。根据业务需求调整我见过很多团队把这个改成 72 或 24。打开配置文件直接修改vim /opt/kafka/config/server.properties核心修改后如下broker.id0 listenersPLAINTEXT://192.168.56.11:9092 advertised.listenersPLAINTEXT://192.168.56.11:9092 num.network.threads3 num.io.threads8 socket.send.buffer.bytes102400 socket.receive.buffer.bytes102400 socket.request.max.bytes104857600 log.dirs/data/kafka-logs num.partitions3 num.recovery.threads.per.data.dir1 offsets.topic.replication.factor1 transaction.state.log.replication.factor1 transaction.state.log.min.isr1 log.retention.hours168 log.segment.bytes1073741824 log.retention.check.interval.ms300000 zookeeper.connect192.168.56.11:2181 zookeeper.connection.timeout.ms18000 group.initial.rebalance.delay.ms0先创建数据目录mkdir -p /data/kafka-logs注意log.dirs指向的目录必须手动创建Kafka 不会自动创建不存在的目录这个细节容易忽略。2.3 启动 ZooKeeper 与单节点验证Kafka 自带的单节点 ZooKeeper 可以直接启动但它主要是给开发和测试用的生产环境一般用独立 ZooKeeper 集群。我先把自带的 ZooKeeper 启动起来/opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties加了-daemon参数后ZooKeeper 在后台运行日志默认打到当前终端通过 nohup 方式输出到nohup.out。如果想指定日志输出位置可以手动指定日志路径nohup /opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties /data/logs/zk.log 21 启动完成后检查 2181 端口是否监听ss -lntp | grep 2181看到LISTEN状态说明 ZooKeeper 起来了。再用自带的客户端验证一下/opt/kafka/bin/zookeeper-shell.sh 192.168.56.11:2181 ls /输出[zookeeper]就正常。ZooKeeper 稳定运行后启动 Kafka 主进程/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties注意看控制台或日志文件有没有报错。启动后确认 9092 端口ss -lntp | grep 9092然后看 broker 是否注册到了 ZooKeeper/opt/kafka/bin/zookeeper-shell.sh 192.168.56.11:2181 ls /brokers/ids正常情况下应该输出[0]0就是刚才配置的 broker.id。到这里单机 Kafka 已经跑起来了。3. Kafka 集群启动实战3.1 集群规划与配置文件准备单机跑通只能算热身接下来搭建一个真正的集群环境。我在三台虚拟机上部署三个 broker组成一个三节点集群。同样的配置参数每个节点的broker.id不同其他设置几乎一致。集群节点规划如下节点IPbroker.id说明kafka01192.168.56.110第一台ZooKeeper Kafkakafka02192.168.56.121第二台Kafkakafka03192.168.56.132第三台KafkaZooKeeper 我单独在一台机器kafka01上跑。测试环境一个 ZooKeeper 够了但生产环境至少搭 3 个节点的 ZooKeeper 集群。每一台机器的/etc/hosts都加上三台机器的映射192.168.56.11 kafka01 192.168.56.12 kafka02 192.168.56.13 kafka03在 kafka02 和 kafka03 上重复 2.1 节的解压步骤然后修改各自的server.properties。以 kafka02 为例broker.id1 listenersPLAINTEXT://192.168.56.12:9092 advertised.listenersPLAINTEXT://192.168.56.12:9092 log.dirs/data/kafka-logs zookeeper.connect192.168.56.11:2181注意 kafka02 和 kafka03 的broker.id分别是 1 和 2listeners和advertised.listeners也要对应改成自己的 IP。3.2 集群启动顺序与验证集群启动顺序有一定讲究。我的习惯是先启动 ZooKeeper然后依次启动 kafka01、kafka02、kafka03。启动 ZooKeeper/opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties依次启动三个 broker# kafka01 /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties # kafka02 /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties # kafka03 /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties启动完成后通过 ZooKeeper 查看集群中注册的 broker 数量/opt/kafka/bin/zookeeper-shell.sh 192.168.56.11:2181 ls /brokers/ids输出[0, 1, 2]说明三个 broker 都成功注册了集群状态正常。也可以用一个 Kafka 自带命令查看 broker 详情/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server 192.168.56.11:9092这个命令会返回当前集群所有 broker 的 API 版本信息能看到节点列表说明集群通信正常。3.3 集群高可用验证集群起来之后最好亲自验证一下故障转移failover能力。创建一个测试 topic指定 3 个分区、2 个副本/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --create --topic cluster-test --partitions 3 --replication-factor 2查看 topic 的副本分布情况/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --describe --topic cluster-test输出中Replicas和Isr会显示每个分区分布在哪些 broker 上。ISR 是 in-sync replicas即处于同步状态的副本Kafka 在写入时会优先保证 ISR 中的副本同步。然后手动把 kafka03 的进程停掉模拟宕机# 在 kafka03 上执行 ps -ef | grep kafka | grep -v grep | awk {print $2} | xargs kill -9再执行 describe 命令你会发现 kafka03 上的分区 leader 已经自动切换到了其他 brokerISR 列表也更新了。这就是 Kafka 高可用的核心机制数据多副本 leader 选举。有一个典型案例可以加深理解——某次生产集群中一台物理机硬件告警运维强制断电后Kafka 集群在几十秒内完成了 leader 切换业务侧只出现了一小段延迟没有丢消息。这就是设计良好的基础架构该有的表现。4. 命令行操作全攻略4.1 topic 管理创建、查询、删除与增删分区Kafka 命令行客户端在bin目录下最核心的是kafka-topics.sh和kafka-console-producer.sh、kafka-console-consumer.sh。先创建一个带分区的 topic。这里的--bootstrap-server参数指定的是 broker 地址而不是 ZooKeeper 地址这是新版 Kafka 的用法。旧版用--zookeeper参数从 Kafka 2.2 开始逐步迁移到--bootstrap-server3.x 已经彻底移除--zookeeper参数。创建一个名为orders的 topic3 分区 2 副本/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --create \ --topic orders --partitions 3 --replication-factor 2参数说明--partitions 3topic 分 3 个分区这是 Kafka 并行度的基础。--replication-factor 2每个分区保留 2 份副本。集群至少要有 2 个 broker 才能创建成功如果集群只有 1 个节点副本因子只能设 1。查看集群已有 topic 列表/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --list查看某个 topic 的详细信息/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --describe --topic orders输出内容大致如下Topic: orders TopicId: XxYyZz PartitionCount: 3 ReplicationFactor: 2 Topic: orders Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0,1 Topic: orders Partition: 1 Leader: 1 Replicas: 1,2 Isr: 1,2 Topic: orders Partition: 2 Leader: 2 Replicas: 2,0 Isr: 2,0每行的Leader是当前分区的 leader broker 编号Replicas是复本分布Isr是仍在同步状态的副本集合。如果Isr中的数量长期小于Replicas的数量说明有副本同步滞后或 broker 宕机。删除 topic 有两个层面。如果你想彻底删除/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --delete --topic orders注意server.properties里有个delete.topic.enable参数默认在 3.x 版本中已经为true删除操作才真正生效。如果显示成功但列表里还在检查这个参数。修改分区数可以执行/opt/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.56.11:9092 --alter --topic orders --partitions 6但这里有个关键限制——只能增加分区不能减少分区。分区一旦增加会自动触发一次数据重分布期间会有重新均衡的流量。要压缩分区数量唯一的办法是删除重建 topic但那意味着数据全丢。所以创建 topic 时分区数量要想好宁可多设一些。4.2 生产与消费消息基础命令与运行模式生产消息用的是kafka-console-producer.sh消费消息用kafka-console-consumer.sh。这两个命令是初学者最容易好奇的比如有热搜词问“Kafka 生产消费命令启动一次会一直运行吗”——答案是会。默认情况下producer 和 consumer 都是长驻进程。producer 启动后等待你从键盘输入每按一次回车就发送一条消息consumer 启动后进入监听状态持续等待新消息到达。这不是命令卡住了而是正常的运行模式。先开一个终端启动消费者再开另一个终端启动生产者。生产者/opt/kafka/bin/kafka-console-producer.sh --bootstrap-server 192.168.56.11:9092 --topic orders启动后光标停在输入状态手动输入1001,下单,上海 1002,支付,北京每条内容按回车发送。输入后不会立刻有输出反馈这正常。消费者终端执行/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.11:9092 --topic orders --from-beginning--from-beginning参数表示从头开始读取该 topic 的所有历史消息。只跟--topic不加--from-beginning时只消费启动之后新到的消息。刚启动消费者时它会立即消费掉 producer 发来的消息所以你会在消费者终端看到1001,下单,上海 1002,支付,北京这里控制台消费默认没有指定消费组每次启动都会生成一个全新的随机 group id。如果指定了消费组偏移量会被记录重启后不会重复消费。生产者和消费者默认都不是立即退出需要按Ctrl C手动终止。如果你只想快速测试一下生产消费通道是否通畅可以用echo管道给 producer 发送单条消息echo hello-kafka | /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server 192.168.56.11:9092 --topic orders注意topic 不存在时producer 默认不会自动创建 topic除非在server.properties里把auto.create.topics.enable设为true默认就是 true。生产环境我建议关掉这个开关避免因拼写错误而静默创建大量没人消费的 topic。4.3 消费组管理与偏移量排查Kafka 的消息消费是以消费组为单位进行的。同一消费组内一个分区最多被组内一个消费者实例消费不同消费组之间互不影响。这个模型是 Kafka 实现广播和单播的核心机制。创建一个消费组来演示。消费者命令里加上--group参数/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.11:9092 --topic orders --group group-test --from-beginning然后查看消费组列表/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.11:9092 --list输出里能看到group-test。查看这个消费组的详细消费进度/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.11:9092 --describe --group group-test输出格式大致是GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID group-test orders 0 2 2 0 ... group-test orders 1 0 0 0 ... group-test orders 2 0 0 0 ...核心字段说明CURRENT-OFFSET当前消费组已经消费到的位置。LOG-END-OFFSET该分区的最新消息位置。LAG两者差值表示积压了多少条消息没消费。当LAG 0且持续增长时说明消费者处理速度跟不上生产速度这就是消息积压。排查LAG偏高的问题通常从几个方向入手消费者线程数是否小于分区数、消费逻辑里是否有耗时的网络调用或 DB 操作、消费者是否频繁 rebalance 导致停顿。5. Kafka ToolOffset Explorer可视化工具使用5.1 Kafka Tool 简介与安装方式Kafka Tool 是业界比较老牌的可视化客户端后来改名为 Offset Explorer。它基于 Java Swing 开发支持 Windows、macOS、Linux 三大平台可以从官方 GitHub Releases 页面下载。虽然是 GUI 工具但它只是作为客户端连接 Kafka不依赖被连接服务器上的任何界面环境。下载后解压即用。Linux 环境下解压后运行目录中的kafkatool.shWindows 环境下运行kafkatool.exe。第一次启动时会要求选择安装目录然后进入主界面。这个工具需要 JDK 8 以上环境提前装好 Java 即可。5.2 创建集群连接与基础配置打开 Kafka Tool在左侧 Cluster 面板右键选择 Add Cluster名称可以随便填比如prod-kafka。关键是 Cluster Configuration 选项卡里的配置在Kafka Cluster / ZooKeeper标签页填写Bootstrap地址即192.168.56.11:9092,192.168.56.12:9092,192.168.56.13:9092用逗号分隔。ZooKeeper 一栏可以留空因为新版 Kafka 连接客户端主要通过 Bootstrap Server 发现集群元数据。在Advanced标签页可以设置 SASL 认证、SSL 等安全参数。如果是裸连测试环境不需要额外配置。点击 Test Connection看到成功提示后保存。保存后在集群名上右键 Connect连接后左侧树形列表会展开显示所有 topic、消费者组、broker 节点信息。点开任意 topic可以看到它的分区数量、副本分布、Leader 节点、消息大小等元数据。这在快速排查某个 topic 为什么在哪个 broker 上这类问题时非常直观。5.3 日常运维与消息查看技巧Kafka Tool 最常用的功能之一是查看消息内容。在左侧选中一个 topic右侧会显示分区列表和消息列表。点开某个分区点击工具栏的View Data按钮可以选择从最新还是从头读取消息。注意事项消息查看默认以二进制形式显示稍微长一点的 JSON 数据看起来不友好。在 View Data 窗口里可以切换消息格式如果生产的消息是字符串直接在显示设置里选 String 类型即可可读性更好。这个工具本身不解析 Protobuf 等序列化格式对这类二进制消息只能展示原始字节。Kafka Tool 的另一个高频用途是查看消费组偏移量。在 Consumer Groups 栏里选中某个消费组右侧直接显示每个分区的当前 offset、log end offset 和 lag。这个比命令行可读性好太多适合不熟悉命令行操作的同事使用。不过我也要提醒一下工具可以在界面上直接修改 offset这个操作要格外小心。调整 offset 等于人为干预消费进度一旦把 offset 往前调消费者会重新消费大量历史消息往后调则可能跳过未消费的数据。在测试环境随便玩没关系生产环境没有经过团队确认绝对不要乱动。6. 常见问题与排查技巧实录6.1 启动失败类问题启动失败的问题主要集中在几个地方。问题现象 1broker启动后几秒就退出了。这种情况通常要看日志。logs/server.log里有详细的错误原因。常见的原因是log.dirs目录不存在或者没有写入权限mkdir -p /data/kafka-logs chown -R $(whoami) /data/kafka-logs另一个高频原因是zookeeper.connect地址配错了broker 连不上 ZooKeeper 启动确认时会失败。问题现象 2broker.id冲突。如果复制了另一台机器的server.properties忘记改broker.id集群中会出现两个 broker 争抢同一个 ID后启动的 broker 启动时汇报错kafka.common.InconsistentClusterIdException或者报另一个节点已存在相同 broker id需要检查配置。问题现象 3listeners配置了localhost导致外部无法连接。这是新手最容易踩的坑。如果将listeners和advertised.listeners都设为localhost:9092你本机测试没问题但其他机器上的客户端会拿localhost:9092去连接结果连到自己身上。解决方法是把advertised.listeners设成机器的局域网 IP并让客户端通过同一个 IP 访问。6.2 生产与消费异常问题现象 4消费者查不到消息但生产者没报错。先确认是不是--from-beginning没加。默认情况下消费者只读取启动后新产生的消息如果 producer 在 consumer 启动之前发了消息后来再启动的 consumer 自然看不到历史数据。测试时建议消费者带--from-beginning参数。问题现象 5生产者报TimeoutException。这个异常信息常见于老版本新版本会提示org.apache.kafka.common.errors.TimeoutException: Topic xxx not present in metadata after 60000 ms.说明 broker 没有成功创建 topic。检查auto.create.topics.enable是否关闭了或者手动用kafka-topics.sh先创建 topic。另外注意副本因子不能大于 broker 数量否则也会一直等待。问题现象 6报LEADER_NOT_AVAILABLE。创建 topic 后立刻生产消息偶尔会出现这个异常原因是 Kafka 分区 leader 选举还没有完全完成。过几秒重试即可不是严重故障。6.3 性能与稳定性排查问题现象 7消息延迟高LAG一直涨不降。先从消费端入手看消费者是否发生了频繁 rebalance。消费者组内新增或移除消费者、心跳超时都可能导致 rebalance每次 rebalance 期间该分区的消费都会暂停。可以检查消费者会话超时配置适当调大heartbeat.interval.ms和session.timeout.ms。另外确认消费者线程数与分区数的关系。Kafka 的并行消费能力受分区数限制如果分区数只有 3消费者开 10 个线程也没用前 3 个线程各领一个分区剩下 7 个空闲。想提高消费并行度要么增加 topic 分区数要么拆分 topic。问题现象 8磁盘空间不停增长消息保留失效。很多团队会把log.retention.hours调小但发现磁盘还是被占满了。注意log.retention.hours是按消息在 segment 文件中的时间戳来判断的由于 Kafka 日志段文件是顺序写入的一个很大的段文件在窗口期内会一直保留。如果想尽快释放空间可以主动执行日志裁切命令/opt/kafka/bin/kafka-log-dirs.sh --bootstrap-server 192.168.56.11:9092 --describe --topic-list orders另外可以调整log.segment.bytes和log.retention.check.interval.ms来控制检查频率。如果业务允许也可以用log.retention.ms精确到毫秒级别判断。问题现象 9连接时提示Connection refused但9092端口确实在监听。如果 broker 本身监听的端口是9092客户端也连不上优先查防火墙和 SELinux。测试环境直接关闭生产环境需要在防火墙放行 9092 端口并允许来自指定网段的请求。6.4 独家避坑技巧部署和运维 Kafka 一段时间后我总结出几个不常写在官方文档里的经验第一个是不要手工修改__consumer_offsets特殊主题。这个主题是 Kafka 内部保存消费组位移用的分区数量由offsets.topic.num.partitions决定默认 50 个分区。很多新手看到一堆带下划线的 topic 以为是垃圾数据就删掉了后果是整个集群的消费组位移全部丢失消费进度全部重置增量消息会被重复消费。这个坑特别隐蔽。第二个是生产环境强烈建议开启auto.offset.reset为latest或根据业务设计为earliest。消费者代码里这个参数决定了没有初始 offset 时的行为。如果消费者逻辑是先读数据库再更新 offset 的场景误设成earliest可能导致启动后大量消息堆积处理。这些参数选择都要围绕业务语义来定。第三个是监控磁盘 inode 使用率。Kafka 的 topic 和分区会创建大量小目录和文件如果 inode 耗尽即使df -h显示磁盘剩余空间充足broker 也会因为无法创建新文件而报No space left on device。用df -i查看 inode 使用率发现接近 90% 就要注意了。第四个是谨慎使用kafka-server-stop.sh脚本强制停集群。这个脚本默认会把机器上所有 Kafka 相关进程都 kill 掉如果一台机器上跑着 broker 和 ZooKeeper可能一起被停掉。建议一步步手动 kill broker 进程确认优雅退出后再操作其他服务。7. 从单机到集群再到生产环境的扩展思考到这里Kafka 3.6.1 的安装部署、集群启动、命令行操作和可视化工具使用已经完整走通了一遍。整个过程覆盖了从环境准备到故障排查的多个环节任何一步踩坑都会影响后续使用。我在实际部署中体会最深的一点是配置文件里的每一个参数背后都有实际场景在支撑不是随便填的。advertised.listeners决定了客户端能否连通log.dirs决定了数据存储的可靠性offsets.topic.replication.factor决定了消费位点的安全性。理解了每个参数的含义和上下游依赖遇到问题才能快速定位。最后再分享一个小技巧部署完 Kafka 后我习惯在第一台机器上写一份简单的部署记录包含所有修改过的配置项、启动命令、数据目录、日志目录和常用排查命令下次遇到相同的部署任务或集群故障直接翻这份记录就能省掉大量试错时间。搞基础架构就是这样前期的细致工作会在后面的维护中加倍回报。
返回列表