【博学谷学习记录】超强总结,用心分享|Kafka如何保证数据不丢失
Kafka如何保证数据不丢失
1 生产端如何保证数据不丢失
当生产者将数据生产到Broker后,Broker会给予一个ack确认响应,在Kafka中, 主要提供了三种ack的方案:
(1)0:生产者只管发送数据,不关心且不接受Broker的相应;
(2)1:生产者将数据发送到Broker端,需要等待Broker端对应的topic上的对应的分片的主副本接收到消息后, 才认为发送成功;
(3)-1(ALL):生产者将数据发送到Broker端,需要等待Broker端对应的topic上的对应的分片的所有的副本接收到消息后, 才认为发送成功。
从效率角度来看:0 > 1 > -1
从安全角度来看:-1 > 1 > 0
注意:在实际开发应用中,一般根据数据的重要程度来选择采用什么方案,如果数据非常重要,则认为不能丢失,一般设置成-1。
2 生产端如何保证数据不丢失-相关思考
思考1:如果Broker 一直没有给ack响应,如何解决?
解决方案:设置超时时间,如果超时则触发重试策略,如果多次重试依然无法给予响应,此时程序报异常。
思考2:每发送一次,Broker就要给予一次响应,请问这样是否会对网络带宽产生影响呢? 如果产生, 如何解决呢?
解决方案:会,引入缓存池,满足了一批数据后,异步发送给Broker端,Broker端只需要针对这一批数据给予一次响应即可。
思考3:通过一批一批的异步发送方式, 如果Broker端对这一批数据没有给予响应,但是缓存池中数据已经满了,如何解决?
解决方案:选择清空缓存池 / 不清空,如果数据是可重复读的,那么直接让程序报错即可,通知处理。处理后,重新获取发送即可,如果数据是不可重复读,为了避免此种问题,我们可以数据先在某个其他位置保存(备份),当数据生产成功,删除对应的数据,生产不成功,,后续直接从保存的位置中获取生产即可。
buffer.memory : 缓存池的大小
默认值: 33554432(32M)
retries: 重试次数
默认值: 2147483647 (此参数并不代表最终的重试次数, 取决于超时相关参数)
delivery.timeout.ms: 一次发送数据总超时时间
默认值: 120000(120s)
request.timeout.ms: 一次请求超时时间
默认值: 30000(30s)
一批数据的阈值: 时间 和 大小
batch.size : 一批数据大小
默认值: 16384 (16kb)
linger.ms : 每一批次的间隔时间
默认值: 0
3 Broker端如何保证数据不丢失
保证方案: 磁盘存储 + 多副本 + ack为-1
4 消费端如何保证数据不丢失
第一步: 当Consumer启动后,连接Kafka集群,根据group.id 到Kafka中寻找上一次消费到了什么位置(偏移量);
第二步:
如果consumer找到了上次消费位置,接着从这个位置开始消费数据;
如果没有找到上一次消费的位置,说明第一次来,这个时候默认从当前时刻开始消费数据,消费的位置也会从当前这个消息的偏移量位置开始消费;
第三步: 消费者开始消费数据,在消费的过程中,每消费完数据后,都要和kafka集群进行汇报,汇报当前消费到了那一个偏移量信息。
汇报方式: 自动 / 手动