目录
一、消息队列基础概念
1. 消息队列的特性
2. 消息队列的价值
二、Kafka核心原理
1. 核心概念与架构
2. 拓扑架构与工作机制
3. Topic与Partition的设计
三、Zookeeper
1. 核心功能
2. 工作原理详解
3. 集群架构
四、Kafka的作用
1. 元数据管理
2. 负载均衡机制
3. 消费状态维护
五、单节点Kafka部署
1. 环境准备
2. 安装Zookeeper
3. 安装Kafka
4. 功能测试
六、Kafka集群部署
1. 集群规划
2. 基础环境配置(所有节点)
3. Zookeeper集群配置
4. Kafka集群配置
5. 集群测试
七、总结
在分布式系统中,消息队列是解耦、异步处理和流量削峰的关键组件。当系统不需要立即获得处理结果,却需要控制并发量时,消息队列就成为了必选方案。
Kafka是Apache开源的高吞吐量分布式发布/订阅消息系统,专为大数据实时处理设计。其核心组件包括:
Kafka集群通过Zookeeper管理元数据,Producer使用Push模式发送消息,Consumer使用Pull模式拉取消息。关键特性包括:
Partition是Kafka高吞吐的核心设计:
Zookeeper是分布式系统的协调服务,解决分布式环境下的进程同步和资源竞争问题:
Zookeeper集群包含三种角色:
Kafka高度依赖Zookeeper实现核心功能:
/brokers/ids
下创建临时节点,存储IP和端口信息。/brokers/topics
节点,如/brokers/topics/login/3->2
表示Broker 3为login Topic提供2个分区。/consumers/[group_id]/offsets/[topic]/[partition]
节点,确保故障恢复后继续消费。/consumers/[group_id]/ids
下创建节点,监听组内成员变化触发负载均衡。# 修改主机名
[root@localhost ~]# hostnamectl set-hostname kafka1
# 添加地址映射
[root@kafka1 ~]# echo "192.168.10.101 kafka1" >> /etc/hosts
解释:hostnamectl用于设置主机名,/etc/hosts文件确保节点间通过主机名通信。
# 安装Java环境
[root@kafka1 ~]# yum -y install java
# 解压Zookeeper
[root@kafka1 ~]# tar zxvf apache-zookeeper-3.6.0-bin.tar.gz
[root@kafka1 ~]# mv apache-zookeeper-3.6.0-bin /etc/zookeeper
# 配置文件准备
[root@kafka1 ~]# cd /etc/zookeeper/conf
[root@kafka1 conf]# mv zoo_sample.cfg zoo.cfg
# 编辑配置文件
[root@kafka1 conf]# vi zoo.cfg
dataDir=/etc/zookeeper/zookeeper-data # 数据存储目录
# 启动Zookeeper
[root@kafka1 zookeeper]# mkdir zookeeper-data
[root@kafka1 zookeeper]# ./bin/zkServer.sh start
[root@kafka1 zookeeper]# ./bin/zkServer.sh status # 查看状态
解释:Zookeeper依赖Java环境,dataDir指定数据存储路径,zkServer.sh脚本用于启动和管理服务。
# 解压Kafka
[root@kafka1 ~]# tar zxvf kafka_2.13-2.4.1.tgz
[root@kafka1 ~]# mv kafka_2.13-2.4.1 /etc/kafka
# 修改配置文件
[root@kafka1 ~]# cd /etc/kafka/
[root@kafka1 kafka]# vi config/server.properties
log.dirs=/etc/kafka/kafka-logs # 日志存储目录
# 启动Kafka
[root@kafka1 kafka]# mkdir /etc/kafka/kafka-logs
[root@kafka1 kafka]# nohup bin/kafka-server-start.sh config/server.properties &
# 检查端口
[root@kafka1 kafka]# netstat -anpt | grep 2181 # Zookeeper端口
[root@kafka1 kafka]# netstat -anpt | grep 9092 # Kafka端口
解释:log.dirs指定Kafka数据存储路径,nohup确保服务后台运行,2181是Zookeeper客户端端口,9092是Kafka服务端口。
# 修复脚本警告
[root@kafka1 kafka]# sed -i 's/egrep/grep -E/' bin/kafka-run-class.sh
# 创建Topic
[root@kafka1 kafka]# bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 1 --topic test
# 列出Topic
[root@kafka1 kafka]# bin/kafka-topics.sh --list --zookeeper kafka1:2181
# 查看Topic详情
[root@kafka1 kafka]# bin/kafka-topics.sh --describe --zookeeper kafka1:2181 --topic test
# 生产消息(新开终端)
[root@kafka1 kafka]# bin/kafka-console-producer.sh --broker-list kafka1:9092 --topic test
# 消费消息(新开终端)
[root@kafka1 kafka]# bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test --from-beginning
# 删除Topic
[root@kafka1 kafka]# bin/kafka-topics.sh --delete --zookeeper kafka1:2181 --topic test
解释:--replication-factor指定副本数,--partitions指定分区数,--from-beginning表示从消息起始位置消费,删除Topic需通过Zookeeper执行。
操作系统 |
IP |
主机名 |
应用 |
OpenEuler24 |
192.168.10.101 |
kafka1 |
Zookeeper,Kafka |
OpenEuler24 |
192.168.10.102 |
kafka2 |
Zookeeper,Kafka |
OpenEuler24 |
192.168.10.103 |
kafka3 |
Zookeeper,Kafka |
# 关闭防火墙和SELinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
# 修改主机名(各节点分别设置为kafka1/kafka2/kafka3)
[root@localhost ~]# hostnamectl set-hostname kafka1
# 添加地址映射
[root@kafka1 ~]# cat > /etc/hosts << EOF
192.168.10.101 kafka1
192.168.10.102 kafka2
192.168.10.103 kafka3
EOF
解释:关闭安全机制避免端口阻塞,hosts文件确保集群节点互通。
# 安装Zookeeper(以kafka1为例,其他节点操作相同)
[root@kafka1 ~]# yum -y install java
[root@kafka1 ~]# tar zxvf apache-zookeeper-3.6.0-bin.tar.gz
[root@kafka1 ~]# mv apache-zookeeper-3.6.0-bin /etc/zookeeper
# 编辑配置文件
[root@kafka1 conf]# vi zoo.cfg
dataDir=/etc/zookeeper/zookeeper-data
server.1=192.168.10.101:2888:3888 # 节点1地址,2888为集群通信端口,3888为选举端口
server.2=192.168.10.102:2888:3888
server.3=192.168.10.103:2888:3888
clientPort=2181 # 客户端端口
# 创建节点ID(各节点分别写入1/2/3)
[root@kafka1 ~]# echo "1" > /etc/zookeeper/zookeeper-data/myid
解释:server.x配置指定集群节点,myid文件用于标识节点身份,Zookeeper通过多数节点(≥2)确认实现数据一致性。
# 安装Kafka(以kafka1为例,其他节点操作相同)
[root@kafka1 ~]# tar zxvf kafka_2.13-2.4.1.tgz
[root@kafka1 ~]# mv kafka_2.13-2.4.1 /etc/kafka
# 编辑配置文件
[root@kafka1 kafka]# vi config/server.properties
broker.id=1 # 节点唯一标识,kafka2设为2,kafka3设为3
listeners=PLAINTEXT://192.168.10.101:9092 # 监听地址
log.dirs=/etc/kafka/kafka-logs # 日志目录
num.partitions=1 # 分区数,建议不超过节点数
zookeeper.connect=192.168.10.101:2181,192.168.10.102:2181,192.168.10.103:2181 # Zookeeper集群地址
# 启动服务
[root@kafka1 kafka]# mkdir /etc/kafka/kafka-logs
[root@kafka1 kafka]# nohup ./bin/kafka-server-start.sh config/server.properties &
解释:broker.id唯一标识节点,listeners指定服务地址,zookeeper.connect配置集群连接信息,num.partitions控制分区数量。
# 创建Topic(任意节点执行)
[root@kafka1 kafka]# bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 3 --partitions 3 --topic cluster-test
# 验证Topic分布(各节点查询)
[root@kafka1 kafka]# bin/kafka-topics.sh --list --zookeeper kafka1:2181
[root@kafka2 kafka]# bin/kafka-topics.sh --list --zookeeper kafka2:2181
# 生产消费测试(同单节点流程)
解释:--replication-factor设为3确保每个分区有3个副本,提升容错性,通过多节点查询验证数据分布式存储。
Kafka通过分布式分区、顺序磁盘写入和Zookeeper协调机制,实现了每秒百万级消息处理的高吞吐能力,成为日志收集、实时分析和事件驱动架构的核心组件。从单节点到集群的部署实践,不仅展现了其架构的可扩展性,更揭示了分布式系统设计中的核心挑战:数据一致性、故障容错和负载均衡。
在实际应用中,合理配置Partition数量、副本因子和消费组策略,能够最大化发挥Kafka的性能优势。结合Zookeeper的选举机制和状态同步能力,Kafka集群可在大规模数据场景中保持高可用性,为实时数据管道提供坚实的技术基础。