Kafka 是什么
Kafka 是 Apache 旗下开源的分布式消息队列系统(也称为分布式流处理平台)最初由 LinkedIn 开发并开源 核心作用是实现分布式系统中 "生产者 - 消费者" 模式的消息传递 解决高并发场景下的数据异步传输 解耦 削峰填谷问题
核心定位与核心特性
- 核心功能:接收来自生产者(如业务系统 日志采集工具)的消息 存储并转发给消费者(如数据分析系统 业务处理服务)支持高吞吐量 高可靠性的消息传输 可处理百万级 / 秒的消息峰值
- 关键特性:
- 分布式架构:支持集群部署 节点(broker)可横向扩展,确保高可用和高并发处理能力
- 持久化存储:消息会持久化到磁盘 支持自定义日志保留时间 可避免消息丢失
- 高吞吐量:采用分区(Partition)和副本(Replication)机制 拆分消息存储和处理压力 适配高并发场景
- 解耦特性:生产者和消费者无需直接通信,通过主题(Topic)关联 降低系统间耦合度 提升系统扩展性
与 Zookeeper 的关联
在 Kafka 集群部署中 Kafka 依赖 Zookeeper 实现协调管理 Zookeeper 负责存储 Kafka 的核心元数据(如 broker 注册信息 Topic 配置 消费者分组偏移量等)并协调 Kafka 集群的控制器选举 分区副本同步等关键操作 保障 Kafka 集群稳定运行(Kafka 最新版本可脱离 Zookeeper 部署 但生产环境中仍广泛采用 Zookeeper 协调模式)
Zookeeper 是什么
Zookeeper 是 Apache 旗下开源免费的分布式协调工具最初由 Yahoo 团队开发 2008 年开源 核心作用是解决分布式系统中的一致性问题 为各类分布式系统提供统一的协调服务 堪称分布式系统的 "协调者"
核心定位与核心特性
- 核心功能:主要用于分布式锁、服务注册与发现 主从选举 配置管理等场景 像一个 "分布式公告板"让分布式系统中的所有节点(服务)共享状态 步调一致 避免数据混乱或服务冲突
- 关键特性:
- 集群高可用:通常部署奇数个节点(3 5 个)通过主从选举机制产生 1 个 Leader 节点(处理读写请求)和多个 Follower 节点(同步数据 参与选举)确保自身服务不中断
- 节点存储模型:存储结构类似文件系统 以 ZNode(节点)为基本单位 分为持久节点(存储固定配置 如服务配置)和临时节点(跟踪服务状态 如 broker 在线状态)
- 订阅通知机制:客户端可订阅 ZNode 节点的变化 当节点数据或状态改变时 Zookeeper 会实时推送通知给订阅客户端 减少系统轮询压力
常见应用场景
除了支撑 Kafka 集群运行 Zookeeper 还广泛应用于 Hadoop HBase 分布式缓存等分布式系统 负责协调集群节点 管理配置信息 保障系统一致性
常见问题
-
Zookeeper启动失败:检查dataDir dataLogDir目录是否创建且权限正确 myid文件是否唯一且与zoo.cfg配置一致 集群节点间网络是否互通(2888 3888端口是否开放) 日志文件是否有报错信息
-
Kafka启动失败:检查Zookeeper集群是否正常运行 server.properties中broker.id是否唯一 advertised.listeners是否为服务器实际IP 日志目录是否创建且权限正确 日志文件中是否有端口占用 配置错误等报错
-
消费者无法接收消息:检查bootstrap-server地址是否正确(集群需填写所有节点)主题是否存在且配置正确(分区数 副本数)生产者是否正常发送消息 防火墙是否开放9092端口 节点间网络是否通畅
-
Zookeeper集群选举失败:确保所有节点的zoo.cfg配置一致 myid唯一 节点间网络通畅 且至少启动2个节点(奇数节点集群)避免脑裂(生产环境可配置quorumListenOnAllIPs=true优化选举)
-
Kafka消息丢失:检查min.insync.replicas配置是否合理 确保消息被足够多的副本同步后再确认发送成功 避免日志保留时间过短 导致消息提前被清理
注意事项
-
生产环境中 Zookeeper集群必须部署奇数个节点(3 5个)确保高可用 避免脑裂 Kafka集群节点数建议不少于3个 副本数设为2-3(根据节点数调整)分区数根据业务并发量合理设置(建议等于节点数或倍数)
-
所有服务(Zookeeper Kafka)必须使用非root用户运行(如本文的kafka用户)降低安全风险 所有目录(数据目录 日志目录)需单独挂载磁盘 避免占用系统盘 影响服务稳定性
-
必须配置开机自启(避免服务器重启后服务失效)通过systemd服务实现 确保服务异常后能自动恢复(生产环境可结合监控工具 实现故障告警)
-
定期清理Zookeeper和Kafka的日志文件(可通过配置自动清理 或编写定时脚本)避免磁盘空间不足 定期备份数据 防止数据丢失(生产环境建议每天备份一次)
-
生产环境禁止开启auto.create.topics.enable=true 所有主题需手动创建 规范主题命名和配置 便于管理和维护
-
部署完成后 必须测试集群的高可用(停止某个节点 验证服务是否正常)和消息可靠性(发送消息后 停止节点 确认消息不丢失)
-
生产环境建议配置监控工具 监控Zookeeper和Kafka的运行状态 磁盘使用率 消息吞吐量等指标 及时发现并处理故障
单节点部署kafka
安装zookeeper
dnf -y install java
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
vim zoo.cfg
dataDir=/etc/zookeeper/zookeeper-data
cd /etc/zookeeper/
mkdir zookeeper-data
./bin/zkServer.sh start
./bin/zkServer.sh status
安装kafka
tar zxvf kafka_2.13-2.4.1.tgz
mv kafka_2.13-2.4.1 /etc/kafka
cd /etc/kafka/
vim config/server.properties
log.dirs=/etc/kafka/kafka-logs #60行
mkdir /etc/kafka/kafka-logs
bin/kafka-server-start.sh config/server.properties &
检查两个端口的开启状态
netstat -anpt | grep 2181
netstat -anpt | grep 9092
注意:启动时先启动zookeeper 关闭时先关闭kafka
如果要关闭zookeeper
/etc/zookeeper/bin/zkServer.sh stop
如果要关闭kafka
/etc/kafka/bin/kafka-server-stop.sh
如果关不了 就kill杀死该进程
列出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