一. ZooKeeper + Kafka 核心作用与用途
1. Kafka 核心作用
- 高吞吐消息队列:分布式发布 / 订阅消息系统,支撑海量数据实时采集、传输与处理。
- 解耦系统:生产者与消费者互不感知,独立扩展与维护。
- 流量削峰:缓冲突发流量,避免服务过载崩溃。
- 异步通信:消息非即时处理,提升系统响应与吞吐量。
- 有序保证:单 Partition 内消息严格有序,支持顺序消费。
- 持久化存储:消息落盘防止丢失,支持回溯消费。
2. ZooKeeper 核心作用
- 分布式协调:管理集群节点,避免脑裂,保证一致性。
- 集群管理:选举 Leader,监控节点存活,故障自动切换。
- 配置与状态同步:统一存储集群配置,保证各节点一致。
- Kafka 依赖支撑:负责 Broker 注册、Topic 元数据管理、消费负载均衡、Offset 记录、消费者组协调。
3. 组合用途
- 搭建高可用消息队列集群,用于日志收集、实时数据流、系统解耦、异步任务、大数据管道。
- 支撑生产 - 消费模型,支持多副本、多分区、横向扩展。
- 配合 Logstash/Elasticsearch 实现日志采集 - 存储 - 检索全链路。
二. 实验环境
1. 单节点实验环境
- 主机:kafka1
- IP:192.168.10.101
- 系统:CentOS/RHEL
- 软件:JDK、ZooKeeper 3.6.0、Kafka 2.13-2.4.1
- 端口:2181(ZK)、9092(Kafka)
2. 集群实验环境
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| kafka1 | 192.168.10.101 | ZK 节点 1 + Broker1 |
| kafka2 | 192.168.10.102 | ZK 节点 2 + Broker2 |
| kafka3 | 192.168.10.103 | ZK 节点 3 + Broker3 |
- 关闭防火墙、SELinux
- 所有节点配置 hosts、JDK、相同版本软件
- 端口:2181、2888、3888、9092
三. 单节点部署实验步骤
1. 配置 hosts
echo "192.168.10.101 kafka1" >> /etc/hosts
2. 安装 JDK
yum -y install java
3. 安装配置 ZooKeeper
tar zxvf apache-zookeeper-3.6.0-bin.tar.gz
mv apache-zookeeper-3.6.0-bin /etc/zookeeper
cd /etc/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
修改 zoo.cfg:
dataDir=/etc/zookeeper/zookeeper-data
mkdir /etc/zookeeper/zookeeper-data
4. 启动 ZooKeeper
cd /etc/zookeeper
./bin/zkServer.sh start
./bin/zkServer.sh status
5. 安装配置 Kafka
tar zxvf kafka_2.13-2.4.1.tgz
mv kafka_2.13-2.4.1 /etc/kafka
cd /etc/kafka
修改 config/server.properties:
log.dirs=/etc/kafka/kafka-logs
mkdir /etc/kafka/kafka-logs
6. 启动 Kafka
bin/kafka-server-start.sh config/server.properties &
7. 检查端口
netstat -anpt | grep 2181
netstat -anpt | grep 9092
8. 单节点功能测试
-
创建 topic
bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 1 --topic test
-
查看 topic 列表
bin/kafka-topics.sh --list --zookeeper kafka1:2181
-
查看 topic 详情
bin/kafka-topics.sh --describe --zookeeper kafka1:2181 --topic test
-
生产消息
bin/kafka-console-producer.sh --broker-list kafka1:9092 --topic test
-
消费消息(新开终端)
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test
-
删除 topic
bin/kafka-topics.sh --delete --zookeeper kafka1:2181 --topic test
9. 关闭服务
/etc/kafka/bin/kafka-server-stop.sh
/etc/zookeeper/bin/zkServer.sh stop
四. 集群部署实验步骤
1. 所有节点配置 hosts
vim /etc/hosts
192.168.10.101 kafka1
192.168.10.102 kafka2
192.168.10.103 kafka3
2. 所有节点关闭防火墙与 SELinux
systemctl stop firewalld
setenforce 0
3. 所有节点安装 JDK
yum -y install java
4. 所有节点部署 ZooKeeper
tar zxvf apache-zookeeper-3.6.0-bin.tar.gz
mv apache-zookeeper-3.6.0-bin /etc/zookeeper
mkdir /etc/zookeeper/zookeeper-data
cd /etc/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
修改 zoo.cfg:
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. 配置 myid(各节点不同)
-
kafka1:
echo '1' > /etc/zookeeper/zookeeper-data/myid
-
kafka2:
echo '2' > /etc/zookeeper/zookeeper-data/myid
-
kafka3:
echo '3' > /etc/zookeeper/zookeeper-data/myid
6. 所有节点启动 ZK
cd /etc/zookeeper
./bin/zkServer.sh start
./bin/zkServer.sh status
7. 所有节点安装 Kafka
tar zxvf kafka_2.13-2.4.1.tgz
mv kafka_2.13-2.4.1 /etc/kafka
mkdir /etc/kafka/kafka-logs
8. 修改各节点 server.properties
-
kafka1:
broker.id=1
listeners=PLAINTEXT://192.168.10.101:9092
log.dirs=/etc/kafka/kafka-logs
zookeeper.connect=192.168.10.101:2181,192.168.10.102:2181,192.168.10.103:2181 -
kafka2:
broker.id=2
listeners=PLAINTEXT://192.168.10.102:9092 -
kafka3:
broker.id=3
listeners=PLAINTEXT://192.168.10.103:9092
9. 所有节点启动 Kafka
cd /etc/kafka
bin/kafka-server-start.sh config/server.properties &
10. 集群功能测试
-
创建 topic
bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 1 --topic test
-
查看 topic(任意节点)
bin/kafka-topics.sh --list --zookeeper kafka1:2181
bin/kafka-topics.sh --list --zookeeper kafka2:2181
bin/kafka-topics.sh --list --zookeeper kafka3:2181 -
生产 / 消费
bin/kafka-console-producer.sh --broker-list kafka1:9092 --topic test
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test -
删除 topic
bin/kafka-topics.sh --delete --zookeeper kafka1:2181 --topic test
五. Python 生产消费实验步骤
1. 安装依赖
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
pip3 config set install.trusted-host mirrors.aliyun.com
pip3 install confluent_kafka
2. 生产者代码
from confluent_kafka import Producer
import json
import time
bootstrap_servers = '192.168.10.102:9092'
topic_name = 'my_test_topic'
producer = Producer({'bootstrap.servers': bootstrap_servers})
def delivery_report(err, msg):
if err:
print(f'失败: {err}')
else:
print(f'成功: {msg.topic()} [{msg.partition()}]')
for i in range(10):
data = {'id': i, 'value': f'message-{i}'}
producer.produce(topic_name, key=str(i), value=json.dumps(data).encode('utf-8'), callback=delivery_report)
time.sleep(1)
producer.flush()
3. 消费者代码
from confluent_kafka import Consumer, KafkaError
import json
bootstrap_servers = '192.168.10.101:9092'
topic_name = 'my_test_topic'
consumer = Consumer({
'bootstrap.servers': bootstrap_servers,
'group.id': 'my_test_group',
'auto.offset.reset': 'earliest'
})
consumer.subscribe([topic_name])
try:
while True:
msg = consumer.poll(1.0)
if not msg:
continue
if msg.error():
print(msg.error())
else:
msg_json = json.loads(msg.value().decode())
print(f'接收: {msg_json}, offset: {msg.offset()}')
except KeyboardInterrupt:
pass
finally:
consumer.close()
启动服务
python3 consumer.py (消费者)
python3 producer.py (生产者)
六. 总结
通过实验理解了 ZooKeeper 负责集群协调、元数据管理与节点选举,Kafka 提供高吞吐、可持久化的消息队列服务,二者配合可搭建高可用分布式消息系统。实验验证了集群的稳定性与互通性,掌握了消息队列的基本使用与应用集成方法,为日志收集、服务解耦、异步通信等实际场景提供了实践基础。