kafka 由 broker,topic,分区 ,副本,生产者,消费者主要模块构成
一个topic对应多个分区(分区是逻辑概念,目的提高吞吐量),每个分区对应一个leader副本(负责读写)和多个follwoer副本(只负责备份保证高可用)
小知识点
1.当一个主题的分区被分配给一个消费者组时,Kafka会确保每个分区只有一个消费者能够消费。这意味着一个分区只能被同一个消费者组中的一个消费者消费,但不同消费者组中的消费者可以同时消费该分区。
消费位移(consumer offset)是用来标识消费者在一个特定分区中已经消费的消息的位置。每个消费者组都有自己的消费位移。
Kafka中的每个分区都有一个独立的位移序列,表示了从分区的起始位置开始的消息的顺序。消费者可以通过提交消费位移来记录自己在分区中已经消费的消息的位置。
消费者可以通过以下方式提交消费位移:
手动提交:消费者可以调用commitSync()或commitAsync()方法来手动提交消费位移。commitSync()会阻塞直到位移提交完成,而commitAsync()则是异步提交位移。
自动提交:消费者可以通过设置auto.commit.enable属性为true来开启自动提交位移。在每次拉取消息后,消费者会自动提交最新的位移。
消费位移的作用主要有以下几个方面:
确保消息的顺序消费:通过消费位移,消费者可以记录已经消费的消息的位置,从而确保下一次消费的消息是从上次消费的位置开始的,保证消息的顺序消费。
实现消息重复处理和消息丢失处理:消费位移可以记录消费者已经消费过的消息的位置,当消费者重新启动时,可以通过消费位移来判断是否需要重新消费之前已经消费过的消息。
消费者偏移量监控:通过监控消费位移,可以了解消费者当前消费的进度,以及消费者是否正常消费消息。
总结起来,消费位移在Kafka中是用来标识消费者在分区中已经消费的消息的位置,通过消费位移可以确保消息的顺序消费,实现消息的重复处理和丢失处理,并且可以监控消费者的消费进度。
2.kafka的segment
在 Kafka 中,每个主题被分成一个或多个分区(partitions),而每个分区由一系列的 Segment 组成。Segment 是磁盘上连续存储消息的文件,用于持久化数据。
以下是关于分区的 Segment 的详细说明:
1.分区逻辑:每个分区都有一个唯一的标识符(partition ID),这个标识符用于在集群中唯一定位分区。分区可以看作是主题的水平拆分,它允许消息并行处理,并提供了扩展性和容错性。
2.Segment 文件:每个分区由一系列的 Segment 文件组成,这些文件按照顺序编号(例如,0、1、2…)来表示不同的 Segment。Segment 文件的大小可以事先配置,当文件达到指定大小时,会创建一个新的 Segment 文件来接收新的消息。
3.消息的追加:当消息被写入到分区时,它们会被追加到当前活跃的 Segment 文件中。如果当前的 Segment 文件已经达到了最大大小限制,就会创建一个新的 Segment 文件来接收后续的消息。
4.索引结构:每个 Segment 文件都包含一个索引结构,用于快速查找消息的位置。这个索引结构采用稀疏索引的方式,记录了一些关键点的位置,以便在查询消息时能够快速定位到所需的位置,而不需要遍历整个文件。
5.Segment 的删除和压缩:当一个分区的所有消息都被消费完之后,该分区的 Segment 文件并不会立即删除。相反,Kafka 采用了基于时间的策略来决定何时删除旧的 Segment 文件。另外,Kafka 还提供了压缩机制,可以将多个 Segment 文件合并成一个更大的文件,以减少磁盘空间的占用。
6.通过使用分区的 Segment,Kafka 实现了高效的消息存储和检索,并能够支持大规模的数据处理和容错性。Segment 提供了持久化存储、索引结构和管理策略,以确保数据的可靠性和高效性能。
Kafka 使用 Segment 来对磁盘中的数据进行划分和管理。每个主题由一个或多个 Segment 组成,每个 Segment 是一个连续的文件,用于持久化存储消息。
稀疏索引是 Kafka 中一种用于加快查询效率的索引结构。它通过跳跃式地记录关键点的位置,而不是为每条消息都创建索引。这样可以大大减少索引的大小,并且在查找消息时能够快速定位到所需的位置。
另外,Kafka 还采用了零拷贝(Zero Copy)机制来提高性能。传统的数据传输通常需要将数据从内核缓冲区拷贝到用户空间,然后再拷贝到网络发送缓冲区。而零拷贝技术通过直接将数据从内核缓冲区发送到网络缓冲区,避免了额外的数据拷贝操作,提高了数据传输的效率。
综合利用稀疏索引和零拷贝机制,Kafka 能够以高效的方式处理大量的消息,并且具备低延迟和高吞吐量的特性。
3.kafka controller节点(controller节点自身的高可用通过zk保证)
Kafka 的 Controller 节点是 Kafka 集群中的一种特殊节点,它负责管理整个集群的状态和元数据。以下是关于 Kafka Controller 节点的详细说明:
负责分区的领导选举:每个分区在 Kafka 集群中都有一个领导者(Leader)和零个或多个副本(Replica)。Controller 节点负责监控和管理分区的领导者选举过程。当领导者失效时,Controller 节点会发起新的选举过程,选择一个新的领导者来处理该分区的读写请求。
元数据管理:Controller 节点维护着 Kafka 集群的整体元数据信息,包括主题、分区、消费者组等的配置和状态。它负责处理新主题、分区的创建和删除,并更新集群的元数据信息。所有其他节点需要获取最新的元数据信息时,会向 Controller 节点发送请求。
副本分配和迁移:Controller 节点负责分配和管理副本的分布。当新的副本需要被添加到集群或者已有的副本需要被迁移时,Controller 节点会计算并通知其他节点进行副本的复制和迁移操作。
Broker 故障检测和恢复:Controller 节点监控集群中的 Broker(Kafka 服务器)的状态,当发现某个 Broker 失效时,它会负责触发相应的故障恢复过程。这包括重新选举分区的领导者、分配新的副本等操作,以确保集群的高可用性和数据的持久性。
集群管理:Controller 节点扮演着整个 Kafka 集群的管理者角色,它会定期进行健康检查,并采取必要的措施来保持集群的稳定运行。例如,它可以处理节点的加入和离开,协调重平衡操作,以及处理一些集群级别的配置变更等。
总之,Kafka 的 Controller 节点是集群中非常重要的角色,负责管理整个集群的状态、元数据和故障恢复。它起到了集中协调和控制的作用,确保 Kafka 集群的高可靠性和可扩展性
4.kafka再均衡
Kafka 的再均衡(Rebalance)是指在消费者组中新增或减少消费者时,自动重新分配分区的过程。再均衡的目的是确保每个消费者尽可能均匀地消费所有分区,并且在消费者发生变化时能够自动适应。
下面是 Kafka 再均衡的详细说明:
触发再均衡:再均衡可以由多种因素触发,包括新的消费者加入消费者组、已有的消费者退出消费者组、消费者组的订阅发生变化等。这些事件会导致消费者组的元数据发生变化,进而触发再均衡。
重新分配分区:当再均衡被触发时,Kafka 的协调器(Coordinator)将负责计算并决定如何重新分配分区给消费者。它会根据一些策略,例如分区的负载情况、消费者的订阅关系等来进行分配,以实现均衡和公平性。
分区的释放和分配:在再均衡期间,首先会发生分区的释放。即当前消费者持有的分区将被剥夺,不再进行消费。然后,新的分区分配将发生,将可用的分区重新分配给消费者。这样可以确保所有的分区都被消费者均匀地处理。
位移的提交和恢复:在再均衡过程中,消费者的位移信息也会被记录和管理。当再均衡完成后,消费者会继续从上次提交的位移处继续消费消息,并保证不会重复消费或丢失消息。
再均衡是 Kafka 中实现高可用性和扩展性的关键机制之一。它能够自动适应消费者组的变化,确保消费者能够平均地消费分区,提高整个系统的吞吐量和容错性。同时,在再均衡期间仍然能够保持数据的一致性和可靠性。
5.kafka如何保证消息不重复接收
消息幂等性:Kafka 提供了幂等生产者的机制,允许生产者在发送消息时进行幂等操作。通过启用幂等性,生产者会为每条消息分配一个唯一的序列号,并记录已经发送成功的消息序列号。
如果生产者在发送过程中遇到网络错误或其他故障导致消息无法到达,它可以在恢复后重新发送相同的消息,而 Kafka 会根据序列号自动去重,确保只有一条消息被写入。
6.kafka消费者如何保证消息不被重复消费
是的,Kafka 生产者和消费者都使用了确认(acknowledgement)机制来确保消息的可靠传递。
对于生产者来说,它发送消息到 Kafka 集群后,可以选择等待消息被成功写入到至少一个副本(replica)中并收到确认(ack)后再继续发送下一条消息。这个确认机制可以通过生产者的 acks 参数进行配置,有以下三种可选值:
acks=0:生产者不需要等待任何确认,直接发送消息。这种方式速度最快,但也最容易丢失消息。
acks=1:生产者在消息被写入到领导者副本(leader replica)后就会收到确认。这种方式相对较快,同时提供了一定程度的消息可靠性。
acks=all:生产者在消息被写入到所有 ISR(in-sync replicas)副本后才会收到确认。这种方式是最安全和最可靠的,但也会带来更高的延迟。
对于消费者来说,它从 Kafka 分区中拉取数据时,可以选择以同步或异步的方式进行确认。在同步模式下,消费者会在处理完消息后手动提交偏移量给 Kafka,以表示已经成功消费了该消息。在异步模式下,消费者可以配置自动提交偏移量的时间间隔,让 Kafka 自动进行偏移量的提交。
使用确认机制可以确保消息在生产者和消费者之间的可靠传递。生产者通过等待确认来确保消息被写入到 Kafka,并根据设置的 acks 参数控制确认的程度。消费者通过手动或自动提交偏移量来确认消息的消费状态,以避免重复消费和丢失消息。
7.kafka的消息id是何时生成的
是的,Kafka 会为每个消息生成一个唯一的消息ID。这个消息ID被称为偏移量(Offset),它表示消息在分区中的位置。
每个分区都有一个递增的偏移量序列,用于标识不同消息的相对顺序。当生产者向 Kafka 发送消息时,它们被附加到分区的末尾,并被分配一个新的偏移量。
消费者可以使用偏移量来跟踪已经读取的消息和下一条要读取的消息。通过指定偏移量,消费者可以从特定的位置开始消费消息,或者按照自定义的逻辑进行回溯、重放等操作。
偏移量的生成由 Kafka 集群自动管理,保证了全局唯一性。每个分区的偏移量是单调递增的,不会重复或重置。此外,Kafka 还提供了一些功能来帮助应用程序处理偏移量,例如自动提交偏移量、手动管理偏移量等。
总之,Kafka 为每个消息生成唯一的偏移量作为消息ID,使得应用程序能够精确地追踪、处理和管理消息。
配合下面的面试题
https://www.jianshu.com/p/dab60fcd672d