问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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 等)可以有效降低丢数据风险。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号