首页 文章

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

提问于
浏览
0

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

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

但...

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

我已经进行了服务器测试 .

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

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

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

所以...

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

任何建议都会非常适合 .

1 回答

  • 0

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

    • 1经纪人位于纽约州 .

    • 1位于LD的经纪人 .

    • n个主题 . (我将假设主题的数量是1) .

    • n主题上的多个分区 . (我假设分区数是2) .

    • 两个分区都在代理上复制 .

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

    检查主题的配置:

    ./kafka-topics.sh --describe --topic stream-log
    
    Topic:<topic-name>    PartitionCount:2    ReplicationFactor:2 Configs:
      Topic: stream-log   Partition: 0    Leader: 0   Replicas: 0,1 Isr: 0,1
      Topic: stream-log   Partition: 1    Leader: 1   Replicas: 1,0 Isr: 1,0
    

    并假设:

    • LD经纪人ID:0

    • NY Broker ID:1

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

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

    JSON文件的内容:

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

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

    ./kafka-preferred-replica-election.sh
    

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

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

相关问题