卡夫卡经纪人对领导层变更的消息丢失情况
问题描述:
我想了解卡夫卡消息丢失的以下行为。简而言之,当一个经纪人很早就死去,随后在一些消息处理之后,所有其他经纪人都会死亡。如果首先死亡的经纪人开始上市,那么他们出现后就不会赶上其他经纪人。相反,所有其他经纪人都会报告错误并重置抵消额以匹配第一个经纪人。预期这种行为,以及确保零消息丢失的更改/设置是什么?卡夫卡经纪人对领导层变更的消息丢失情况
卡夫卡版本:2.11-0.10.2.0
重现步骤
- 开始1个饲养员实例和3个卡夫卡经纪人
- 创建一个话题的3复制因子和3
- 分区附加卡夫卡控制台消费者专题
- 使用的卡夫卡控制台生产者生产2条消息
- 名杀害两名经纪人(1 & 2)
- 发送两条消息
- 杀死最后剩余的经纪人(0)
- 造就经纪人(1)谁没有见过的最后两个消息
- 造就经纪人(2 )谁见过的最后两条消息,它显示了一个错误
[2017-06-16 14:45:20,239] INFO Truncating log my-second-topic-1 to offset 1. (ka fka.log.Log) [2017-06-16 14:45:20,253] ERROR [ReplicaFetcherThread-0-1], Current offset 2 for partition [my-second-topic,1] out of range; reset offset to 1 (kafka.server.Rep licaFetcherThread)
- 最后连接kafka-console-consumer,它会看到两条消息,而不是已发布的四条消息。
答
响应这里:https://kafka.apache.org/documentation/#producerconfigs
确认的数量生产者要求领导者在考虑一个请求完成之前已经收到了。这将控制发送的记录的持久性。允许以下设置:
- acks = 0如果设置为零,则生产者根本不会等待来自服务器的任何确认。该记录将被立即添加到套接字缓冲区并被视为已发送。在这种情况下,不能保证服务器已经收到记录,并且重试配置不会生效(因为客户端通常不会知道任何故障)。为每条记录返回的偏移量始终设置为-1。
- acks = 1这将意味着领导会将记录写入其本地日志,但会在未等待所有追随者完全确认的情况下作出响应。在这种情况下,如果领导者在承认记录后但在追随者复制之前立即失败,那么记录将会丢失。
- acks = all这意味着领导者将等待全套的in-sync副本确认记录。这保证只要至少有一个同步副本保持活动状态,记录就不会丢失。这是最强有力的保证。这相当于acks = -1设置。
默认情况下的ACK = 1,以便将其设置为 '所有': acks=all
在producer.properties文件
答
检查unclean.leader.election.enable =真,如果是这样,将其设置以使只有insync的复制品才能成为领导者。如果允许不同步复制品成为领导者,则消息可能会被截断并丢失。