zookeeper+kafka消息队列群集部署

一. 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 提供高吞吐、可持久化的消息队列服务,二者配合可搭建高可用分布式消息系统。实验验证了集群的稳定性与互通性,掌握了消息队列的基本使用与应用集成方法,为日志收集、服务解耦、异步通信等实际场景提供了实践基础。

相关推荐
codeejun2 小时前
每日一Go-55、分布式 ID 生成(雪花算法 / Segment / Redis / DB)
数据库·分布式·golang
AILabNotes2 小时前
020、总结:全球分布式图书馆的技术挑战与伦理思考
分布式
白露与泡影2 小时前
从零学习Kafka:ZooKeeper vs KRaft
学习·zookeeper·kafka
Devin~Y2 小时前
大厂 Java 面试实战:Spring Boot 微服务 + Redis 缓存 + Kafka 消息 + Kubernetes + RAG(小Y水货翻车记)
java·spring boot·redis·kafka·spring security·jwt·oauth2
小江的记录本2 小时前
【分布式】分布式核心组件——分布式限流:固定窗口、滑动窗口、漏桶、令牌桶算法,网关层/服务层限流实现
java·分布式·后端·python·算法·安全·面试
oLLI PILO2 小时前
LLM Xinference 安装使用(支持CPU、Metal、CUDA推理和分布式部署)
分布式
飞鸟恋上鱼3 小时前
基于Spark的短视频推荐系统设计与实现
大数据·分布式·spark
@不误正业3 小时前
第09章-分布式硬件平台
分布式·架构·开源·开源鸿蒙
juniperhan3 小时前
Flink 系列第13篇:Flink 生产环境中的并行度与资源配置
java·大数据·数据仓库·分布式·flink