Kafka的Partition分区详解.md

Topic和Partition的关系

  1. topic是在kafka中是一个逻辑上的概念
  2. partition是kafka中的最小的存储单位,消息最终都会进入partition中

一个topic可以存在一个或者多个partition

partition与消费者的消费方式和消息的消费顺序,以及集群下保证高可用都有着密不可分的联系。

topic和partition的对应图:
Kafka的Partition分区详解.md_第1张图片

Partition与消费者的消费方式的关系

消费者组:一个或多个消费者以同一个消费者组名称命名,就构成了消费者组

消费者组中的一个消费者可以消费一个或多个partition分区中的数据

消费者和partition数量的对应关系:

  • partition分区的个数 < 消费者的个数

    会存在消费者闲置的情况,只有partition分区个数的消费者进行工作,其余的消费者闲置,但是当工作的消费者宕机时,闲置的消费者会进行顶替。

  • partition分区的个数 = 消费者的个数

    消费者与partition分区一对一消费。

  • partition分区的个数 > 消费者的个数

    消费者至少对接一个partition分区,有的消费者会对接多个。

Partition与消息的消费顺序的关系

在topic中如果存在多个partition,对于整个topic来说消息的消费顺序是乱序的,但是对于partition来说,是有序的

因此想要保证消息的顺序消费,可以设置topic只有一个partition

Partition与集群之间高可用的关系

broker:可以理解成一个kafka的单机节点

一个topic的数据可以分布在不同broker上,归根结底是不同的partition分布在不同的broker上

kafka可以设置topic的分区副本,将partition的副本分布在不同于该partition的broker上

当该partition的broker宕机后,那么kafka集群将启用副本进行代替

**建议:**设置副本的数量不要超过kafka集群的broker的数量

Partition的存储方式

topic是kafka的逻辑存储,partition是kafka的物理存储

在kafka中,一个partition代表着一个文件夹,文件夹的命名规则根据topic名字_序号

因为topic存储的数据量是不限量,但是文件大小是有上限的,因此,在kafka中达到一定的上限后,会将文件进行分割。

partition的文件夹中的文件叫segment。

segment由三大部分组成,分别为index file和log file,timeindex file

此3个文件一一对应,成对出现,后缀".index"和“.log”和“.”分别表示为segment索引文件、数据文件、 时间戳索引文件

log、index和timeindex三个文件,它有以下几个特点。

(1)文件名称一样,后缀不一样,以文件中第一条message的offset(全局offset)来命名的,实际offset长度是64位10进制,但是这里只使用了20位10进制,应付生产是足够的。

(2)log文件大小是有限度的,会滚动新增。一组index+log+timeindex文件的名字是一样的,并且log文件默认写满1G后,会进行log rolling形成一个新的文件来记录消息,这个是通过broker端log.segment.bytes=1073741824指定的,可以修改这个值进行调整。

(3)index和timeindex在刚使用时会分配10M的大小,当进行log rolling后,它会修剪为实际的大小,所以看到前几个索引文件的大小,只有几百K。

segment 的文件配置项:

# segment大小,默认为 1G
log.segment.bytes = 1024*1024*1024
# segment 保留文件的最大时长,超时将被删除
log.retention.hours=24*7

segment文件命名规则:

".index"和“.log”文件的命名规则:

  • partion全局的第一个segment从0开始,后续每个segment文件名为文件第一条消息的offset值。全局的offset、整体的offset,是相对于整个分区来的
  • offset 数值大小为 64 位,20 位数字字符长度,没有数字用 0 填充

segment生成的方式

  • 根据大小

    如果文件大小达到设置的限制,就会生成一个segment

    log.segment.bytes

  • 根据时间

    如果没有达到时间的阈值,而是而是达到了log.roll.ms或者log.roll.hours设置的时间触发阈值,同样会触发产生新的segment。

你可能感兴趣的:(kafka,分布式,中间件)