Kafka 深入解析:架构原理、基本使用及丢数据场景分析
创作时间:
作者:
@小白创作中心
Kafka 深入解析:架构原理、基本使用及丢数据场景分析
引用
CSDN
1.
https://blog.csdn.net/tangtangttttt/article/details/146197298
Kafka 是一个高吞吐、分布式的消息队列系统,被广泛应用于日志处理、流式数据处理和事件驱动架构。本篇文章将详细介绍 Kafka 的架构原理、基本使用方法,并分析 Kafka 可能的丢数据场景及其解决方案。
一、Kafka 介绍
1. 什么是 Kafka?
Kafka 是 Apache 基金会开源的分布式流处理平台,主要用于:
- 消息队列(Message Queue):解耦生产者(Producer)和消费者(Consumer)。
- 日志收集(Log Aggregation):高效存储和处理日志数据。
- 流式处理(Stream Processing):结合 Kafka Streams 或 Flink 进行实时分析。
- 事件驱动架构(Event-Driven Architecture):事件存储和处理。
Kafka 采用发布-订阅(Pub-Sub)模型,生产者写入 Topic,多个消费者可订阅消费。
2. Kafka 的核心组件
- Producer(生产者):发送消息到 Kafka 主题(Topic)。
- Broker(消息代理):Kafka 服务器节点,存储和转发消息。
- Topic(主题):消息的分类,每个主题包含多个分区(Partition)。
- Partition(分区):提高并行性,一个 Topic 由多个分区组成。
- Consumer(消费者):从 Kafka 读取消息。
- Consumer Group(消费者组):多个消费者协同消费,提高吞吐量。
- Zookeeper:管理 Kafka 元数据(Kafka 3.x 之后支持 KRaft 代替 Zookeeper)。
二、Kafka 工作原理
1. Topic 和 Partition
Kafka 的主题(Topic)被划分为多个分区(Partition),并存储在不同 Broker 上,提高吞吐量。
- 生产者通过轮询(Round-Robin)或哈希(Key Hashing)方式将消息分配到不同分区。
- 消费者从不同分区并行消费数据。
2. 数据存储
Kafka 采用顺序写入的方式存储数据,提高性能,并利用Zero-Copy技术减少数据拷贝。
3. 消费者偏移量管理
Kafka 采用拉取(pull)模式消费数据,消费者维护自己的消费偏移量(offset)。
- offset 存储在
__consumer_offsets主题。 - 可手动提交 offset,避免数据丢失。
4. 高水位线(HW)机制
高水位线(High Watermark, HW)表示 Kafka 确认同步到所有 ISR 副本的最大 offset。
- 消费者只能消费高水位线之前的数据。
- 如果 ISR 过小,HW 下降,部分数据不可见,甚至丢失。
三、Kafka 在 Linux 中的基本使用
1. 安装 Kafka
wget https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0
2. 启动 Kafka
bin/zookeeper-server-start.sh config/zookeeper.properties &
bin/kafka-server-start.sh config/server.properties &
3. 创建 Topic
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
4. 生产和消费消息
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
5. 查看 Topic 和消费组信息
bin/kafka-topics.sh --describe --topic test-topic --bootstrap-server localhost:9092
bin/kafka-consumer-groups.sh --list --bootstrap-server localhost:9092
四、Kafka 丢数据的场景分析
Kafka 可能在生产、存储、消费三个环节丢数据。
1. 生产者端丢数据
- acks=0 或 acks=1:生产者未等待 Kafka 确认。
- 解决方案:使用 acks=all 确保数据至少写入 ISR 副本。
2. Broker 端丢数据
- min.insync.replicas=1:仅 Leader 副本存活,Follower 没同步就确认数据。
- 高水位线(HW)下降:新 Leader 选举后,未同步数据丢失。
- 解决方案:
bin/kafka-configs.sh --alter --entity-type topics --entity-name test-topic --add-config min.insync.replicas=2 --bootstrap-server localhost:9092
3. 消费者端丢数据
- 自动提交 offset:数据未处理就提交,应用崩溃导致数据丢失。
- 消费者组 Rebalance:Rebalance 过程中分区重分配,部分未处理数据丢失。
- 解决方案:
bin/kafka-console-consumer.sh --topic test-topic --bootstrap-server localhost:9092 --group my-group --consumer-property enable.auto.commit=false
五、总结
丢数据场景 | 原因 | 解决方案 |
|---|---|---|
acks=0或acks=1 | 生产者不等待 Kafka 确认 | acks=all |
min.insync.replicas=1 | 仅 Leader 副本存活 | min.insync.replicas=2 |
高水位线 HW | ISR 副本数据丢失 | unclean.leader.election.enable=false |
自动提交 offset | offset 提交但数据未处理 | enable.auto.commit=false,手动提交 offset |
消费者组 Rebalance | Rebalance 期间数据丢失 | group.instance.id绑定静态成员 |
Kafka 由于其高吞吐特性,在默认配置下无法保证 100% 数据可靠性,但通过合理的参数配置(如 acks=all、min.insync.replicas=2、手动提交 offset 等)可以有效降低丢数据风险。
热门推荐
右归丸的成人使用量是多少
太原2日深度游攻略(2025年更新版)
婚内转移共同财产怎么起诉
葡萄什么时候修剪最好?怎么修剪?
二极管基础知识:从基本结构到实际应用
20余城密集优化公积金政策,降低购房门槛
古人“生日快乐”的惊艳且高级表达!
美原油使用攻略,深度解析:美原油交易策略与技巧
声旁是什么意思?汉字部件声旁详解及常见疑问!
车辆违停被拖走会扣分吗
CSV文件如何跟数据库对应
十二指肠溃疡的疼痛特点
经济法包括哪些法
如何组织一场广场舞大赛网络投票评选活动
浮梁茶,何以享天下?(历史篇)|这是蕴藏在古诗中的茶香
福冈机场到由布院交通攻略:直达巴士高效秘籍
医疗器械GMP培训的2025展望:质量与效率的双重提升
枣庄薛城发展现状及未来趋势分析
修复 Windows 中 OBS 游戏捕获不起作用的 5 种方法
美文馨语《人生总会有答案》
全纳教育:构建包容、平等与参与的教育环境
大量电动车被查扣之后,交警都是怎么处理的?业内人说出3个去向,你认同吗?
探秘高山曲水成语背后的深厚文化意涵
世界卫生组织发布最新全球十大死因!
便秘患者如何调整饮食
考研保护一志愿是什么意思?
拉面制作工艺解析
薄膜键盘:静音办公环境的完美选项?
泰山石摆放时间最好是什么时候?摆放时间有什么讲究?
女性充分利用“长寿红利”的4种方法