如何影响kafka分区领导选举过程

时间:2017-02-02 07:36:47

标签: apache-kafka

我将为我们的密集消息传递系统设置kafka群集。 目前,我们已经设置了两个kafka集群,一个位于伦敦(LD)作为主要,另一个位于纽约(纽约)作为DR(备份),我们已经使Java客户端将数据从LD复制到NY。

由于Kafka具有内置功能,例如分区,可扩展性复制,高可用性和故障转移目的,因此我们希望创建一个由伦敦和纽约两个服务器组成的更大的集群

但是...

我们遇到纽约和LD服务器之间的连接问题,网络速度非常糟糕。

我已经完成了服务器测试。

生产者配置: - acks = 1(仅需要来自分区负责人的确认) - 发送异步。

  1. 当伦敦的制作人向LD中的经纪人发送消息时,吞吐量为100,000 msg / sec,提供的消息大小为:100bytes => 10MB /秒

  2. 当伦敦的制片人向纽约的经纪人发送消息时,吞吐量为10 msg / sec,提供的消息大小为:100bytes => 1KB /秒

  3. 因此...

    我正在考虑以任何方式确保生产者/消费者利用地方性,这意味着如果他们在同一个网络中,则会向最近的经纪人发送消息。 让我们说:LD中的消费者会向LD的经纪人发送消息。 (我知道写/读请求只发生在分区负责人身上)。

    任何建议都会非常适合。

1 个答案:

答案 0 :(得分:1)

根据我的理解,您目前的结构是:

  • 1位于纽约的经纪人。
  • 1位于LD的经纪人。
  • n个主题。 (我假设主题的数量是1)。
  • 主题上的多个分区。 (我假设分区数是2)。
  • 两个分区都在经纪人身上复制。

您希望使代理位于所有分区的LD领导者中,因此所有生产者都将与此代理进行交互,并且位于NY的代理将用作复制。如果是这种情况,那么您可以执行以下操作:

检查主题的配置:

./kafka-reassign-partitions.sh --reassignment-json-file manual_assign.json --execute

并假设:

  • LD经纪人ID:0
  • NY Broker ID:1

你可以观察代理1(NY)如何处理分区1的领导者,我们想要修改它,为了重新分配分区是必要的:

{"partitions": [
  {"topic": "<topic-name>", "partition": 0, "replicas": [0,1]},
  {"topic": "<topic-name>", "partition": 1, "replicas": [0,1]}
 ],
 "version":1
}

JSON文件的内容:

./kafka-preferred-replica-election.sh

最后,要强制kafka更新领导者,请运行:

Application with identifier 'a67a2a59-9bf8-417c-a59e-809fea872b9d' was not found in the directory c7d9eacc-ff4c-499b-8f7f-de7a2daf9af2

如果没有指定主题列表,那么最后一个命令将影响您创建的所有主题,这不应该是一个问题,但要记住它。

值得一看rule of five,它解释了类似的东西。如果您好奇,可以查看工具this guide的官方文档。