了解Kafka分区元数据

时间:2016-05-28 13:04:26

标签: node.js apache-kafka

我在NodeJs应用程序中使用kafka-node来通过loadMetadataForTopics选项创建主题。我希望我的应用程序能够动态地了解可用的分区数量,以便它可以在这些分区之间正确地分发消息。

在单个节点Kafka实例中,该方法正在创建主题并返回元数据,如下所示:

  "step1_channelOut": {
    "0": {
      "topic": "step1_channelOut",
      "partition": 0,
      "leader": 1,
      "replicas": [
        1
      ],
      "isr": [
        1
      ]
    }
  },

但是,在三节点群集中,该方法会创建更多条目:

{
    "0": {
        "topic": "step1_channelOut",
        "partition": 0,
        "leader": 3,
        "replicas": [
            3,
            2,
            1
        ],
        "isr": [
            3,
            2,
            1
        ]
    },
    "1": {
        "topic": "step1_channelOut",
        "partition": 1,
        "leader": 1,
        "replicas": [
            1,
            3,
            2
        ],
        "isr": [
            1,
            3,
            2
        ]
    },
    "2": {
        "topic": "step1_channelOut",
        "partition": 2,
        "leader": 2,
        "replicas": [
            2,
            1,
            3
        ],
        "isr": [
            2,
            1,
            3
        ]
    },
    "3": {
        "topic": "step1_channelOut",
        "partition": 3,
        "leader": 3,
        "replicas": [
            3,
            1,
            2
        ],
        "isr": [
            3,
            1,
            2
        ]
    }
}

在这种情况下它创建了4个分区吗?它看起来像我 - 因为这只是最后一种情况(真正明确设置分区)我真的不关心它做什么,只要它是可预测的。那说我控制得越多越好。

zookeeper中的主题信息与kafka服务器上的主题信息之间有什么关系?是否有更好的方法通过nodejs操纵(创建/配置主题)kafka集群?

为什么四个分区?我能理解三个,或一个,但四个?

1 个答案:

答案 0 :(得分:0)

kafka-node的工作方式,它会根据server.properties中的全局Kafka配置创建主题。检查以下值:

num.partitions=12
default.replication.factor=1

经纪人数量和分区数量之间没有自动关系。您可以设置100个代理,但只需要1个主题分区,或者您可以使用1,000个分区设置单个代理。他们没有关系。

没有用于创建主题的非Java API - 至少目前还没有。请参阅我之前未回答的问题 here

如果您想要更多地控制主题的创建方式,但仍希望使用kafka-node进行操作,那么您将需要exec这样的命令:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 12 --topic <topic_name_here>

我在node中使用:

执行此操作
const exec = require('child_process').exec;

function createTopic(topic, replFactor, numPartitions, cb) {
  var zkHost = "localhost:2181";
  var kafkaHome = "/usr/local/kafka";

  exec(
    `${kafkaHome}/bin/kafka-topics.sh --create --zookeeper ${zkHost} -- replication-factor ${replFactor} --partitions ${numPartitions} --topic ${topic}`,
    (error,stderr,stdout) => cb(topic)
  );
}