我试图理解Kafka中消息丢失的以下行为。简而言之,当经纪人在某些消息处理之后及之后死亡时,所有其他经纪人都会死亡。如果首先死亡的经纪人启动,那么它们出现后就无法赶上其他经纪人。相反,所有其他代理报告错误并重置其偏移量以匹配第一个代理。是否期望这种行为以及确保零消息丢失的更改/设置是什么?
Kafka版本:2.11-0.10.2.0
可重复的步骤
[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)
答案 0 :(得分:3)
检查unclean.leader.election.enable = true,如果是,请将其设置为false,以便只有insync的副本才能成为领导者。如果允许不同步副本成为领导者,则消息可能会被截断并丢失。
答案 1 :(得分:2)
此处回复:https://kafka.apache.org/documentation/#producerconfigs
在考虑完成请求之前,生产者要求领导者收到的确认数量。这可以控制发送记录的持久性。允许以下设置:
- acks = 0如果设置为零,那么生产者将不会等待来自服务器的任何确认。该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,不能保证服务器已经接收到记录,并且重试配置将不会生效(因为客户端通常不知道任何故障)。为每条记录返回的偏移量始终设置为-1。
- acks = 1这意味着领导者会将记录写入其本地日志,但无需等待所有粉丝的完全确认即可做出回应。在这种情况下,如果领导者在确认记录后立即失败,但在关注者复制之前,记录将会丢失。
- acks = all这意味着领导者将等待完整的同步副本集以确认记录。这保证了只要至少一个同步副本仍然存活,记录就不会丢失。这是最强有力的保证。这相当于acks = -1 setting。
默认情况下,acks = 1,因此将其设置为' all' :
您的producer.properties文件中的acks=all