Kafka 为什么不丢数据 + 为什么快
·
一、Kafka 如何保证数据不丢失
1)生产端(Producer)不丢数据
关键点:必须等 Kafka 确认写入成功
1.acks 参数
-
acks=1:Leader 写入即确认(可能丢)
-
acks=all 或 -1:Leader + 所有 ISR 副本都写入才成功
-
→ 这是不丢数据的核心
2.重试机制
- retries > 0 + 合理超时
- 避免网络抖动导致误以为发送失败
3.幂等性 producer
- enable.idempotence=true
- 防止重试导致重复发送
4.事务 producer(可选)
- 跨分区、跨会话的 Exactly-once 语义
生产端不丢的最简配置: acks=all + 重试 + 幂等
2)Kafka 服务端(Broker)不丢数据
关键点:副本机制 + 刷盘策略
1.副本因子 replication.factor >= 3
- 至少 1 主 N 从
2.ISR 机制
- 只有跟得上 Leader 的副本才在 ISR 里
- min.insync.replicas >= 2
- → 保证至少有 2 个副本写入成功
3.刷盘策略
- Kafka 默认异步刷盘,靠多副本保证可靠性,不靠刷盘
- 真要极稳:可调整刷盘参数,但会牺牲性能
4.不允许 unclean 选举
- unclean.leader.election.enable=false
- 避免 ISR 外的落后副本被选为 Leader 丢数据
Broker 不丢核心:
多副本 + ISR + 禁止脏选举
3)消费端(Consumer)不丢数据
关键点:先消费,再提交偏移量
1.关闭自动提交
- enable.auto.commit=false
2.手动提交 offset
- 业务处理成功后,再手动 commit
- 失败则不提交,下次重新消费
3.消费失败处理
- 重试队列 / 死信队列(DLQ)
- 不要直接吞异常丢消息
消费端不丢核心:
手动提交 + 业务成功再 commit
二、Kafka 为什么这么快?
核心一句话:
顺序读写 + 页缓存 + 零拷贝 + 批量压缩 + 分区并发
1)磁盘顺序写,比随机内存还快
-
Kafka 几乎只做顺序追加写
-
磁盘顺序读写速度 ≈ 内存随机读写
-
不删不改,只追加,极快
2)大量使用操作系统 PageCache
- 数据先写内存页缓存,不是直接落盘
- 读数据优先读内存,不碰磁盘
- 生产消费都在内存交互,极快
3)零拷贝(Zero-Copy)
- 数据直接从文件通道 → 网卡
- 不经过用户态 / 内核态多次拷贝
- 少 CPU、少内存拷贝、少 IO
4)批量发送、批量拉取
- Producer 批量攒消息再发送
- Consumer 批量拉取
- 减少网络 IO 次数,提升吞吐量
5)消息压缩
- 支持 gzip、snappy、lz4、zstd
- 批量压缩,网络传输量大幅下降
6)分区并发(Partition)
- 一个 Topic 多分片
- 多 Producer、多 Consumer 并行读写
- 水平扩展,线性提升速度
7)无锁 / 轻锁设计
- 底层数据结构简单:日志文件 + 索引
- 几乎无锁竞争,高并发下依然快
更多推荐


所有评论(0)