kafka学习笔记(三) --- 分区原理剖析

1. 分区的意义

        我们在使用kafka进行生产和消费消息的时候,肯定是希望能够将数据均匀地分配到各个broker上。比如很多公司使用kafka收集应用服务器上日志数据,这种消息是很多的,特别是对于那些有大批量机器组成的集群环境,可能分分钟都是以GB计数的数据,怎么样的将数据均匀的分散到kafka的各个broker上成为关键。

       kafka中的topic是真正承载数据的逻辑容器,topic下还分若干个分区,也就是kafka的消息组织形式分为三级结构,topic-分区-消息,主题下的每条消息只会保存在一个分区中。分区的真正作用是负载均衡(或者说是实现系统的高伸缩性),以及增加系统的吞吐量。不同的分区可以分配在不同的broker上,数据读写也是针对分区这个粒度来进行的,这样每个broker的机器都能独立处理各自的读写请求。另外,利用分区还可以实现一些业务级别的需求,比如实现业务级别的消息顺序问题。

                                                              

2. 分区的策略

所谓分区策略就是决定将消息分配到哪个分区的算法。介绍一下常见的分区策略:

轮询策略:Round-robin  即顺序分配。生产者生产的消息轮流的往各个分区发消息,比如主题下有3个分区,消息1被分配到0分区,消息2被分配到1分区,消息3被分配到2分区,然后消息4又被分配到0分区,这样一直进行下去。kafka的Java生产者API,如果你不指定partitioner.class参数, 将会默认使用轮询策略分配消息。轮询策略有着非常优秀的负载均衡表现,他总是能将消息最大限度的平均分配到各个分区,所以默认情况下应该是最合理的分区策略。

随机策略:Randomness策略。很显然,就是随机的将消息分配到某个分区,虽然它本质上也是平均分配消息,但是从实现表现上看还是逊于轮询策略的。随机策略是老版本使用的分区策略,新版本已经改为轮询策略。

                             

                                 轮询策略                                                                                  随机策略

按消息键保序策略:Key-ordering策略,这种提法在官网上没有的,是大牛们编的,呵呵。kafka允许为每条消息定义消息键-key。key可以是有着明确的业务含义,如客户代码、部门编号、或者业务ID;也可以用来表征消息元数据,比如时间戳。一旦消息被定义了key,就可以将有着相同key的消息发往相同的分区,又由于每个分区下消息处理都是有顺序的,故称为按消息保序策略。

                                             

其他分区策略:上面讲的都是基础策略,除此之外还有一种有这时间用途的策略,即按照地理位置的分区策略,这种的只针对大规模的集群,特别是跨城市、跨国家、跨大洲的集群。举个例子,在北京和广州各有一个机房,北方用户访问北京机房应用服务,南方用户访问广州机房的应用服务,可以从两个机房中的选取部分机器组成一个kafka集群,可以构建双分区,分别在两个机房中的机器上,北方用户数据发往北京机房broker的分区中,南方用户数据发往广州机房broker的分区中,另外在这两个机房跑着各自的消费者实例。比如南方用户的数据可以随机发往广州机房leader副本所在broker上的任意分区。

综上所述,分区是实现负载均衡和高吞吐量的关键,故再生产端一定要仔细盘算合适的分区策略,避免造成数据倾斜,使得某些分区成为性能瓶颈,这样极易引发下游数据消费的性能下降。

标注:这个系列文章是本人在极客时间专栏---kafka核心技术与实战中的学习笔记

    https://time.geekbang.org/column/article/101171

发布了37 篇原创文章 · 获赞 20 · 访问量 4962

猜你喜欢

转载自blog.csdn.net/qq_24436765/article/details/101378635
今日推荐