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 等)可以有效降低丢数据风险。
热门推荐
物联网协议:MQTT、CoAP 和 LwM2M 的比较与应用
如何删除 Excel 中的空白列(4 种快速方法)
早产儿生长评价工具:用进口的还是国产的?
眼睑黄瘤挂哪科检查
眼睛上长黄色瘤是怎么回事:成因、治疗与预防
对比分析:螺杆式、离心式和往复式压缩机
可视化实战秘籍:帮你解决数据展示不清晰的困扰
生长激素瘤:病因、症状、检查、治疗与护理全解析
大S最终选择塔葬?塔葬究竟有何魅力?揭秘神秘的佛教葬俗文化
机器学习模型为什么要收敛?收敛意味着什么?
如何用单片机控制可控硅的C语言程序
水生植物的分类及其净化水质的功能
一键搞定!线上补办手机卡全攻略
3D纳米打印技术将陶瓷转化为高性能材料,用于疾病检测和航空航天领域
德牧犬训练方法与技巧
牡丹什么时候发芽长叶子?详解其生长习性与养护要点
银行的金融科技应用的大数据精准营销方法?
银行的金融服务个性化服务实施与客户满意度提升研究
SPSS26统计分析笔记——2 描述统计
产后腰疼吃什么好
在作文中巧妙使用比喻
练口才的方法:如何快速提升自己的口才能力
山西:2027年底全省煤矿基本实现智能化
酶联免疫吸附测定(ELISA)实验操作重点之一加样解读
蚂蚁喜欢吃什么食物?蚂蚁饮食习性解析
办公软件怎么是空白
上海松江快线最新规划曝光,区域发展再添新动力
如何高效应用科研项目管理方法提升团队协作?
箬竹子的生长习性与应用价值
箬竹子的生长习性与应用价值