大数据|kafka如何实现无消息丢失
kafka如何实现无消息丢失 1:kafka什么情况下才能保证消息不丢失了?
kafka只对已提交的消息做有限度的持久化保存
A:什么是已提交消息,kafka的broker成功的接收到一条消息并成功的写入到日志文件中后,会告诉生产者这条消息已提交成功,此时这条消息在kafka看来是已提交消息。至于要多少个broker告诉生产者,这个需要设置
kafka的ACK机制了,0,1,-1
【大数据|kafka如何实现无消息丢失】2:目前kafka Produce是异步发送消息的,也就是说kafka调用了producer.send(msg)之后会立即返回,但是此时消息不一定能确保异步发送的消息一定是成功的。这个过程没有任何返回的状态之类的机制,消息出现丢失我们是根本不知道的。
解决办法:
A:我们不调用上面的方法,而是调用:producer.send(msg,callback)方法,这个方法中多了一个callback的回调,该参数能准确的告诉我们消息是否提交成功,一旦消息失败我们就能知道,然后做后续的处理。
B:例如因为网络的瞬时抖动导致数据未能提交成功,这种场景让producer重试就可以,要是消息体不符合规范,那么我们可以修改消息体然后重新发送,总而言之,处理消息发送失败的责任是在Producer端。
C:要是consumer端丢数据,需要维护好消费者位移就行,我们手动的去维护位移,即消息处理完之后再u维护位移变更,这种情况可以保正数据不丢失,但是数据会重复,重复问题我们可以自己来解决。
3:确保消息不丢失方案
A:不要使用producer.send(msg)方法,而是使用producer.send(msg,callback)。
B:设置producer端ack=all,意思就是所有的broker都要接收到消息才算消息发送成功。
C:设置producer端的retries为一个较大的值,大于0即可,及时消息发送失败之后重试消息的次数。
D:broker参数unclean.leader.election.enable=false,这个是broker的参数,意思就是不让那些落后太多的broker副本竞选leader,防止数据丢失。
E:replication.factor >= 3 broker参数,消息副本数尽量大于等于3个。
F:broker参数min.insync.replicas > 1 意思就是消息至少被写入到少个副本才算提交,默认是1,但是最好不要使用,起码也得 大于1。
G:确保replication.factor > min.insync.replicas 。如果两者相等,只要有一个副本挂机,整个分区就无法正常工作,我们保证数据不丢失和不影响性能的情况下,设置replication.factor = min.insync.replicas + 1 ,(例如:假如副本数是3,则min.insync.replicas设置为2)
H:使用手动提交位移的方式,enable.auto.commit=false,采用手动提交位移的方式。
推荐阅读
- 我要做大厨
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 知识
- 三十年后的广场舞大爷
- 奔向你的城市
- 村里的故事|村里的故事 --赵大头
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 汇讲-勇于突破