about云开发

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

about云开发 首页 大数据 Kafka 介绍解说 查看内容

kafka分区的 原则是什么?

2019-5-23 12:44| 发布者: pig2| 查看: 22| 评论: 0|原作者: pig2

摘要: 很多成员在设计kafka的时候,感觉该如何设计几个分区而发愁?其实我们要明白kafka分区的目的是为了让数据均衡分区,消费起来更加的均衡。因此我们设计可以根据机器的个人和数据分类来考虑设计分区。比如数据有几个类 ...

很多成员在设计kafka的时候,感觉该如何设计几个分区而发愁?
其实我们要明白kafka分区的目的是为了让数据均衡分区,消费起来更加的均衡。
因此我们设计可以根据机器的个人和数据分类来考虑设计分区。
比如数据有几个类,我们可以设计topic有几个分区。
在我们设计了分区后,如果有充足的机器,我们可以在多设计几个分区,让效率更高。

比如我们爬虫怕数据,传递到kakfa
我们可以根据房子的类型来设计kakfa的topic分区
分区:公寓,商品房,民房等。
可以这样设计,但是这样设计容易数据倾斜,那么我们在这个基础在设计。
比如公寓1+随机数,公寓2+随机数,商品房+随机数
等这样来设计。达到数据均衡,提高效率的目的。上面只是建议,更多大家可以自己想办法
——————————————————————————————————————————————————

更多内容:
Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力:

Kafka的设计也是源自生活,好比是为公路运输,不同的起始点和目的地需要修不同高速公路(主题),高速公路上可以提供多条车道(分区),流量大的公路多修几条车道保证畅通,流量小的公路少修几条车道避免浪费。收费站好比消费者,车多的时候多开几个一起收费避免堵在路上,车少的时候开几个让汽车并道就好了,嗯……

顺便说一句,由于消息是以追加到分区中的,多个分区顺序写磁盘的总效率要比随机写内存还要高(引用Apache Kafka – A High Throughput Distributed Messaging System的观点),是Kafka高吞吐率的重要保证之一。

为了保证数据的可靠性,Kafka会给每个分区找一个节点当带头大哥(Leader),以及若干个节点当随从(Follower)。消息写入分区时,带头大哥除了自己复制一份外还会复制到多个随从。如果随从挂了,Kafka会再找一个随从从带头大哥那里同步历史消息;如果带头大哥挂了,随从中会选举出新一任的带头大哥,继续笑傲江湖。

观点2:

这里其实有2个问题,可以逐一回答  

1.kafka为什么要在topic里加入分区的概念? topic是逻辑的概念,partition是物理的概念,对用户来说是透明的。

producer只需要关心消息发往哪个topic,而consumer只关心自己订阅哪个topic,并不关心每条消息存于整个集群的哪个broker。  为了性能考虑,如果topic内的消息只存于一个broker,那这个broker会成为瓶颈,无法做到水平扩展。

所以把topic内的数据分布到整个集群就是一个自然而然的设计方式。

Partition的引入就是解决水平扩展问题的一个方案。  

如同我在Kafka设计解析(一)里所讲,每个partition可以被认为是一个无限长度的数组,新数据顺序追加进这个数组。

物理上,每个partition对应于一个文件夹。一个broker上可以存放多个partition。

这样,producer可以将数据发送给多个broker上的多个partition,consumer也可以并行从多个broker上的不同paritition上读数据,实现了水平扩展  

2.如果没有分区,topic中的segment消息写满后,直接给订阅者不是也可以吗 ?

“segment消息写满后”,consume消费数据并不需要等到segment写满,只要有一条数据被commit,就可以立马被消费  

segment对应一个文件(实现上对应2个文件,一个数据文件,一个索引文件),一个partition对应一个文件夹,一个partition里理论上可以包含任意多个segment。

所以partition可以认为是在segment上做了一层包装。

 这个问题换个角度问可能更好,“为什么有了partition还需要segment”。

如果不引入segment,一个partition直接对应一个文件(应该说两个文件,一个数据文件,一个索引文件),那这个文件会一直增大。

同时,在做data purge时,需要把文件的前面部分给删除,不符合kafka对文件的顺序写优化设计方案。

引入segment后,每次做data purge,只需要把旧的segment整个文件删除即可,保证了每个segment的顺序写, 


https://blog.csdn.net/weixin_38750084/article/details/82942564

鲜花

握手

雷人

路过

鸡蛋
关闭

推荐上一条 /3 下一条

QQ|小黑屋|about云开发-学问论坛|社区 ( 京ICP备12023829号

GMT+8, 2019-6-11 10:31 , Processed in 0.271975 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2 Licensed

返回顶部