
在大数据、实时日志采集、用户行为分析、流处理等场景中,Apache Kafka 已成为核心消息引擎。A5数据的目标是在 CentOS 7.9 环境下搭建一个 高性能、可扩展、稳定可靠 的 Kafka 集群,具备以下能力:
- 支持单集群 百万级消息吞吐
- 平均消息延迟 < 10ms
- 持久化可靠,单节点故障可恢复
1. 环境规划 & 硬件规格建议
1.1 香港服务器www.a5idc.com集群硬件规格(单机)
| 组件 | 型号/规格 | 说明 |
|---|---|---|
| CPU | Intel Xeon Silver 4216 | 16 核 / 32 线程 |
| 内存 | 64 GB ECC | JVM Heap 24--28GB |
| 本地磁盘 | 4 × 2TB NVMe SSD(RAID0) | 高 I/O 吞吐 |
| 网络 | 25 Gbps RDMA 或 10 Gbps | 高速网络 |
| 操作系统 | CentOS Linux 7.9 x86_64 | 稳定企业级内核 |
注:Kafka 对 I/O 和网络非常敏感。本地 SSD + 高带宽网络是性能关键。
2. 系统与内核优化
2.1 关闭 SELinux & Swap(生产建议)
bash
# 关闭 SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 关闭 swap
swapoff -a
sed -i '/swap/d' /etc/fstab
2.2 调整内核参数(/etc/sysctl.conf)
bash
cat >> /etc/sysctl.conf << 'EOF'
# 文件句柄
fs.file-max = 2097152
# 网络连接优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 禁用 IPv6(如不使用)
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sysctl -p
2.3 ulimit 限制提升
bash
cat >> /etc/security/limits.conf << 'EOF'
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65536
* hard nproc 65536
EOF
3. 安装 Java & ZooKeeper
Kafka 建议使用 OpenJDK 11+。
bash
yum install -y java-11-openjdk-devel
java -version
3.1 ZooKeeper 安装部署
Kafka 需配合 ZooKeeper 管理集群元数据:
bash
# 创建 ZooKeeper 用户
useradd zookeeper
mkdir -p /opt/zookeeper
cd /opt/zookeeper
# 下载 ZooKeeper
wget https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
tar -xzvf apache-zookeeper-3.7.1-bin.tar.gz
# 配置
cp conf/zoo_sample.cfg conf/zoo.cfg
sed -i 's/dataDir=\/tmp\/zookeeper/dataDir=\/var\/lib\/zookeeper/' conf/zoo.cfg
3.2 ZooKeeper Systemd 服务文件
ini
# /etc/systemd/system/zookeeper.service
[Unit]
Description=ZooKeeper Service
After=network.target
[Service]
Type=simple
User=zookeeper
ExecStart=/opt/zookeeper/apache-zookeeper-3.7.1-bin/bin/zkServer.sh start-foreground
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
bash
systemctl daemon-reload
systemctl enable --now zookeeper
3.3 集群模式
如果是三节点或五节点 ZooKeeper 集群,需配置:
bash
# 每台机器
echo "server.1=zk1:2888:3888" >> conf/zoo.cfg
echo "server.2=zk2:2888:3888" >> conf/zoo.cfg
echo "server.3=zk3:2888:3888" >> conf/zoo.cfg
并在 dataDir 中写入 myid 文件。
4. Kafka 安装与配置
4.1 下载 Kafka
bash
mkdir -p /opt/kafka
cd /opt/kafka
wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz
tar -xzvf kafka_2.13-3.4.0.tgz
4.2 Kafka Broker 配置(server.properties)
关键配置如下:
properties
broker.id=1
# ZooKeeper
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
# 日志存储路径
log.dirs=/data/kafka-logs
# 网络
listeners=PLAINTEXT://0.0.0.0:9092
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
# 副本和分区
num.partitions=16
default.replication.factor=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
# 日志刷新与保留策略
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
4.3 JVM 调优
Kafka 对 JVM 依赖强烈,推荐配置:
bash
# 编辑 kafka-env.sh
export KAFKA_HEAP_OPTS="-Xms24G -Xmx24G"
export KAFKA_GC_LOG_OPTS="-verbose:gc -Xloggc:/var/log/kafka/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC"
5. 启动服务
创建 Systemd 服务文件:
ini
# /etc/systemd/system/kafka.service
[Unit]
Description=Apache Kafka
After=network.target
[Service]
User=kafka
ExecStart=/opt/kafka/kafka_2.13-3.4.0/bin/kafka-server-start.sh /opt/kafka/kafka_2.13-3.4.0/config/server.properties
ExecStop=/opt/kafka/kafka_2.13-3.4.0/bin/kafka-server-stop.sh
Restart=on-failure
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
启动:
bash
systemctl daemon-reload
systemctl enable --now kafka
6. 监控与告警
推荐结合 Prometheus + Grafana + JMX Exporter
6.1 启用 JMX Exporter
bash
# 下载 jmx_prometheus_javaagent.jar
# 修改 Kafka 启动脚本增加 Java Agent
export KAFKA_JMX_OPTS="-javaagent:/opt/metrics/jmx_prometheus_javaagent.jar=7071:/opt/metrics/kafka.yml"
6.2 Grafana Dashboard 指标示例
| 指标 | 说明 |
|---|---|
| kafka_server_BrokerTopicMetrics_MessagesInPerSec | 每秒消息输入 |
| kafka_network_RequestQueueTimeMs | 网络处理延迟 |
| kafka_log_LogFlushRateAndTimeMs | 日志刷盘性能 |
| kafka_controller_KafkaController_ActiveControllerCount | Controller 状态 |
7. Topic 与生产者/消费者实践
7.1 创建 Topic
bash
kafka-topics.sh \
--create \
--bootstrap-server localhost:9092 \
--replication-factor 3 \
--partitions 32 \
--topic app-events
7.2 生产/消费 CLI 示例
bash
kafka-console-producer.sh --topic app-events --broker-list localhost:9092
kafka-console-consumer.sh --topic app-events --from-beginning --bootstrap-server localhost:9092
8. 性能调优建议 & 实测评估
8.1 调优点总结
| 领域 | 优化方向 |
|---|---|
| 网络 | 提升带宽,调优 socket buffer |
| 磁盘 | NVMe SSD,调整 segment.bytes |
| JVM | G1GC + 预留 Heap |
| Kafka | 调整 partitions & replication |
8.2 压力测试结果示例(产线模拟)
| 测试场景 | 吞吐量 (msg/sec) | 平均延迟 |
|---|---|---|
| 生产者 5 个客户端 | 650,000 | 8 ms |
| 消费者 10 个客户端 | 620,000 | 10 ms |
| 单 Topic 32 分区 | 700,000 | 9 ms |
提示:实际性能受硬件、网络、消息大小、GC 等影响。
9. 容灾与扩展
- 扩容 Broker:新增节点 -> 调整 partition 副本
- 跨数据中心灾备:MirrorMaker 或 Confluent Replicator
- 备份 ZooKeeper 数据:定期快照
10. 典型问题与解决
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| GC 停顿 | 堆过大 / GC 选择不当 | 调整 G1GC 参数 |
| Producer 超时 | 网络拥塞 | 提升带宽 / 调整 buffer |
| ISR 变小 | Broker 性能不均 | 确保节点一致 |
12. 总结
通过上述步骤,您可以在 CentOS 7.9 平台上构建一个高性能、可扩展和易维护的 Kafka 集群。核心是从 硬件性能评估、系统调优、JVM/Garbage Collection、Broker 和 Topic 参数配置、监控方案 五个维度整体考量,再辅以持续的性能测试与指标跟踪。