Topic和Partition的关系
- topic是在kafka中是一个逻辑上的概念
- partition是kafka中的最小的存储单位,消息最终都会进入partition中
一个topic可以存在一个或者多个partition
partition与消费者的消费方式和消息的消费顺序,以及集群下保证高可用都有着密不可分的联系。
topic和partition的对应图:
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。