[英]Messages sent to Kafka REST-Proxy being rejected by “This server is not the leader for that topic-partition” error
对于来自融合平台的Kafka rest-proxy,我们的开发团队和环境支持团队之间一直遇到一些麻烦和不同的理解。
首先,我们有5个Kafka代理的环境,具有64个分区和3的复制因子 。
碰巧,我们对rest-proxy的调用现在都使用以下结构:
curl -X POST \
http://somehost:8082/topics/test \
-H 'content-type: application/vnd.kafka.avro.v1+json' \
-d '{
"value_schema_id":1,
"records":[
{ "foo":"bar" }]}'
这种呼叫对98.4%的呼叫有效,我注意到当我尝试进行2k次以上的呼叫时,我们没有收到来自分区62的任何OK响应(恰好是分区的1.6% )。 在支持团队回收架构注册表之前,当我们有7个分区返回错误时,该错误率曾经是10.9% 。
现在,当呼叫转到分区62时,我们收到以下答复:
{
"offsets": [
{
"partition": null,
"offset": null,
"error_code": 50003,
"error": "This server is not the leader for that topic-partition."
}
],
"key_schema_id": null,
"value_schema_id": 1
}
当我尝试将消息发送到在URL上添加“ / partitions / 62”的特定分区时,该错误相同。
支持人员说rest-proxy不够聪明(他们说, “这只是一个代理” )以选择一个有效的分区并将其发布到该分区的领导经纪人。 他们说,它随机选择分区,然后随机选择要发布的代理(这可能导致它发布到副本或什至没有分区的代理)。 他们建议我们在发布消息之前更改呼叫以获取主题元数据,然后通知分区和代理并在应用程序端处理循环分配,这对我来说没有意义。
在开发方面,我的理解是rest-proxy使用apache kafka-client将消息发布到代理,因此足够聪明,可以将领导者代理发布到给定的分区,并且它还处理不通知分区时的kafka-client lib。 在我看来,这似乎是与该分区有关的环境问题,而不是与呼叫应用程序本身有关的问题(因为在具有相同配置的其他环境中,它可以正常工作)。
综上所述,我的问题是:
希望您能给我一些帮助很清楚!
提前致谢!
我不使用rest-proxy,但是此错误可能表明在调用期间发生NotLeaderForPartitionException
。 此错误表明分区的领导者已更改,但生产者仍使用陈旧的元数据。 当代理之间的复制由于Kafka服务器内部错误而失败时,发生了此错误。 可以在服务器日志中检查。
在我们的案例中,我使用./kafka-topics.sh --describe --zookeeper zookeeper_ip:2181 --topic test
检查了该主题,它显示来自代理的一个副本没有同步(ISR列)。 重新启动该代理程序的帮助,副本变得同步,错误消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.