Kafka 集群部署与集成指南
概述
Apache Kafka 是一个分布式流处理平台,提供高吞吐量的实时数据管道。广泛应用于日志收集、流式处理、事件溯源等场景。
核心概念
- 📝 Producer - 消息生产者
- 📥 Consumer - 消息消费者
- 📋 Topic - 消息主题(分类)
- 🔗 Partition - 分区(并行处理单元)
- 🐘 Broker - Kafka 服务器节点
- 🏛️ ZooKeeper - 协调服务(Kafka 2.8+ 支持 KRaft 模式可不用 ZK)
架构设计
┌─────────────┐ ┌─────────────┐
│ Producer │ ──► │ Broker 1 │ (Leader: Topic-A-P0)
└─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ Broker 2 │ (Follower: Topic-A-P0)
└─────────────┘
│
▼
┌─────────────┐
│ Consumer │
└─────────────┘
集群部署方案
环境规划
| 节点 | IP | Broker ID | ZooKeeper | 说明 |
|---|---|---|---|---|
| kafka-1 | 192.168.192.150 | 1 | ✓ | Controller + Broker |
| kafka-2 | 192.168.192.151 | 2 | ✓ | Broker |
| kafka-3 | 192.168.192.152 | 3 | ✓ | Broker |
前置要求
- ✅ ZooKeeper 集群(3 节点)
- ✅ JDK 11+
- ✅ 磁盘:每节点 100GB+ SSD
- ✅ 网络:千兆网卡
安装步骤
1. 下载 Kafka
cd /tmp
wget https://archive.apache.org/dist/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
sudo mv kafka_2.13-3.6.0 /opt/kafka
sudo chown -R kafka:kafka /opt/kafka
2. 配置 ZooKeeper(如果已有 ZK 集群可跳过)
# 创建数据目录
sudo mkdir -p /var/lib/zookeeper
sudo chown kafka:kafka /var/lib/zookeeper
# 配置 myid
echo "1" | sudo tee /var/lib/zookeeper/myid # kafka-1 上执行
3. 配置 Kafka
编辑 /opt/kafka/config/server.properties:
# Broker 唯一标识
broker.id=1
# 监听地址
listeners=PLAINTEXT://192.168.192.150:9092
advertised.listeners=PLAINTEXT://192.168.192.150:9092
# 日志目录
log.dirs=/var/lib/kafka/logs
# ZooKeeper 连接
zookeeper.connect=192.168.192.150:2181,192.168.192.151:2181,192.168.192.152:2181
# 分区数(默认)
num.partitions=3
# 副本数
default.replication.factor=3
min.insync.replicas=2
4. 启动服务
# 启动 ZooKeeper(如果没有独立 ZK 集群)
/opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
# 启动 Kafka
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
与 DolphinScheduler 集成
在 DS 中使用 Kafka
1. Python 任务生产消息
from kafka import KafkaProducer
import json
producer = KafkaProducer(
bootstrap_servers=['192.168.192.150:9092', '192.168.192.151:9092'],
value_serializer=lambda v: json.dumps(v).encode('utf-8')
)
# 发送消息
message = {'event': 'order_created', 'order_id': 12345}
producer.send('orders_topic', value=message)
producer.flush()
producer.close()
print("消息发送成功")
2. Shell 任务消费消息
#!/bin/bash
# 消费 Kafka 消息
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.192.150:9092 \
--topic orders_topic \
--from-beginning \
--max-messages 100
3. SeaTunnel 读取 Kafka
source {
Kafka {
bootstrap.servers = "192.168.192.150:9092,192.168.192.151:9092"
topic = "orders_topic"
format = "json"
}
}
sink {
Doris {
fenodes = "192.168.192.140:8030"
database = "realtime_db"
table = "orders"
}
}
典型应用场景
场景一:实时日志收集
App Server → Filebeat → Kafka → Logstash → Elasticsearch → Kibana
场景二:事件驱动架构
订单服务 → Kafka →
├─ 库存服务
├─ 支付服务
└─ 通知服务
场景三:实时数据管道
MySQL (CDC) → Kafka →
├─ Doris (实时数仓)
├─ HDFS (数据湖)
└─ Redis (缓存)
运维管理
创建 Topic
# 创建主题
/opt/kafka/bin/kafka-topics.sh \
--create \
--bootstrap-server 192.168.192.150:9092 \
--replication-factor 3 \
--partitions 6 \
--topic orders_topic
查看 Topic 信息
# 列出所有主题
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.192.150:9092
# 查看详情
/opt/kafka/bin/kafka-topics.sh \
--describe \
--topic orders_topic \
--bootstrap-server 192.168.192.150:9092
监控指标
- Throughput: 消息生产/消费速率
- Lag: 消费延迟
- Under Replicated Partitions: 未同步分区数
- Active Controller Count: 活跃的 Controller 数量
性能优化
# Producer 优化
batch.size=16384
linger.ms=5
compression.type=lz4
# Consumer 优化
fetch.min.bytes=1
fetch.max.wait.ms=500
最佳实践
1. 高可用配置
# Broker 配置
min.insync.replicas=2
unclean.leader.election.enable=false
auto.leader.rebalance.enable=true
2. 数据保留策略
# 基于时间
retention.ms=604800000 # 7 天
# 基于大小
retention.bytes=10737418240 # 10GB
3. 安全配置
# 启用 SSL
security.inter.broker.protocol=SSL
ssl.keystore.location=/var/ssl/private/kafka.server.keystore.jks
ssl.truststore.location=/var/ssl/private/kafka.server.truststore.jks
常见问题
Q1: Kafka 需要 ZooKeeper 吗?
答:
- Kafka 2.8 之前: 必须依赖 ZooKeeper
- Kafka 2.8+: 支持 KRaft 模式(无需 ZK)
- Kafka 3.0+: KRaft 模式成熟,推荐生产使用
Q2: 如何保证消息不丢失?
# Producer
acks=all
retries=3
enable.idempotence=true
# Broker
min.insync.replicas=2
unclean.leader.election.enable=false
# Consumer
enable.auto.commit=false
Q3: 如何处理消息积压?
- 增加 Consumer 数量
- 增加 Topic 分区数
- 优化 Consumer 处理逻辑
- 临时扩容 Consumer 集群