Zookeeper + Kafka 消息队列集群部署手册

前言

消息队列是分布式系统核心组件,用于异步解耦、削峰填谷、数据缓冲 。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 实现高可用,通过多分区提升吞吐,适用于日志收集、实时数据处理、微服务通信等场景。

相关推荐
卢傢蕊2 小时前
Kafka 消息队列
分布式·kafka·java-zookeeper
lhbian16 小时前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
Jackyzhe18 小时前
从零学习Kafka:认证机制
分布式·学习·kafka
lhbian19 小时前
PHP vs Java vs Go:编程语言终极对比
java·spring boot·后端·kafka·linq
AutoMQ19 小时前
别再每月浪费数千美元:拆解 AWS/GCP Kafka 背后的隐性账单
kafka·消息队列·aws
Devin~Y1 天前
大厂Java面试实战:Spring Boot/WebFlux、Redis+Kafka、K8s可观测性与Spring AI RAG/Agent三轮连环问
java·spring boot·redis·kafka·kubernetes·resilience4j·spring webflux
indexsunny1 天前
互联网大厂Java求职面试实战:Spring Boot与微服务架构解析
java·spring boot·redis·kafka·spring security·flyway·microservices
ldj20201 天前
kafka如何合理分配消费者数量和分区数量
kafka
蓝魔Y1 天前
Apache—Kafka实践
分布式·kafka·apache