3 个回答
Consumer 端丢失场景:既然 Consumer 拉取后消息最终是要提交 Offset, 那么这里就可能会丢数据的!!!
消费主要分为两个阶段:
所以导致数据丢失的原因有:
消费主要分为两个阶段:
1、获取元数据并从 Kafka Broker 集群拉取数据。
2、处理消息,并标记消息已经被消费,提交 Offset 记录。
所以导致数据丢失的原因有:
1、可能使用的「自动提交 Offset 方式」
2、拉取消息后「先提交 Offset,后处理消息」,如果此时处理消息的时候异常宕机,由于 Offset 已经提交了, 待 Consumer 重启后,会从之前已提交的 Offset 下一个位置重新开始消费, 之前未处理完成的消息不会被再次处理,对于该 Consumer 来说消息就丢失了。
3、拉取消息后「先处理消息,再进行提交 Offset」, 如果此时在提交之前发生异常宕机,由于没有提交成功 Offset, 待下次 Consumer 重启后还会从上次的 Offset 重新拉取消息,不会出现消息丢失的情况, 但是会出现重复消费的情况,这里只能业务自己保证幂等性。
发布于:9个月前 (07-28) IP属地:四川省
Broker 端丢失场景:Broker 端消息存储是通过异步批量刷盘的,那么这里就可能会丢数据的!!!
1、由于 Kafka 中并没有提供「同步刷盘」的方式,所以说从单个 Broker 来看还是很有可能丢失数据的。
2、kafka 通过「多 Partition (分区)多 Replica(副本)机制」已经可以最大限度保证数据不丢失,
3、如果数据已经写入 PageCache 中但是还没来得及刷写到磁盘,此时如果所在 Broker 突然宕机挂掉或者停电,极端情况还是会造成数据丢失。
发布于:9个月前 (07-28) IP属地:四川省
Producer 端丢失场景:Producer 端发送数据有 ACK 机制, 那么这里就可能会丢数据的!!!
1、acks = 0:由于发送后就自认为发送成功,这时如果发生网络抖动, Producer 端并不会校验 ACK 自然也就丢了,且无法重试。
2、acks = 1:消息发送 Leader Parition 接收成功就表示发送成功,这时只要 Leader Partition 不 Crash 掉,就可以保证 Leader Partition 不丢数据,但是如果 Leader Partition 异常 Crash 掉了, Follower Partition 还未同步完数据且没有 ACK,这时就会丢数据。
3、acks = -1 或者 all: 消息发送需要等待 ISR 中 Leader Partition 和 所有的 Follower Partition 都确认收到消息才算发送成功, 可靠性最高, 但也不能保证不丢数据,比如当 ISR 中只剩下 Leader Partition 了, 这样就变成 acks = 1 的情况了。
发布于:9个月前 (07-28) IP属地:四川省
我来回答
您需要 登录 后回答此问题!