关于librdkafka主题创建分区问题,怎么创建分区

问下怎么使用librdkafka创建主题下边的分区。因为我使用其提供的例子,设置主题,当使用的主题不是使用kafka-topic.sh创建的主题,其使用的时候消费者接收不到消息

楼主,我最近一年也在使用librdkafka 进行项目开发,目前该项目已完成,而且产品已经上线了。可以交流学习下心得。
楼主应该对一些概念有些模糊,kafka应用于项目中主要有以下几步:
(1)启动zookeeper (可以自己安装,也可以使用kafka自带的脚本)
(2)启动kafka server
(3)创建主题

对应librdkafka,我们要将broker_list 和 topic 传入进去,但是这里librdkafka中的topic并不是说创建的意思。而是将其与broker_list进行绑定、匹配。表面从broker中获取该topic主题的消息,我只消费该topic的消息,其他主题的消息我不管。也就是说在这个kafka服务起来之前,你得topic
就应该是已经使用kafka_topic.sh创建好了的。

熟悉 Kafka的同学肯定知道,每个主题有多个分区,每个分区会存在多个副本,本文今天要讨论的是这些副本是怎么样放置在 Kafka集群的 Broker 中的。
大家可能在网上看过这方面的知识,网上对这方面的知识是千变一律,都是如下说明的:
为了更好的做负载均衡,Kafka尽量将所有的Partition均匀分配到整个集群上。Kafka分配Replica的算法如下:
将所有存活的N个Brokers和待分配的Partition排序
将第i个Partition分配到第(i mod n)个Broker上,这个Partition的第一个Replica存在于这个分配的Broker上,并且会作为partition的优先副本
将第i个Partition的第j个Replica分配到第((i + j) mod n)个Broker上
假设现在有5个 Broker,分区数为5,副本为3的主题,按照上面的说法,主题最终分配在整个集群的样子如下:
但事实真的是这样的吗?实际上如果真按照这种算法,会存在以下明显几个问题:
所有主题的第一个分区都是存放在第一个Broker上,这样会造成第一个Broker上的分区总数多于其他的Broker,这样就失去了负载均衡的目的;
如果主题的分区数多于Broker的个数,多于的分区都是倾向于将分区发放置在前几个Broker上,同样导致负载不均衡。
所以其实上面的算法不准确。严格来说,上面的算法只是Kafka分配分区的一种特例(下面介绍算法部分会说明)。下面我们从上面的算法可以看出:
副本因子不能大于 Broker 的个数;
第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的;
其他分区的第一个副本放置位置相对于第0个分区依次往后移。也就是如果我们有5个 Broker,5个分区,假设第一个分区放在第四个 Broker 上,那么第二个分区将会放在第五个 Broker 上;第三个分区将会放在第一个 Broker 上;第四个分区将会放在第二个 Broker 上,依次类推;
剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而这个数也是随机产生的;
所以如果我们依次如下调用上面的程序,ret 变量的输出结果会如下:
来看看 Kafka 内部到底是如何将分区分配到各个 Broker 中的,其具体算法实现函数就是 assignReplicasToBrokers,如下:从上面的算法可以看出:
副本因子不能大于 Broker 的个数;
第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的;
其他分区的第一个副本放置位置相对于第0个分区依次往后移。也就是如果我们有5个 Broker,5个分区,假设第一个分区放在第四个 Broker 上,那么第二个分区将会放在第五个 Broker 上;第三个分区将会放在第一个 Broker 上;第四个分区将会放在第二个 Broker 上,依次类推;
剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而这个数也是随机产生的;
所以如果我们依次如下调用上面的程序,ret 变量的输出结果会如下: