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 等)可以有效降低丢数据风险。
热门推荐
锅巴鲫鱼的做法与制作技巧详解
大股东减持后股价波动:市场反应及投资者需关注
大股东减持股价一定会跌吗?解析其影响及投资策略
小孩脚臭是什么原因引起的,怎样去除?了解脚臭的原因和解决方法
手脱皮的最快恢复方法
国家药品监督管理局对胶囊剂的装量差异的要求
呀诺达热带雨林:海南三亚的自然奇观与户外探险胜地
算力租赁市场现状与未来发展趋势解析
节水,试试区域再生水循环利用
报效祖国 建功西部:云南累计招募3.5万余名西部计划志愿者
西班牙非盈利居留签证为何再开启移民监?可能与这几点有关
从专科逆袭到斯坦福的山东小伙博士毕业,下一站:北京协和神经外科博士后
PID控制常见手段说明:抗积分饱和+带死区PID+不完全微分+微分先行
项目管理资料整理的十六个核心方法
空气炸锅炸鸡腿
PID控制常见手段说明:抗积分饱和 +带死区PID+不完全微分+微分先行
荷兰画派:黄金时代的绘画
老年人健康体检的好处和重要性
如何进行高效的搬家安排?这种安排有哪些细节需要注意?
烧伤的早期处理:关注军营常见烧烫伤
专科生的社会实践活动对综合素质的提升
平民最爱:5款耐用省油车推荐
自动化工作流:企业数字化转型的智能引擎与效率革命
水象星座有哪些及其个性特征
叶长生 |《笔墨精神》——当代中国画传承与创新百家学术邀请展
如何解读眼镜处方单:度数、散光、瞳距等关键指标详解
什么叫近视眼和远视眼
警惕违建新形态:踩雷的“集装箱房”
解决邻里纠纷的最好方式:调解优先
新天龙八部端游恶人谷副本表现及门派组合策略