kafka丢数据和数据重复

首先这个是我的原创文章,也参考了网络上的各位大神的文章加上自己的总结,欢迎各位大神指出错误!我们共同进步!

1.kafka的数据交换是在哪里完成?
kafka设计的初衷是 尽一切努力在内存中完成数据交换 ,无论是对外的系统,或是内部存底层的操作系统的交互.如果Producer和Consumer之间生产和消费进度上配合得当,完全可以实现数据交换零I/O,但是这个几乎
不可能
2.kafka缓存的数据在哪里?
Kafka中使用broker来接受Producer和Consumer的请求,并把Message持久化到本地磁盘
3.kafka数据怎么丢?
3.1对于broker,落盘的数据,除非磁盘坏了.会丢
3. 2对于内存中没有flush(清洗)的,broker重启会丢
flush(清洗)是kafka的内部机制,kafka优先在内存中完成数据的交换,Kafka始终以O(1)的时间复杂度将数据持久化到磁盘.kafka首先会把数据缓存(缓存到内存中)起来再批量flush.
可以通过log.flush.interval.messages和log.flush.interval.ms来配置flush间隔
但在0.8.0版本,可以通过replica机制保证数据不丢.
代价就是需要更多资源,尤其是磁盘资源,kafka当前支持GZip和Snappy压缩,来缓解这个问题
是否使用replica(副本)取决于在可靠性和资源代价之间的balance(平衡)
replica(副本)是kafka的一种机制
3.3producer到broker
生产者是推数据(Push)
把request.required(必需的).acks(确认)设为1,丢会重发,丢的概率很小
3.4broker到 Consumer
kafka的consumer提供两种接口.
一种是一种high-level版本
这个是kafka与其他结合的时候比如有storm-kafka-0.8-plus (或其他的spark插件的时候)
已经封装了对partition和offset的管理,默认是会定期自动commit offset,这样可能会丢数据的
,一low-level版本
这个是kafka与其他结合的时候比如有storm-kafka-0.8-plus(或其他的spark插件的时候)

自己管理spout线程和partition之间的对应关系和每个partition上的已消费的offset(定期写到zk)

并且只有当这个offset被storm ack后,即成功处理后,才会被更新到zk,所以基本是可以保证数据不丢的

即使spout线程crash(崩溃),重启后还是可以从zk中读到对应的offset

4.kafka数据重复
kafka设计的时候是设计了(at-least once)至少一次的逻辑
这样就决定了数据可能是重复的
kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除
kafka的数据重复一般情况下应该在消费者端,这时
log.cleanup.policy = delete使用定期删除机制
5.如果上面的还不能禁止重复消费?
我们可以借助于其他工具来实现,比如可以用redis.将kafka的数据存储到redis中,在redis中去重.
或者也是可以使用编码的形式去重(kafka有api来编码)
6.但是使用redis或编码会产生新的问题?
如果连接kafka出问题了,或数据redis没数据了,怎么办.这个就是一个无解的问题了




你可能感兴趣的:(kafka,kafka丢数据的形式,数据)