Kafka如何保证数据不丢失?


一、Kafka中数据是怎么传输的?

Kafka中数据传输分为三步:

  • Producer端将消息发送给Broker
  • Broker端将消息进行同步并持久化
  • Consumer端从Broker将消息拉取并消费

二、Kafka如何保证数据不丢失?

因为Kafka中数据是分为三步传输的,所以我们也需要分别从这三步里去分析如何保证数据不丢失。

1、Producer

  • 同步发送+重试:异步发送改为同步发送,监听callback回调,并进行重试
  • acks机制:配置acks机制,保证所有副本都同步完数据才算成功
    • acks=0:表示Producer不需要等Broker返回确认就认为发送成功,会存在消息丢失
    • acks=1:表示Producer会等Leader副本返回确认就认为发送成功(不需要等Follower副本同步完成),如果这时候Leader副本挂了,会存在消息丢失
    • acks=-1:表示Producer会等Leader副本和ISR列表里的Follower副本都同步完成才认为发送成功,不存在消息丢失,但是性能比较差

相关配置参数如下:

yaml
acks: -1                // 确认机制
retries: 3              // Producer重试次数
retry.backoff.ms: 300  // 消息发送超时或失败后的间隔重试时间

2、Broker

  • ISR机制:ISR列表指同步进度较好的副本(包括Leader副本和Follower副本),每个partition都有多个副本分布在不同节点上,当一个节点宕机时,其他节点的副本仍然可以提供服务,保证数据不丢失
  • 持久化存储:Kafka会将消息写入磁盘,防止节点宕机导致数据丢失(为了保证性能,Kafka采用了异步批量刷盘机制,即达到一定数据量或时间间隔才会刷盘)

相关配置参数如下:

yaml
replication.factor: 3                  // 表示分区副本数量(一般大于1才能保证Leader副本宕机后能正常选举新的Leader副本)
min.insync.replices: 3                 // 表示ISR最少的副本数量
unclean.leader.election.enable: false  // 是否可选举非ISR列表中的副本做Leader副本

3、Consumer

  • 手动提交offset:关闭自动提交offset功能,防止消费者还没正常消费完就提交了offset,导致数据丢失

相关配置参数如下:

yaml
enable.auto.commit: false // 不自动提交offset

文章作者: GaryLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GaryLee !