kafka同一个group 消费两个topic吗_52道 kafka 常见面试题,请收好

本文详细介绍了Kafka的基本概念、架构、存储机制、数据可靠性和一致性原理,特别是消费者组的负载均衡和分区分配策略。内容涵盖Kafka的高吞吐量、低延迟特性,以及如何通过分区副本、ACK机制保证数据可靠性。还讨论了Kafka的监控工具和数据丢失可能性,以及如何处理分区和消费的动态变化。
摘要由CSDN通过智能技术生成

1

Kafka基本概念

1

什么是kafka

  Kafka是一个分布式消息中间件,支持分区,多副本,多订阅者,基于zookeeper协调的消息系统,它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性

2

kafka特点

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, 由多个consumer group 对partition进行consume操作。

  • 可扩展性:kafka集群支持热扩展

  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失

  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)

  • 高并发:支持数千个客户端同时读写

2

kafka架构

1

 整体架构

 

2组件

名称

解释

Broker

Kafka集群包含一个或多个服务器,这种服务器被称为broker

Topic

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

Partition

Partition是物理上的概念,每个Topic包含一个或多个Partition.kafka只保证一个分区内的数据是有序的,不保证一个topic下的所有partition全局有序

Producer

消息生产者,负责发布消息到Kafka broker

Consumer

消息消费者,向Kafka broker读取消息的客户端

Consumer Group

每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)

replica

partition 的副本,保障 partition 的高可用

leader

replica 中的一个角色, producer 和 consumer 只跟 leader 交互

follower

replica 中的一个角色,从 leader 中复制数据

controller

Kafka 集群中的其中一个服务器,用来进行 leader election 以及各种 failover

AR(Assigned Replicas)

分区中所有副本

ISR(In-Sync-Replicas)

所有与leader副本保持一定程度同步的副本(包含leader副本在内)

OSR(Out-of-Sync-Replicas)

与leader副本同步滞后过多的副本(不包括leader副本)

HW(Hight Watermark)

高水位,它标识了一个特定的消息偏移量,消费者只能拉取到这个offset之前的消息

LEO(log End Offset)

标识当前日志文件下下一条待写入消息的offset

3Consumer与topic关系

每个group中可以有多个consumer,每个consumer属于一个consumer group,通常情况下,一个group中会包含多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高"故障容错"性,如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。

对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer,不过一个consumer可以同时消费多个partitions中的消息。

4

consumer负载均衡

 

当一个group中,有consumer加入或者离开时,会触发partitions均衡.均衡的最终目的,是提升topic的并发消费能力,步骤如下:

假如topic1,具有如下partitions: P0,P1,P2,P3 ;假如group中,有如下consumer: C1,C2

首先根据partition索引号对partitions排序: P0,P1,P2,P3 ; 根据consumer.id排序: C0,C1

计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)

然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]

3

kafka监控

  • KafkaOffsetMonitor

  • KafkaManager

  • Kafka Web Console

  • Kafka Eagle

4

kafka存储机制

1

Kafka文件存储基本结构

a.在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。

如下图所示

 

b.每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中;

每段segment file消息数量不一定相等,这种特性方便old segment file被高速删除(默认情况下每一个文件大小为1G);

每一个partiton仅仅须要支持顺序读写即可了。segment文件生命周期由服务端配置参数决定。默认保留7天的数据。

 

2

Kafka Partition Segment

Segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀".index"和“.log”分别表示为segment索引文件、数据文件。

 

Segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

3.索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。

 

上述图中索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。

其中以索引文件中元数据3,497为例,依次在数据文件中表示第3个message(在全局partiton表示第368772个message)、以及该消息的物理偏移地址为497。

segment data file由许多message组成, 物理结构如下

关键字

解释说明

8 byte offset

在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message

4 byte message size

message大小

4 byte CRC32

用crc32校验message

1 byte “magic"

表示本次发布Kafka服务程序协议版本号

1 byte “attributes"

表示为独立版本、或标识压缩类型、或编码类型。

4 byte key length

表示key的长度,当key为-1时,K byte key字段不填

K byte key

可选

value bytes payload

表示实际消息数据。

3

Kafka为什么查询速度快

分段

Kafka解决查询效率的手段之一是将数据文件分片,数据文件以该段中最小的offset命名。这样在查找指定offset的Message的时候,用二分查找就可以定位到该Message在哪个段(segment)中。

稀疏索引

为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。

索引包含两个部分(均为4个字节的数字),分别为相对offset和position。

index文件中并没有为数据文件中的每条Message建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。

这样避免了索引文件占用过多空间,从而可以将索引文件保留在内存中。

但缺点是没有建立索引的Message也不能一次定位到其在数据文件的位置,从而需要做一次顺序扫描,但是这次顺序扫描的范围就很小了。


示例:Kafka 查找message

 

 

比如:要查找绝对offset为7的Message:

首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。

打开这个Segment的index文件,也是用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。

打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

这套机制是建立在offset是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。

一句话,Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引这几个手段来达到了高效性。

顺序读写

零拷贝

所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之

手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换 ,对linux

操作系统而言,零拷贝技术依赖于底层的 se ndfile () 方法实现 对应于 Java 语言,

Fi eChannal.transferTo ()方法的底层实现就是 sendfile ()方法

零拷贝技术通过 DMA (Direct Memory Access )技术将文件内容复制到内核模式下的 Read

Buffer 。不过没有数据被复制到 Socke Buffer ,相反只有包含数据的位置和长度的信息的文

件描述符被加到 Socket Buffer DMA 引擎直接将数据从内核模式中传递到网卡设备(协议

引擎)。这里数据只经历了 2次复制就从磁盘中传送出去了 并且上下文切换也变成了2 次。

零拷贝是针对内 核模式而言的 数据在内核模式下实现了零拷贝

批量发送

生产者发送多个消息到同一个分区的时候,为了减少网络带来的系能开销,kafka会对消息进行批量发送

batch.size
通过这个参数来设置批量提交的数据大小,默认是16k,当积压的消息达到这个值的时候就会统一发送(发往同一分区的消息)

数据压缩。

Producer 端压缩、Broker 端保持、Consumer 端解压缩。

5

kafka基本命令

1

查看分区情况

bin/kafka-topics.sh --zookeeper zk01:2181 --describe --topic l

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值