Kafka集群部署实战

服务背景

Apache Kafka作为分布式流处理平台,在金融交易系统、物联网数据处理、实时日志分析等场景中发挥关键作用。某电商平台日均处理订单消息1.2亿条,峰值QPS达5万,采用Kafka集群实现订单状态流转、用户行为追踪和库存同步等功能。以下是经过生产验证的集群部署方案及典型故障处理经验。

集群运维最佳实践


1. 容量规划建议

指标 推荐值 监控阈值
分区数量/Broker ≤4000 ≥3500 告警
副本同步延迟 <100ms >500ms 告警
磁盘使用率 ≤75% ≥85% 紧急处理
网络吞吐/Broker ≤70% 带宽 ≥85% 限流

Kafka 集群部署

单点部署 Kafka

  1. 下载 Kafka

[root@elk91 ~]# wget https://dlcdn.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgz
  1. 解压 Kafka

[root@elk91 ~]# tar xf kafka_2.13-3.9.0.tgz -C /usr/local/
  1. 修改 Kafka 配置文件

# Kafka 的唯一标识
broker.id=91 
# 修改数据目录
log.dirs=/var/lib/kafka
# 指定 Kafka 的元数据存储在 Zookeeper 集群的路径(znodes)
zookeeper.connect=10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181/oldboyedu-kafka-3.9.0
  1. 配置环境变量

[root@elk91 ~]# cat /etc/profile.d/kafka.sh
#!/bin/bash

export KAFKA_HOME=/usr/local/kafka_2.13-3.9.0
export PATH=$PATH:$KAFKA_HOME/bin
  1. 启动 Kafka

[root@elk91 ~]# source /etc/profile.d/kafka.sh
[root@elk91 ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 
  1. 验证 Kafka 是否启动成功

[root@elk91 ~]# ss -ntl | grep 9092
LISTEN 0      50                      *:9092             *:*          

集群部署 Kafka

  1. 拷贝 Kafka 数据到集群节点(92/93)

[root@elk91 ~]# scp -r /usr/local/kafka_2.13-3.9.0/ 10.0.0.92:/usr/local/
[root@elk91 ~]# scp -r /usr/local/kafka_2.13-3.9.0/ 10.0.0.93:/usr/local/
[root@elk91 ~]# scp /etc/profile.d/kafka.sh 10.0.0.92:/etc/profile.d/
[root@elk91 ~]# scp /etc/profile.d/kafka.sh 10.0.0.93:/etc/profile.d/
  1. 修改 92/93 节点的配置文件

[root@elk92 ~]# sed -i '/^broker.id/s#91#92#' /usr/local/kafka_2.13-3.9.0/config/server.properties 
[root@elk93 ~]# sed -i '/^broker.id/s#91#93#' /usr/local/kafka_2.13-3.9.0/config/server.properties
  1. 启动其他节点的 Kafka

[root@elk92 ~]# source /etc/profile.d/kafka.sh && kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 
[root@elk93 ~]# source /etc/profile.d/kafka.sh && kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 
  1. 验证 Zookeeper 集群数据是否写入成功

[root@elk91 ~]# echo "ls /oldboyedu-kafka-3.9.0" | nc 10.0.0.91 2181

常见问题及解决方案

问题一:未知主机异常

问题描述

在连接 Kafka 集群时,出现未知主机异常,日志显示:

复制

[2025-03-17 10:53:58,604] WARN [Controller id=91, targetBrokerId=93] Error connecting to node elk93:9092 (id: 93 rack: null) (org.apache.kafka.clients.NetworkClient)
java.net.UnknownHostException: elk93

问题分析

这是由于 Kafka 集群在连接时进行了反向解析,而主机名未正确解析。

解决方案

在 Kafka 配置文件中指定监听的 IP 地址:

listeners=PLAINTEXT://10.0.0.91:9092 

然后重启 Kafka 服务:

[root@elk91 ~]# kafka-server-stop.sh 
[root@elk91 ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 

问题二:Topic 命令执行超时

问题描述

执行 Kafka Topic 命令时,出现超时错误:

Error while executing topic command : Timed out waiting for a node assignment. Call: listTopics

问题分析

这可能是由于 Kafka 集群节点间网络通信不畅或配置错误导致的。

解决方案

  1. 检查 Kafka 集群节点间的网络连通性,确保各节点间可以正常通信。

  2. 确保 Kafka 配置文件中的 zookeeper.connect 配置正确,能够连接到 Zookeeper 集群。

  3. 检查 Kafka 服务是否正常运行,各节点的监听地址和端口是否正确。

Kafka 常用脚本管理

Topic 管理

  1. 查看现有的 Topics 列表

[root@elk91 ~]# kafka-topics.sh --bootstrap-server 10.0.0.91:9092,10.0.0.92:9092,10.0.0.93:9092 --list
  1. 创建指定分区副本的 Topic

[root@elk91 ~]# kafka-topics.sh --bootstrap-server 10.0.0.91:9092,10.0.0.92:9092,10.0.0.93:9092 --create --partitions 2 --replication-factor 3 --topic tml666
  1. 查看分区的详细信息

[root@elk91 ~]# kafka-topics.sh --bootstrap-server 10.0.0.91:9092,10.0.0.92:9092,10.0.0.93:9092 --topic tml666 --describe
  1. 修改分区数

[root@elk91 ~]# kafka-topics.sh --bootstrap-server 10.0.0.91:9092,10.0.0.92:9092,10.0.0.93:9092 --alter --partitions 5 --topic tml666
  1. 删除 Topic

[root@elk91 ~]# kafka-topics.sh --bootstrap-server 10.0.0.91:9092,10.0.0.92:9092,10.0.0.93:9092 --delete --topic tml666

Producer 脚本

  1. 创建生产者程序

[root@elk91 ~]# kafka-console-producer.sh --bootstrap-server 10.0.0.92:9092 --topic producer-001
  1. 查看现有的 Topics 列表

[root@elk92 ~]# kafka-topics.sh --bootstrap-server 10.0.0.92:9092 --list

Consumer 脚本

  1. 创建消费者程序

[root@elk93 ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.91:9092 --topic producer-001
  1. 从最老的 offset 获取数据

[root@elk93 ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.91:9092 --topic producer-001 --from-beginning

Consumer Group 脚本

  1. 创建 Topic

[root@elk92 ~]# kafka-topics.sh --bootstrap-server 10.0.0.92:9092 --create --topic consumer-grop001 --partitions 3 --replication-factor 1 
  1. 创建生产者写入数据

[root@elk93 ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.91:9092 --topic consumer-grop001 --consumer-property  group.id=xixi --from-beginning
  1. 查看消费者组的详细信息

[root@elk91 ~]# kafka-consumer-groups.sh --bootstrap-server 10.0.0.92:9092 --group xixi --describe ;echo

总结

Kafka 作为一种高性能的分布式消息队列系统,在企业中有着广泛的应用。通过合理的配置和管理,可以有效地利用 Kafka 的特性,满足企业对大规模数据流处理的需求。在部署和使用 Kafka 集群时,需要注意网络配置、主机名解析等问题,以确保集群的稳定运行。

你可能感兴趣的:(技术博文分享,kafka,分布式)