kafka的一些基本概念 - ZhangTory's NoteBlog - 张耀誉的笔记博客

kafka的一些基本概念

以前只用过RabbitMQ,现在用到kafka了自然也需要学习学习kafka的相关知识。
这里记录一下相关概念的意义。

topic

最基础的概念,消息的主题。生产者只关注消息发往哪个topic,消费者只关注自己订阅消费哪个topic。

group

最基础的概念,消费组。多个消费者可以共享一个group,共同消费partition中的消息,即一个消息只会发给组内的一个消费者。
对于一个topic,如果有不同的group,则会有不同的消费者同时消息一条消息。

offset

最重要的概念之一,简单的说就是消息的唯一编号,类似于数组下标。
这个概念来源于kafka对消息的存放。每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息。

Partition

partition对于生产者和消费者是透明的,他代表消息存在于整个集群的哪个broker。
为了考虑性能,如果topic消息只存在于一个broker中,那么这个broker自然会成为瓶颈,无法水平扩展。
所以贝娜topic内的数据分布到整个集群就是一个自然而然的设计方式。
partition就是为了解决水平扩展的方案。

partiton是物理上的分组。
每个partition可以认为是一个无限长的数组,新数据顺序追加进这个数组。
kafka会根据分区规则吧消息存放在指定的分区中,这样可以实现集群中broker对消息的负载均衡。
生产者的消息可以存在多个partition上,消费者也可以从多个broker上不同的partition上读取数据,实现水平扩展。

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

分区在创建topic时可以设置partitions的数量,及其他参数。

segment

partition由多个大小相等的segment组成。
partiton可以理解为一个目录,而segment是具体存放数据的文件。
所以每个消息分配到partition后,会按照规则被放在不同的segment中。
这样当磁盘不足时可以方便的删除旧segment。
同时也方便根据offset快速读取到消息。
segment文件生命周期由服务端配置参数决定。

segment file组成:
由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件、数据文件
segment文件命名规则:
partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

在partition中如何通过offset快速查找message:
如我们找offset=321的消息
1.根据segment file的id定位segment文件。
2.定位到segment文件后,根据offset-id计算到文件中的偏移行数,然后从对应的000xxx.log中获取消息。

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。