咨询个kafka 分区迷惑

dydt 2017-11-24 04:48:32
最近在看kafka,对分区的部分,有点不太理解。

一个topic可以分为多个分区,每个分区可以在不同的物理broker上,producer 发布的时候,kafka会符合分担发布到各个分区上,consumer 从某个分区上消费

这个容易理解,但和另一个概念混在一起,就糊涂了。

这几个分区有一个leader,其余的都是replication,而leader又是负责读写的,其余的都是做同步,但producer发布的时候,不是均匀发布到各个分区上的吗?

举个例子,比如有4个物理broker,一个topic在每个broker上都有一个partition,总共4个partition;

producer发布这个topic的时候,一个会发给partition-1,一会发给partition-4,反正4个partition轮着来,那岂不是每个partition都在读写?怎么会是只有leader负责读写呢?

而且,当producer发布给partition-1的时候,怎么和其他三个partition做同步的呢?

是不是应该理解为,针对partition-1,在其他3个broker上,有三个partition-1的备份; 同样的,针对partition-4,在其他3个borker上也有三个partition-4的备份?

如果这样,那岂不是每个broker上都有4个partition,4台broker总共就有16个partition了?

对不起,CSDN新注册的,可用分很少
...全文
478 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zzreal 2017-12-09
  • 打赏
  • 举报
回复
引用 5 楼 Zonzereal 的回复:
[quote=引用 4 楼 qq_18998193 的回复:] [quote=引用 2 楼 Zonzereal 的回复:] partition是针对topic的一个概念,不是针对broker的。按你上面例子,只有一个topic,尽管分布在4个broker上,topic只有一个,然后topic的分区是partition[1-4],分区也只有4个。你把逻辑上的概念和物理上的概念混淆了。 Replication是为了容错,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。如果你的4个partition副本数是1,你的集群上也只有4个partition(每个partition都是leader);如果你的副本数有很多,集群上每个分区会有对应数量的镜像分区,你的每个分区及它的镜像有自己的leader(可以理解为4组),负责读写,其他镜像分区负责备份。Replication是针对你partition的每一个分区的。 所以,“当producer发布给partition-1的时候,怎么和其他三个partition做同步的呢?“,当producer发布给partition-1的时候,不是和其他三个分区做同步,而是和partition-1的镜像分区做同步
发现网上很多人说法不一样,越看越迷糊。举个例子吧,比如现在有4个borker,一个topic就只配了三个partition,那么有一个borker上没有分区,没问题; 比如现在这个topic的leader 分区在broker1上,broker2和3都是replication 然后producer发布消息,指定这个topic发布消息,那这个producer是发布到broker1上的分区,还是会轮询发给三个broker呢?按照理解,应该是发给broker1上,然后broker2和3自己去同步,如果broker1歇菜了,会从broker2和3中间选举一个leader,然后发到这个新leader上。 网上有人说是会发到三个broker上,比如 https://zhidao.baidu.com/question/562744398236432764.html 上是这么答复人家的: ---------------------------- 若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈。 有了分区后,假设一个topic可能分为10个分区,kafka内部会根据一定的算法把10分区尽可能均匀分布到不同的服务器上,比如:A服务器负责topic的分区1,B服务器负责topic的分区2,在此情况下,Producer发消息时若没指定发送到哪个分区的时候,kafka就会根据一定算法上个消息可能分区1,下个消息可能在分区2。当然高级API也能自己实现其分发算法。 ---------------------------[/quote] 以上这种说法应该是不正确的,这种情景下,4个broker上都会有这个topic,而且都会有三个分区,然后每个分区再做repilcation容错。 这是官网上的一张图,官网带的解释如下: Consumers label themselves with a consumer group name, and each record published to a topic is delivered to one consumer instance within each subscribing consumer group. Consumer instances can be in separate processes or on separate machines. 意思是:日志的分区partition (分布)在Kafka集群不同的服务器上,每一台服务器处理数据和请求的时候,共享这些分区。每一个分区都会配置服务器备份数量,保证容错. 如果有搞不清楚的地方或者网上说法不一致的,去官网看,官网是最权威的解释,如果官网的英文看不懂,可以看ApacheCN,有团队在翻译官网,但是翻译总是会有作者主观理解,个人还是建议看英文官网[/quote] sorry,可能官网的英文粘错了,应该是这句The partitions of the log are distributed over the servers in the Kafka cluster with each server handling data and requests for a share of the partitions. Each partition is replicated across a configurable number of servers for fault tolerance. 上面那句是解释那个图消费者组的相关问题的。现在贴的这句是关于图中topic和分区关系的。可以参看一篇博客来理解,kafka分区原理图 http://blog.csdn.net/liuwei063608/article/details/46378863
Zzreal 2017-12-09
  • 打赏
  • 举报
回复
引用 4 楼 qq_18998193 的回复:
[quote=引用 2 楼 Zonzereal 的回复:]
partition是针对topic的一个概念,不是针对broker的。按你上面例子,只有一个topic,尽管分布在4个broker上,topic只有一个,然后topic的分区是partition[1-4],分区也只有4个。你把逻辑上的概念和物理上的概念混淆了。
Replication是为了容错,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。如果你的4个partition副本数是1,你的集群上也只有4个partition(每个partition都是leader);如果你的副本数有很多,集群上每个分区会有对应数量的镜像分区,你的每个分区及它的镜像有自己的leader(可以理解为4组),负责读写,其他镜像分区负责备份。Replication是针对你partition的每一个分区的。
所以,“当producer发布给partition-1的时候,怎么和其他三个partition做同步的呢?“,当producer发布给partition-1的时候,不是和其他三个分区做同步,而是和partition-1的镜像分区做同步


发现网上很多人说法不一样,越看越迷糊。举个例子吧,比如现在有4个borker,一个topic就只配了三个partition,那么有一个borker上没有分区,没问题;

比如现在这个topic的leader 分区在broker1上,broker2和3都是replication

然后producer发布消息,指定这个topic发布消息,那这个producer是发布到broker1上的分区,还是会轮询发给三个broker呢?按照理解,应该是发给broker1上,然后broker2和3自己去同步,如果broker1歇菜了,会从broker2和3中间选举一个leader,然后发到这个新leader上。

网上有人说是会发到三个broker上,比如
https://zhidao.baidu.com/question/562744398236432764.html 上是这么答复人家的:
----------------------------
若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈。 有了分区后,假设一个topic可能分为10个分区,kafka内部会根据一定的算法把10分区尽可能均匀分布到不同的服务器上,比如:A服务器负责topic的分区1,B服务器负责topic的分区2,在此情况下,Producer发消息时若没指定发送到哪个分区的时候,kafka就会根据一定算法上个消息可能分区1,下个消息可能在分区2。当然高级API也能自己实现其分发算法。
---------------------------[/quote]


以上这种说法应该是不正确的,这种情景下,4个broker上都会有这个topic,而且都会有三个分区,然后每个分区再做repilcation容错。

这是官网上的一张图,官网带的解释如下:
Consumers label themselves with a consumer group name, and each record published to a topic is delivered to one consumer instance within each subscribing consumer group. Consumer instances can be in separate processes or on separate machines.
意思是:日志的分区partition (分布)在Kafka集群不同的服务器上,每一台服务器处理数据和请求的时候,共享这些分区。每一个分区都会配置服务器备份数量,保证容错.
如果有搞不清楚的地方或者网上说法不一致的,去官网看,官网是最权威的解释,如果官网的英文看不懂,可以看ApacheCN,有团队在翻译官网,但是翻译总是会有作者主观理解,个人还是建议看英文官网
dydt 2017-12-08
  • 打赏
  • 举报
回复
引用 2 楼 Zonzereal 的回复:
partition是针对topic的一个概念,不是针对broker的。按你上面例子,只有一个topic,尽管分布在4个broker上,topic只有一个,然后topic的分区是partition[1-4],分区也只有4个。你把逻辑上的概念和物理上的概念混淆了。 Replication是为了容错,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。如果你的4个partition副本数是1,你的集群上也只有4个partition(每个partition都是leader);如果你的副本数有很多,集群上每个分区会有对应数量的镜像分区,你的每个分区及它的镜像有自己的leader(可以理解为4组),负责读写,其他镜像分区负责备份。Replication是针对你partition的每一个分区的。 所以,“当producer发布给partition-1的时候,怎么和其他三个partition做同步的呢?“,当producer发布给partition-1的时候,不是和其他三个分区做同步,而是和partition-1的镜像分区做同步
发现网上很多人说法不一样,越看越迷糊。举个例子吧,比如现在有4个borker,一个topic就只配了三个partition,那么有一个borker上没有分区,没问题; 比如现在这个topic的leader 分区在broker1上,broker2和3都是replication 然后producer发布消息,指定这个topic发布消息,那这个producer是发布到broker1上的分区,还是会轮询发给三个broker呢?按照理解,应该是发给broker1上,然后broker2和3自己去同步,如果broker1歇菜了,会从broker2和3中间选举一个leader,然后发到这个新leader上。 网上有人说是会发到三个broker上,比如 https://zhidao.baidu.com/question/562744398236432764.html 上是这么答复人家的: ---------------------------- 若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈。 有了分区后,假设一个topic可能分为10个分区,kafka内部会根据一定的算法把10分区尽可能均匀分布到不同的服务器上,比如:A服务器负责topic的分区1,B服务器负责topic的分区2,在此情况下,Producer发消息时若没指定发送到哪个分区的时候,kafka就会根据一定算法上个消息可能分区1,下个消息可能在分区2。当然高级API也能自己实现其分发算法。 ---------------------------
dydt 2017-12-08
  • 打赏
  • 举报
回复
引用 2 楼 Zonzereal 的回复:
partition是针对topic的一个概念,不是针对broker的。按你上面例子,只有一个topic,尽管分布在4个broker上,topic只有一个,然后topic的分区是partition[1-4],分区也只有4个。你把逻辑上的概念和物理上的概念混淆了。 Replication是为了容错,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。如果你的4个partition副本数是1,你的集群上也只有4个partition(每个partition都是leader);如果你的副本数有很多,集群上每个分区会有对应数量的镜像分区,你的每个分区及它的镜像有自己的leader(可以理解为4组),负责读写,其他镜像分区负责备份。Replication是针对你partition的每一个分区的。 所以,“当producer发布给partition-1的时候,怎么和其他三个partition做同步的呢?“,当producer发布给partition-1的时候,不是和其他三个分区做同步,而是和partition-1的镜像分区做同步
好像被你这么一说懂了,非常感谢!
Zzreal 2017-12-05
  • 打赏
  • 举报
回复
partition是针对topic的一个概念,不是针对broker的。按你上面例子,只有一个topic,尽管分布在4个broker上,topic只有一个,然后topic的分区是partition[1-4],分区也只有4个。你把逻辑上的概念和物理上的概念混淆了。 Replication是为了容错,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。如果你的4个partition副本数是1,你的集群上也只有4个partition(每个partition都是leader);如果你的副本数有很多,集群上每个分区会有对应数量的镜像分区,你的每个分区及它的镜像有自己的leader(可以理解为4组),负责读写,其他镜像分区负责备份。Replication是针对你partition的每一个分区的。 所以,“当producer发布给partition-1的时候,怎么和其他三个partition做同步的呢?“,当producer发布给partition-1的时候,不是和其他三个分区做同步,而是和partition-1的镜像分区做同步
水草有根 2017-12-05
  • 打赏
  • 举报
回复
partition是为了性能,replication是为了容错。 数据按照partition规则写到不同的partition里, 每个partition都有至少一份replication(根据配置的复制因子)

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧