Kafka数据丢失解决方案

producer 数据不丢失:

  1. 同步模式:配置=1 (只有Leader收到,-1 所有副本成功,0 不等待)Leader Partition挂了,数据就会丢失
    解决:设置 -1 保证produce 写入所有副本算成功 producer.type = sync request.required.acks=-1

  2. 异步模式,当缓冲区满了,如果配置为0(没有收到确认,一满就丢弃),数据立刻丢弃
    解决:不限制阻塞超时时间。就是一满生产者就阻塞

producer.type = async

request.required.acks=1

queue.buffering.max.ms=5000

queue.buffering.max.messages=10000

queue.enqueue.timeout.ms = -1

batch.num.messages=200

Customer 不丢失数据

  1. 在获取kafka的消息后正准备入库(未入库),但是消费者挂了,那么如果让kafka自动去维护offset它就会认为这条数据已经被消费了,那么会造成数据丢失。
    解决:使用kafka高级API,自己手动维护偏移量,当数据入库之后进行偏移量的更新(适用于基本数据源)

流式计算。高级数据源以kafka为例,由2种方式:receiver (开启WAL,失败可恢复) director (checkpoint保证)

流处理中的几种可靠性语义:

  1. at most once 每条数据最多被处理一次(0次或1次),会出现数据丢失的问题

  2. at least once 每条数据最少被处理一次(1次或更多),这个不会出现数据丢失,但是会出现数据重复

  3. exactly once 每种数据只会被处理一次,没有数据丢失,没有数据重复,这种语义是大家最想实现的,也是最难实现的

但是开启WAL后,依旧存在数据丢失问题,原因是任务中断时receiver 也被强行终止了,将会造成数据丢失

在Streaming程序的最后添加代码,只有在确认所有receiver都关闭的情况下才终止程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章