kafka分区分布

kafka分区分布,第1张

查看topic的分区情况

bin/kafka-topics.sh --zookeeper 192.168.1.6:2181 --describe --topic test

partiton: partion id,由于此处只有一个partition,因此partition id 为0

leader:负责处理消息的读和写,当前负责读写的lead broker id,leader是从所有节点中随机选择搜答的.

replicas:列出了所有的副本节点,不管节点是否在服务中.

isr:是正在服务中的节点.(relicas的子集,只锋漏山包银中含出于活动状态的broker)

如上图:

Topic: test1

分区0在 broker 0, broker 1 ,broker 2 都有分布,其中broker 0是leader,其余是副本

分区1在 broker 0, broker 1 ,broker 2 都有分布,其中broker 1是leader,其余是副本

分区2在 broker 0, broker 1 ,broker 2 都有分布,其中broker 2是leader,其余是副本

分区的原因

(1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;

(2)可以提高并发,因为可以以Partition为单位读写了

(1)  指明 partition 的情况下,直接将指明的值直接作为 partiton 值;

(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;

(3) 既没有 partition 值又没有 key 值的情况下, kafka采用Sticky Partition(黏性分区器),会 随机选择一个分区,并尽可能一直使用该分区,待该分区的batch已满或者已完成,kafka再随机一个分区进行使用.(以前是一条条的轮询,现在是一批次的轮询)

在 Kafka内部存在两种默认的分区分配策略:Range和 RoundRobin,StickyAssignor。

Range是默认策略。肆衫Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区裂歼腔的个数除以消改大费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。

C1-0 将消费 0, 1, 2, 3 分区

C2-0 将消费 4, 5, 6 分区

C2-1 将消费 7, 8, 9 分区

第一步:将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程。

我们再来看一下StickyAssignor策略,“sticky”这个单词可以翻译为“粘性的”,Kafka从0.11.x版本开始引入这种分配策略,它主要有两个目的:

分区的分配要尽可能的均匀,分配给消费者者的主题分区数最多相差一个;

分区的分配尽可能的与上次分配的保持相同。(遇到一个消费者挂掉的情况

,会把挂掉消费者上的分区再分配,而不是全部重新分配)

来自《kafka权威指南》第5章

Kafka 的基本存储单元是分区。分区无法在多个broker 间进行再细分,也无法在同一个broker 的多个磁盘上进行再细分。 所以,分区的大小受到单个挂载点可用空间的限制(一个挂载点由单个磁盘或多个磁盘组成,如果配置了 JBOD ,就是单个磁盘,如果配置了RAID ,就是多个磁盘)。

在配置 Kafka 的时候,管理员指定了一个用于存储分区的目录清单一一也就是 log.dirs参数的值(不要把它与存放错误日志的目录混淆了,日志目录是配置在 log4j.properties 文件里的)。该参数一般会包含每个挂载点的目录。

接下来我们会介绍 Kafka 是如何使用这些目录来存储数据的。首先,我们要知道数据是如何被分配到集群的 broker 上以及 broker 的目录里的。然后,我们还要知道 broker 是如何管漏森和理这些文件的,特别是如何进行数据保留的。随后,我们会深入探讨文件和索引格式。最后,我们会讨论日志压缩及其工作原理。日志压缩是kafka的一个高级特性,因为有了这个特性, Kafka 可以用来长时间地保存数据。

在创建主题时, Kafka 首先会决定如何在 broker 间分配分区。假设你有6个 broker ,打算创建 一个包含 10 个分区的主题,并且复制系数为3 。那么 Kafka 就会有 30 个分区副本,它们可以被分配给 6个broker 。在进行分区分配时,我们要达到如下的目标。

为分区和 副本选好合适的 broker 之后,接下来要决定这些分区应该使用哪个目录。我们单独为每个分区返盯分配目录,规则很简单 :计算每个目录里的分区数量,新的分区总是被添加到数量最小的那个目录里。也就是说,如果添加了一个新磁盘,所有新的分区都会被创建到这个磁盘上。因为在完成分配工作之前,新磁盘的分区数量总是最少的。

要注意,在为 broker 分配分区时并没有考虑可用空间和工作负载问题,但在

将分区分配到磁盘上时会考虑分区数量,春裂不过不考虑分区大小 。也就是说,

如果有些 broker 的磁盘空间比其他 broker 要大(有可能是因为集群同时使

用了旧服务器和新服务器),有些分区异常大,或者同一个 broker 上有大小

不同的磁盘,那么在分配分区时要格外小心。在后面的章节中,我们会讨论

Kafka 管理员该如何解决这种 broker 负载不均衡的问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12206434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存