kafka面试题

目录

1、kafka消息发送的流程?

2、Kafka 的设计架构你知道吗?

3、Kafka 分区的目的?

 4、你知道 Kafka 是如何做到消息的有序性?

6、Kafka 在什么情况下会出现消息丢失

7、怎么尽可能保证 Kafka 的可靠性

8、Kafka中如何做到数据唯一,即数据去重?

9、生产者如何提高吞吐量?

10、zk在kafka集群中有何作用

11、简述kafka集群中的Leader选举机制

12、kafka是如何处理数据乱序问题的。

13、kafka中节点如何服役和退役

14.Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?

15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢

16、kafka是如何做到高效读写

17、Kafka集群中数据的存储是按照什么方式存储的?

18、kafka中是如何快速定位到一个offset的。

19、简述kafka中的数据清理策略。

20、消费者组和分区数的关系是怎样的?

 21、kafka如何知道哪个消费者消费哪个分区?

1、kafka消息发送的流程?


        Kafka消息发送的流程如下:
        1) 生产者发送消息:消息生产者向Kafka发送消息,包括消息主题和数据。 
        2)  分区器负责将消息分配到对应的分区:Kafka为每个主题维护一个或多个分区,分区是消息的基本单位,Kafka通过一个分区器来选择将消息分配到哪个分区中。 
        3) 消息持久化:将消息写入日志文件并刷盘,确保数据可靠存储。 
        4) Leader-Follower机制:Kafka使用Leader-Follower机制来确保分区的可用性。对于每个分区,Kafka维护一个leader和若干个follower。Leader负责处理所有的读写请求,而Follower则仅仅负责复制Leader的数据。采用这种方式使得分区的可用性更高,一旦Leader宕机,Follower会自动成为新的Leader,保证整个系统的高可用性。 
        5)follower的消息同步:Kafka follower通过异步复制leader的日志来复制数据。follower将消息复制到本地磁盘,然后发送确认消息(ACK)。 
        6)消息已经完全写入并且同步到所有的follower的时候,producer就收到一个确认消息。 
        7) ACK机制:如果follower未能在一定时间内发送ACK消息,则producer会重新发送消息。如果多次发送都没有接收到ACK,则producer会抛出异常。 

2、Kafka 的设计架构你知道吗?


        1)Producer:消息生产者,就是向 Kafka broker 发消息的客户端。 
        2)Consumer:消息消费者,向 Kafka broker 取消息的客户端。 
        3)Consumer Group(CG):消费者组,由多个 consumer 组成。消费者组内每个消 费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。 
        4)Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。 
        5)Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic。 
        6)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。 
        7)Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个 Follower。
        8)Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。 
        9)Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Leader。


3、Kafka 分区的目的?


Kafka使用分区是为了实现以下几个目的:
        1) 水平扩展:
Kafka通过将一个主题分为多个分区,将主题中的数据进行水平分割,使每个Broker只需要处理部分数据。这种方式使得Kafka能够轻松地扩展到大规模集群,从而支持高并发、高吞吐量的数据处理和传输。 
        2)分区副本:
Kafka使用分区来实现数据备份和高可用性。每个分区都有多个副本,其中一个是leader副本,其他副本是follower副本。数据写入leader副本,follower副本通过异步复制leader的日志来复制数据。即使leader副本发生故障,follower副本也可以接替leader的职责,保证数据的可靠性和高可用性。 
        3)优化数据读取:
Kafka通过分区将一个主题中的数据存储到多个分区中,从而使得消费者可以独立的从每个分区中读取数据,并且可以根据消费者的需要选择读取数据分区,从而实现数据隔离和读取优化。 
        4)保证消息顺序:
消息的顺序保证是Kafka的重要特性之一。每个分区中的消息都是有序的,这使得消费者能够按照顺序读取消息,并且确保消息被正确地处理和解析。 
综上所述,Kafka的分区机制为数据备份、水平扩展、高吞吐量和消息顺序保证等方面提供了有力的支持。

        Partitions:分区数:控制topic将分片成多少个log,可以显示指定,如果不指定则会使用 broker(server.properties)中的num.partitions配置的数量。
一个broker服务下,是否可以创建多个分区?
可以的,broker数与分区数没有关系; 在kafka中,每一个分区会有一个编号:编号从0开始
每一个分区的数据是有序的
说明-数据是有序 如何保证一个主题下的数据是有序的?(生产是什么样的顺序,那么消费的时候也是什么样的顺序)
topic的Partition数量在创建topic时配置。
Partition数量决定了每个Consumer group中并发消费者的最大数量。
Consumer group A 有两个消费者来读取4个partition中数据;Consumer group B有四个消费者来读取4个 partition中的数据
(1)便于合理使用存储资源,每个Partition在一个Broker上存储,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。
(2)提高并行度,生产者可以以分区为单位发送数据;消费者可以以分区为单位进行消费数据。

 
4、你知道 Kafka 是如何做到消息的有序性?


Kafka 保证消息有序性的主要机制有两个:分区和发生器。
        1)分区机制:
Kafka包含一个或多个主题,每个主题可以细分为多个分区。 每个分区内的消息是有序的,所有分区的消息只能在分区内有顺序,不具有全局顺序。因此,对于全局顺序要求比较高的场景,一般需要将消息发到单一分区内,这个分区数量最好为1。 
2)发生器机制:
Kafka 在依次写入分区(日志)时,采用了Batch形式异步写入的机制,对于批量写入的数据,Kafka能保证批内有序且顺序不变的情况下添加到分区(日志)与追加操作之间插入了一个逻辑独立的缓冲区,所以当批次内的全部记录在整个Kafka服务群体内提交后,这些记录的API调用才会成功返回。 
因此,在实践中,结合分区机制和发生器机制可以很好地保证 Kafka 消息的有序性。唯一需要注意的是,当应用程序生产顺序严格的消息时,只有一个消息生产者,并将所有消息发送到同一分区中。 在这种情况下,消息的有序性得到了最大化的保证。


5、ISR、OSR、AR 是什么?


在 Kafka 的复制机制中,ISR、OSR、AR 都是关键词汇,分别表示以下含义:
1)  ISR(In-Sync Replicas):同步副本集合。
Kafka 使用 ISR 机制来保证数据的可靠性和一致性。具体来说,当生产者发送消息到 Kafka 集群中某个分区时,只有那些位置与 leader 副本差距不大的 follower 副本才会被认为是 ISR 中的一员,此时生产者才会发送确认请求,等待 ISR 中的所有副本都确认消息后,才会认为消息成功提交,否则生产者就会一直等待,直到所有 ISR 中的副本都成功确认消息才会继续发送数据。 
2) OSR(Out-of-Sync Replicas):异步副本集合。
Kafka 中所有不在 ISR 中的副本,都属于 OSR。 
3) AR(Assigned Replicas):分配的副本集合。
AR 表示某个分区分配的全部副本集合,AR 包含了 ISR 和 OSR,AR 数量一般等于副本数,即一个分区有多少个副本,那么 AR 的长度就是多少。 
总之,ISR 是同步的、高可靠的副本集合,OSR 是异步的、可靠性较低的副本集合,AR 则是所有副本的集合。在数据复制过程中,Kafka 通过 ISR 机制来保证消息被可靠地复制。无论是 leader 副本还是 follower 副本,它们都只有在成功的确认了消息后才能将消息标记为“已提交”,从而保证数据的可靠性和一致性。


6、Kafka 在什么情况下会出现消息丢失


Kafka 在正常运行的情况下是很可靠的消息系统,但在以下情况下,可能会出现消息丢失:
1)生产者消息丢失
● 生产者网络故障或者宕机后未成功发送消息:生产者发送消息到Broker时,如果网络故障或者生产者宕机导致没能成功发送消息,那么消息就会丢失。
● Broker 端磁盘空间不足:如果 Broker 磁盘空间不足,就会无法持久化消息,此时生产者发送的消息就会丢失。
● Broker 集群故障:如果整个 Kafka 集群出现故障,生产者发送的消息可能会因为没有足够的 ISR 副本而被清除。
2)消费者消息丢失
● 消费者在处理消息时异常退出:如果消费者在从 Kafka 中消费消息时出现异常退出,可能会出现消息消费不完的情况,这会导致已经接收到但未被处理的消息被丢失。
● 消费者提交偏移量失败:Kafka 中消费者可以提交偏移量,以标志已经消费了的消息。如果消费者在处理消息时,未能正确提交偏移量,那么重启消费者之后可能会重新消费已经消费过的记录,进而导致消息丢失。
为了避免消息丢失,可以在生产者端使用“消息确认机制”,在消费者端使用“自动提交偏移量”或“手动提交偏移量”的方式,从而确保消息被准确地生产和消费。


7、怎么尽可能保证 Kafka 的可靠性


为了尽可能保证 Kafka 的可靠性,可以采取以下措施:
        1)使用多副本机制:使用多副本机制,即一个主副本和多个备份副本,能够保证数据的高可靠性和可用性。Kafka 将消息通过 ISR 机制进行复制,以保证在副本节点故障的情况下,数据的持久性和可靠性。 
        2)配置 Kafka 服务器:通过适当配置 Kafka 服务器,以使其在生产和消费时更加可靠。可以调整参数,如最大连接数、最大线程数、最大请求大小、副本数、消息在 Broker 上的持久化策略等,以确保 Kafka 服务器更加稳定和可靠。 
        3)使用 Producer 端的消息确认机制:通过 Producer 端的消息确认机制,可以在消息发送完毕后,等待 ACK 确认消息是否已经被正确处理,以保证生产者发送的消息得到正确处理。 
        4)使用 Consumer 端的手动提交偏移量或自动提交偏移量机制:通过手动提交偏移量或自动提交偏移量机制,可以确保消费者能够从上一次消费的偏移量继续消费,避免消息重复消费或漏消费。 
        5)监控 Kafka 集群的健康状态:为了保证 Kafka 集群的可靠性,需要监控 Kafka 集群的健康状态,如各个节点的运行状态、磁盘和内存使用情况、负载、消息传输速率等指标,保证 Kafka 集群的稳定性和可用性。 
        6)使用消息日志和备份策略:采用消息日志和备份策略,可以在数据丢失或其他灾难之后,可以快速地进行数据备份和恢复,以保证数据的可靠性。 


8、Kafka中如何做到数据唯一,即数据去重?


在 Kafka 中,数据去重主要是通过下面两种方式实现:
        1)消费者端手动去重
消费者可以使用消息偏移量来保证每个消息只被消费一次。消费者会从 Kafka 中消费一段时间的消息,处理完成后,手动提交最后处理完的消息偏移量。在下次启动时,消费者会从上一次提交的消息偏移量继续消费下一批消息,从而避免重复消费。
        2)生产者端使用消息 Key
Kafka 允许在发送消息时指定一个 Key,可以将消息分配到同一个 Partition 中。在同一个 Partition 中,如果使用 Kafka 提供的一个默认分区器,那么消息唯一的 Key 将会被分配到相同的 Partition 中。生产者可以在生产消息的时候使用某个唯一值作为 Key 来保证消息的唯一性,消费者可以通过 Key 识别重复消息并忽略掉。
特别地,如果在 Kafka 集群中使用了 Kafka Streams 框架,Kafka Streams 提供了完备的幂等性保障和 Exactly-Once 语义的支持,在整个流数据处理过程中保证消息不会丢失、不会重复消费,以及最终结果不会丢失。


9、生产者如何提高吞吐量?


以下是一些提高 Kafka 生产者吞吐量的常见方法:
        1)批量发送消息
生产者可以将多个消息封装成一个批次进行发送,可以减少网络和 IO 操作的次数,从而提高吞吐量。通常情况下,批处理的大小应该根据实际情况进行调整,以达到最优发送效果。
        2)调整消息压缩配置
Kafka 支持消息压缩功能,减少网络传输和 I/O 操作的大小,从而提高吞吐量。可以使用 GZIP、Snappy、LZ4 等压缩算法来减小消息的大小。
        3)调整同步模式
在 Kafka 生产者的 API 中有两种发送模式,异步和同步。默认情况下,使用异步发送模式发送消息。采用同步发送模式可以控制写入消息的顺序,确保消息按照指定的顺序被写入分区,从而提供更高的可靠性。同步模式通常比异步模式开销大,因为发送消息的线程必须等待 Broker 的确认。可以根据实际需求选择适当的同步模式。
        4)增加生产者实例数量
在高并发情况下,增加生产者实例的数量可以提高 Kafka 生产者的吞吐量。可以增加多台机器来分担负载,提供更高的可靠性和可用性。
        5)调整 Kafka Broker 配置
可以调整 Kafka Broker 的配置,如消息保留时间、消息加密方式、日志压缩方式和加密等级等,以提高 Kafka 吞吐量。可以根据实际业务情况和硬件性能来进行优化和调整。
总体上,提高 Kafka 生产者的吞吐量需要结合实际业务场景和硬件条件来选择合适的策略和方法。需要注意的是,过度的优化可能会造成其他问题,如延迟、可靠性问题等。


10、zk在kafka集群中有何作用


在 Kafka 集群中,Zookeeper 扮演着非常重要的角色,它主要负责以下几个方面:
        1) Kafka 集群元数据管理
Zookeeper 负责存储 Kafka 集群的元数据,如 Broker 的状态、topic、consumer group、partition信息等,这些信息可以通过 Kafka 调用 Zookeeper API来获取。在集群中新加入或删除 Broker 、topic、 partition 等操作时,需要通过 Zookeeper 的 API 来进行更新操作,以保证集群的高可靠性和可扩展性。
        2)Leader 选举
Kafka 中的每个 partition 都有一个 leader 和若干个 follower,Zookeeper 用来选举 partition 的 leader。Kafka 的 Brokers 借助 Zookeeper 实现 Leader 选举,实现了自动容错和负载均衡。当 leader 节点宕机或者出现故障时,Zookeeper 就会监测到,把消息路由到备选的节点从而实现高可用性。
        3)动态上下线
Kafka 集群中 broker 的上下线操作均会在 Zookeeper 中进行通知,自然地也就实现了集群中 broker 的动态变更特性。当一个 broker 宕机或者加入一个新 broker 时,Zookeeper 会及时的通知 Kafka 集群中其他的 broker,以保证集群的正常运行。
总的来说,Zookeeper 能够快速协调不同节点之间的操作,协调各 manager(如broker,consumer,producer)的状态,以及协助集群节点的领导者选举,为Kafka 集群的正常运转提供了关键的支持。


11、简述kafka集群中的Leader选举机制


Kafka 集群中的 Leader 选举机制是为了确保每个分区都有一个可用的 leader,并且能够在 leader 失效时迅速选举出新的 leader。
以下是 Kafka 集群中的 Leader 选举机制的简要步骤:
        1) 每个 broker 都在 Zookeeper 中注册一个临时节点。这些节点表示 broker 的活跃状态。
        2) 当一个分区的 leader 失效或不可用时,Zookeeper 就会触发 Leader 选举过程。
        3)所有的 broker 都会尝试竞选分区的新 leader,它们会在 Zookeeper 的临时节点上创建临时有序节点,并在节点数据中存储自己的标识符。
        4) 当竞选过程完成后,Zookeeper 会根据节点的序号选择一个新的 leader,选取规则通常是选择序号最小的节点作为新的 leader。
        5) 当新的 leader 被选举出来后,Zookeeper 会将信息通知给所有的 broker。
        6) Kafka 集群中的其他 broker 会更新它们所维护的元数据信息,以反映新 leader 的更改。这样,客户端就可以通过元数据获取到新的 leader,并继续发送和读取消息。
需要注意的是,Kafka 通过 Zookeeper 实现了基于副本的高可用性机制。每个分区都有多个副本(包括一个 leader 和若干个 follower),当 leader 失效时,Zookeeper 触发的 leader 选举过程会选择一个 follower 作为新的 leader,从而保证了消息的高可靠性和可用性。
总结起来,Kafka 集群中的 Leader 选举机制通过 Zookeeper 实现,确保了每个分区都有可用的 leader,并能够在 leader 失效时快速选举出新的 leader,以保证消息的连续性和高可用性。


12、kafka是如何处理数据乱序问题的。


Kafka 通过使用分区(Partition)和消费者组(Consumer Group)的机制来处理数据乱序问题。
        1)分区(Partition)
Kafka 中的每个主题(Topic)可以被分为多个分区,每个分区是一个有序的消息队列。分区可以在多个 Broker 之间进行复制,从而实现高可用性和负载均衡。
                2)消费者组(Consumer Group)
消费者组是一组消费者的集合,它们共同消费一个主题的消息。当一个消费者加入消费者组时,它会被分配到一个或多个分区,并且每个分区只会被一个消费者消费。这样每个消费者都可以独立消费自己所负责的分区中的消息。
处理数据乱序的关键在于分区的顺序性。在同一个分区内,Kafka 保持消息的有序性;而在不同的分区之间,消息的顺序则是独立的。
通过分区和消费者组的结合使用,Kafka 解决了数据乱序的问题:
● 每个分区内的消息是有序的,消费者从每个分区中按顺序接收消息。
● 每个消费者组可以有多个消费者,并且每个消费者在消费时只处理自己所分配的分区。这样,即使不同的消费者组消费同一个主题,它们也不会相互影响,从而保证了消息的有序性。
需要注意的是,数据乱序是在分区粒度上进行处理的,同一个分区内的消息是有序的,而跨分区的消息可能会存在一定的乱序性。如果业务对于多个分区内的消息需要有全局有序性,可以采用单分区或者使用额外的标识符进行排序。
总结起来,通过分区和消费者组的机制,Kafka 解决数据乱序问题,保证了在同一个分区内消息的有序性,并提供了灵活的并行消费能力。


13、kafka中节点如何服役和退役


在 Kafka 中,节点(broker)的服务和退役可以通过以下步骤进行:
        1)  服务启动:要将一个节点作为 Kafka 服务的一部分,需要在该节点上启动 Kafka broker。在启动过程中,broker 会通过配置文件中指定的 ZooKeeper 地址和端口来连接到 ZooKeeper 服务,并注册自己作为一个有效的 broker。 
        2)注册节点:在与 ZooKeeper 建立连接后,broker 会在 ZooKeeper 上创建一个临时节点来表示自己的存在。这个临时节点的路径和相关信息将由注册过程负责维护。 
        3)服务正常工作:一旦成功注册到 ZooKeeper,broker 就会开始承担提供 Kafka 服务的角色。它会监听指定的主题(topic)和分区(partition),并处理来自生产者和消费者的消息。同时,broker 也会承担领导者(leader)或跟随者(follower)的角色,以确保分区的高可用性以及数据的复制。 
        4)节点退役:当需要将节点从 Kafka 集群中退役时,需要执行一系列的步骤: 
  ○  停止服务:首先,需要停止该节点上的 Kafka broker 服务,以确保不再处理新的消息。这可以通过关闭 broker 进程或使用控制台命令等方式来实现。 
  ○  从集群中移除:接下来,需要将该节点从 Kafka 集群的配置中移除。这可以通过编辑 Kafka 配置文件,删除或注释掉该节点的配置项来实现。 
  ○  注销节点:一旦 broker 服务停止,该节点会自动从 ZooKeeper 上注销,即删除自己在 ZooKeeper 上注册的临时节点。这将通知集群中的其他节点,该节点已经不再参与服务。 
  ○  数据迁移:如果需要将该节点上的数据迁移到其他节点上,可以使用 Kafka 提供的工具(例如 kafka-reassign-partitions.sh)进行数据重新分配或副本迁移,以确保数据不会丢失并在集群中得到合理分布。 
需要注意的是,当一个节点退役时,Kafka 集群会自动触发 Leader 选举过程以选出新的 Leader,保证消息的连续性和可用性。
总结起来,节点在 Kafka 中通过启动 Kafka broker 进程并将自己注册到 ZooKeeper 来提供服务,退役时需要停止服务、从集群配置中移除,并注销自己的 ZooKeeper 节点。同时,确保数据的迁移和 Leader 选举过程也是重要的。

14.Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?


Kafka 中 Leader 和 Follower 节点的挂掉可能会引起数据同步的问题,但是 Kafka 在设计时已经考虑了这种情况的发生,因此,只要在恢复时正确地操作,数据同步是可以保证的。
情景一:Leader 挂了,Follower 依然工作
如果 Leader 节点挂了,但 Follower 节点还在工作,数据同步可以如下进行:
        1) Follower 晋升为新的 Leader:Kafka 集群会自动进行 Leader 的重新选举,从当前正在工作的 Follower 节点中挑选一个新的 Leader。一旦新的 Leader 选定,它将接收来自生产者的消息,并将消息复制到下游的 Follower 节点中。 
        2) Leader 节点恢复:当 Leader 节点重新上线时,它将检查自己保存的与 Follower 不同的消息,并将缺失的消息发送给 Follower 节点。如果 Leader 节点比 Follower 节点新,则会向 Follower 发送未接收/提交的消息,如果 Follower 比 Leader 新,则会向 Leader 请求缺失的消息。 
情景二:Follower 挂了,Leader 依然工作
如果一个 Follower 节点挂了,但是 Leader 节点依然在工作,数据同步可以如下进行:
        1) Follower 节点恢复:当 Follower 节点重新上线时,它会查询 Leader 节点上已提交的最后一条消息,并向 Leader 节点请求缺失的消息,从而保持自己与 Leader 节点上的数据同步。 
        2) Leader 节点挂了:在 Leader 节点挂掉时,Kafka 集群同样会自动进行 Leader 的重新选举。在该过程中,Follower 节点将变成“无主”状态,无法接收来自生产者的消息。一旦新的 Leader 被选定,它将检查每个 Follower 节点上保存的最后一条已提交的消息,并向 Follower 发送缺失的消息,使得 Follower 节点数据与新的 Leader 保持同步。 
总之,Kafka 通过强制数据复制和自动的 Leader 选举机制来保证数据的持久性和可用性,并且针对 Leader 和 Follower 节点的挂掉,提供了相应的容错机制来保证数据同步和消息传递的连续性。

15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢

答:

       1).修改ISR列表:可以人工干预并修改ISR列表,将希望成为Leader的Broker添加到ISR列表中。这样,在进行Leader选举时,这个Broker就有更大的机会被选为Leader。
        2).手动调整优先级:可以通过手动调整Broker的优先级来影响Leader选举。在Kafka中,每个Broker都有一个与之关联的优先级,优先级越高,被选为Leader的可能性也越大。
        3).重新平衡分区:如果希望打破Leader选举的规律,可以重新平衡分区。通过重新分配分区的方式,使得原本被选为Leader的Broker变为副本,从而改变Leader的归属。


16、kafka是如何做到高效读写

答:

        1).分布式架构:Kafka采用分布式架构,将数据分散存储在多个Broker上的多个分区中。这样可以通过并行处理和负载均衡来提高读写效率。

        2).批量写入:Kafka支持批量写入机制,即生产者可以一次性发送多条消息到Broker,减少了网络通信开销。同时,Kafka还会将批量写入的消息进行压缩,节省存储空间和网络带宽。

        3).零拷贝技术:Kafka使用零拷贝技术来提高读写性能。在生产者发送消息时,Kafka会将消息直接从内存缓冲区写入磁盘,避免了数据在内核空间和用户空间之间的复制。在消费者读取消息时,Kafka会将消息直接从磁盘传输到网络缓冲区,再由消费者进行处理。

        4).顺序写入和顺序读取:Kafka以追加方式将消息写入磁盘,保证了写入的顺序性。这样,可以有效地减少磁盘寻道时间,提高写入性能。对于消息的读取,Kafka也会按照顺序从磁盘中读取数据,并使用页缓存来加速读取操作。

        5).内存缓存:Kafka利用内存缓存来提高读写性能。生产者发送的消息首先写入内存中的缓冲区,而不是直接写入磁盘。消费者读取消息时也会首先从内存中读取,避免了频繁的磁盘读取操作。

        6).高效的索引和查找机制:Kafka使用基于日志的存储方式,并在日志文件上建立了索引。这样可以通过索引快速定位到指定消息的位置,实现高效的消息查找和读取。

17、Kafka集群中数据的存储是按照什么方式存储的?

答:

        Kafka集群中的数据存储是按照分布式日志的方式进行存储的。

        每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic名称+分区序号,例如:first-0。


18、kafka中是如何快速定位到一个offset的。

答:

        1).在Kafka中,每个分区会被划分为多个连续的消息偏移量(offset)。Kafka通过使用索引数据结构来快速定位到一个特定的偏移量。

        2).Kafka还维护了一个称为索引文件(index file)的辅助文件,其中记录了每个消息片段起始位置对应的偏移量。这样,当需要定位到一个特定的偏移量时,可以首先在索引文件中查找与该偏移量最接近的起始位置,然后再根据起始位置找到相应的消息片段。


19、简述kafka中的数据清理策略。

答:

        1).基于时间的数据清理策略(log.retention.hours):根据配置的时间间隔,Kafka会自动删除早于指定时间的日志文件。这意味着消息在指定的时间段后将被删除,不再可用。

        2).基于大小的数据清理策略(log.retention.bytes):根据配置的日志文件大小,Kafka会自动删除最旧的日志文件,以便保持总体存储大小在一定范围内。这意味着当达到指定的存储大小时,最旧的日志文件将被删除,以便为新的消息腾出空间。


20、消费者组和分区数的关系是怎样的?

答:

        在一个消费者组中,可以有多个消费者实例来消费不同的分区。一个消费者组可以订阅一个或多个主题,并且每个分区只能被一个消费者实例所消费。一个消费者可以消费多个分区数据。消费者组之间互不影响。

 
21、kafka如何知道哪个消费者消费哪个分区?

答:

        通过消费者组协调器的分区分配机制,Kafka能够知道哪个消费者消费哪个分区,并确保每个分区只被一个消费者实例所消费。

        Kafka使用消费者组协调器来管理消费者组和分区之间的关系。负责为每个消费者实例分配分区,并维护消费者组的状态信息。一旦分区被分配给某个消费者实例,消费者实例会周期性地向消费者组协调器发送心跳,以保持其活动状态,进而kafka知道消费者消费哪个分区。

22.kafka消费者的消费分区策略有哪些,默认是个?

        1).Round-robin(轮询):默认的分区策略是轮询。每个消费者依次选择一个分区来消费消息,确保公平地分配负载。当消费者数量与分区数量大致相同时,这是一种有效的策略。


        2).Range(范围):消费者按照分区的范围来进行分配。每个消费者被分配一个或多个连续的分区。这种策略适合于某些场景,如要处理特定范围的数据。


        3).Sticky(粘性):粘性策略会使得每个消费者尽可能长时间地保持对同一个分区的消费。这对于需要按顺序处理消息的应用程序很有用。

23、kafka中的消费者,他们的偏移量存储在哪里?


        1).Kafka内部topic中:从0.9版本开始,偏移量保存在Kafka一个内置的topic中(__consumer_offsets)。每个消费者组都有一个专用的分区来存储其成员的偏移量,在该主题中的特定分区中进行记录。


        2).保存在Zookeeper中:Kafka0.9版本之前,消费者默认将offset 保存在Zookeeper中。

24、kafka中数据挤压太多,怎么办?(提高消费者的效率)

        1).增加消费者数量:可以通过增加消费者实例的数量来分担数据处理的负载。这样每个消费者处理的消息数量就会减少,从而提高整体的消费速度。


        2).调整消费者参数:可以根据实际情况调整消费者的配置参数,例如调整消费者批量拉取的消息数量等,以提高消费者的并发处理能力和吞吐量。

25、Kafka中的数据在消费过程中,有漏消费和重复消费的情况,怎么办?

        1).设置适当的消费者偏移量:消费者可以跟踪记录已经消费的消息偏移量,确保在断开连接或重新启动后能够从正确的位置开始消费。通过正确设置偏移量,并使用Kafka提供的提交偏移量功能,可以避免重复消费。


        2).实现幂等消费:在消费者端实现幂等性操作,即无论消息被处理多少次,最终结果都一致。这可以通过给每条消息分配唯一的标识符,并在处理之前进行去重检查来实现。


        3).使用事务消费:Kafka支持事务性消费,消费者可以将消费和提交偏移量的操作包装在一个事务中,确保消息只会被处理一次,避免了重复消费的问题。


        4).监控和处理错误:定期监控消费者的状态和日志,及时发现并处理漏消费或重复消费的情况。可以使用监控工具或自定义的监控机制来实现。

26、kafka中的数据已经消费过的数据,是否可以再次消费?怎么做?

        可以。需要通过重置消费者的偏移量来实现。Kafka提供了两种方式来重置偏移量:


        1).手动重置偏移量:可以通过修改消费者的配置参数,将偏移量设置为指定的值。这样消费者会从指定的偏移量开始重新消费数据。


        2).自动重置偏移量:在消费者的配置中设置auto.offset.reset参数为earliest或latest。如果设置为earliest,则消费者会从最早的可用偏移量开始消费;如果设置为latest,则消费者会从最新的可用偏移量开始消费。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值