前言
消息队列是分布式系统核心组件,用于异步解耦、削峰填谷、数据缓冲 。Kafka 是高吞吐分布式发布 / 订阅消息系统,Zookeeper 负责 Kafka 集群的协调管理、节点注册、Leader 选举、负载均衡,二者配合构建高可用消息队列集群。
一、核心知识点补充
1. 消息队列核心价值
- 解耦:生产者与消费者不直接通信,独立扩展
- 异步:非实时处理,提升系统响应速度
- 削峰:缓冲突发流量,避免系统崩溃
- 持久化:消息落盘,防止数据丢失
- 顺序保证:Kafka 单 Partition 内消息严格有序
2. Kafka 核心概念
- Broker:Kafka 集群服务器节点
- Topic:消息分类主题,逻辑容器
- Partition:Topic 物理分区,提升吞吐
- Producer:消息生产者,Push 模式发送
- Consumer:消息消费者,Pull 模式拉取
- Consumer Group:消费组,同一组内消费者互斥消费分区
3. Zookeeper 核心作用
- 管理 Kafka Broker 注册与发现
- Topic 分区与 Broker 映射维护
- 消费组负载均衡与偏移量(Offset)记录
- 集群 Leader 选举,防止脑裂
4. 端口说明
- Zookeeper:2181(客户端)、2888(集群通信)、3888(Leader 选举)
- Kafka:9092(服务监听)
二、集群环境规划
表格
| 节点 | IP 地址 | 主机名 | 部署组件 |
|---|---|---|---|
| Node1 | 192.168.10.101 | kafka1 | Zookeeper、Kafka |
| Node2 | 192.168.10.102 | kafka2 | Zookeeper、Kafka |
| Node3 | 192.168.10.103 | kafka3 | Zookeeper、Kafka |
基础环境配置(所有节点执行)
bash
运行
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 配置主机名
hostnamectl set-hostname kafka1 # Node2 为 kafka2,Node3 为 kafka3
exec bash
# 配置 hosts 映射
cat > /etc/hosts << EOF
192.168.10.101 kafka1
192.168.10.102 kafka2
192.168.10.103 kafka3
EOF
三、Zookeeper 集群部署(所有节点执行)
1. 安装 Java 环境
bash
运行
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version # 验证安装
2. 解压 Zookeeper 安装包
bash
运行
tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
mv apache-zookeeper-3.6.0-bin /etc/zookeeper
cd /etc/zookeeper
3. 创建数据目录
bash
运行
mkdir -p /etc/zookeeper/zookeeper-data
4. 修改配置文件
bash
运行
cd conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
配置内容:
properties
dataDir=/etc/zookeeper/zookeeper-data
clientPort=2181
# 集群节点配置
server.1=192.168.10.101:2888:3888
server.2=192.168.10.102:2888:3888
server.3=192.168.10.103:2888:3888
5. 配置节点 ID(唯一标识)
bash
运行
# Node1 执行
echo "1" > /etc/zookeeper/zookeeper-data/myid
# Node2 执行
echo "2" > /etc/zookeeper/zookeeper-data/myid
# Node3 执行
echo "3" > /etc/zookeeper/zookeeper-data/myid
6. 启动 Zookeeper 集群
bash
运行
# 所有节点执行
/etc/zookeeper/bin/zkServer.sh start
# 查看状态
/etc/zookeeper/bin/zkServer.sh status
知识点:Zookeeper 集群需半数以上节点存活才能正常服务,建议部署奇数节点。
四、Kafka 集群部署(所有节点执行)
1. 解压 Kafka 安装包
bash
运行
tar -zxvf kafka_2.13-2.4.1.tgz
mv kafka_2.13-2.4.1 /etc/kafka
cd /etc/kafka
2. 创建日志目录
bash
运行
mkdir -p /etc/kafka/kafka-logs
3. 修改 Kafka 配置文件
bash
运行
vim config/server.properties
Node1 配置:
properties
broker.id=1 # Node2 为 2,Node3 为 3,全局唯一
listeners=PLAINTEXT://192.168.10.101:9092 # 改为当前节点 IP
log.dirs=/etc/kafka/kafka-logs
num.partitions=3 # 分区数建议等于 Broker 数
zookeeper.connect=192.168.10.101:2181,192.168.10.102:2181,192.168.10.103:2181
4. 启动 Kafka 集群
bash
运行
# 后台启动
nohup /etc/kafka/bin/kafka-server-start.sh config/server.properties &
# 验证端口
netstat -anpt | grep 9092
netstat -anpt | grep 2181
启动顺序:先 Zookeeper,后 Kafka ;关闭顺序:先 Kafka,后 Zookeeper。
五、集群功能测试
1. 修复脚本警告
bash
运行
sed -i 's/egrep/grep -E/' /etc/kafka/bin/kafka-run-class.sh
2. 创建 Topic
bash
运行
/etc/kafka/bin/kafka-topics.sh --create \
--zookeeper kafka1:2181 \
--replication-factor 2 \
--partitions 3 \
--topic cluster-test
知识点:
replication-factor为副本数,建议 ≤ Broker 数,提升可用性。
3. 查看 Topic 列表
bash
运行
/etc/kafka/bin/kafka-topics.sh --list --zookeeper kafka1:2181
4. 查看 Topic 详情
bash
运行
/etc/kafka/bin/kafka-topics.sh --describe \
--zookeeper kafka1:2181 \
--topic cluster-test
5. 生产消息
bash
运行
/etc/kafka/bin/kafka-console-producer.sh \
--broker-list kafka1:9092,kafka2:9092,kafka3:9092 \
--topic cluster-test
6. 消费消息(新终端)
bash
运行
/etc/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 \
--topic cluster-test \
--from-beginning
7. 删除 Topic
bash
运行
/etc/kafka/bin/kafka-topics.sh --delete \
--zookeeper kafka1:2181 \
--topic cluster-test
六、服务管理命令
1. Zookeeper 操作
bash
运行
# 启动
/etc/zookeeper/bin/zkServer.sh start
# 停止
/etc/zookeeper/bin/zkServer.sh stop
# 重启
/etc/zookeeper/bin/zkServer.sh restart
# 状态
/etc/zookeeper/bin/zkServer.sh status
2. Kafka 操作
bash
运行
# 启动
nohup /etc/kafka/bin/kafka-server-start.sh config/server.properties &
# 停止
/etc/kafka/bin/kafka-server-stop.sh
# 强制停止
pkill -f kafka
七、常见问题解决
1. Kafka 启动失败:锁冲突
bash
运行
rm -rf /tmp/kafka-logs/*
pkill -f kafka
# 重新启动
nohup /etc/kafka/bin/kafka-server-start.sh config/server.properties &
2. Zookeeper 集群无法选举
- 检查
myid是否唯一 - 检查 2888/3888 端口是否开放
- 确认节点网络互通
3. 消费不到消息
- 检查消费组是否正确
- 确认 Topic 分区与副本正常
- 使用
--from-beginning从头消费
八、Python 代码实现生产 / 消费
1. 安装依赖
bash
运行
pip3 install confluent_kafka
2. 生产者代码
python
运行
from confluent_kafka import Producer
import json
import time
conf = {
'bootstrap.servers': '192.168.10.101:9092,192.168.10.102:9092,192.168.10.103:9092'
}
producer = Producer(conf)
def callback(err, msg):
if err:
print(f'发送失败:{err}')
else:
print(f'发送成功:{msg.topic()} [{msg.partition()}]')
# 发送10条消息
for i in range(10):
data = {'id': i, 'content': f'集群消息{i}'}
producer.produce('cluster-test', key=str(i), value=json.dumps(data), callback=callback)
producer.flush()
time.sleep(1)
3. 消费者代码
python
运行
from confluent_kafka import Consumer
conf = {
'bootstrap.servers': '192.168.10.101:9092,192.168.10.102:9092,192.168.10.103:9092',
'group.id': 'python-group',
'auto.offset.reset': 'earliest'
}
consumer = Consumer(conf)
consumer.subscribe(['cluster-test'])
try:
while True:
msg = consumer.poll(1.0)
if msg is None:
continue
if msg.error():
print(f'消费错误:{msg.error()}')
else:
print(f'接收消息:{json.loads(msg.value())}')
except KeyboardInterrupt:
pass
finally:
consumer.close()
九、总结
本手册完成 Zookeeper 3 节点集群 + Kafka 3 节点集群 部署,包含环境配置、服务启动、功能测试、代码实践、问题排查全流程。Kafka 依托 Zookeeper 实现高可用,通过多分区提升吞吐,适用于日志收集、实时数据处理、微服务通信等场景。