大数据面试题之Kafka(1)

目录

介绍下Kafka,Kafka的作用?Kafka的组件?适用场景?

Kafka作为消息队列,它可解决什么样的问题?

说下Kafka架构

说下Kafka的特点,优缺点

Kafka相比于其它消息组件有什么好处?

Kafka生产者与消费者

Kafka分区容错性

Kafka的消费端的数据一致性

Kafka的leader挂掉之后处理方法

说下Kafka的ISR机制

Kafka的选举机制

Kafka的ISR、OSR和ACK介绍,ACK分别有几种值?


介绍下Kafka,Kafka的作用?Kafka的组件?适用场景?

Apache Kafka 是一个开源的分布式流处理平台,最初由LinkedIn开发,后来捐赠给了Apache软件基金会。Kafka设计用于处理实时数据
流,提供高吞吐量、低延迟、持久性和容错性。它是一种发布/订阅消息系统,可以处理消费者在网站中的所有动作流数据,因此在大规模数
据处理和实时数据分析中扮演着重要角色。

Kafka 的作用

Kafka 主要用于以下几种场景:
1) 消息队列:作为高性能的消息队列,Kafka 提供了发布/订阅模型,支持解耦消息的生产者和消费者。
2) 日志和事件数据集成:Kafka 可以作为中央集线器,汇聚来自各种应用、系统和设备的日志和事件数据。
3) 实时数据流处理:Kafka 支持实时数据流处理,可以用于复杂事件处理、数据转换和实时分析。
4) 数据集成和移动:作为数据管道,Kafka 可以用于数据迁移和在不同系统间的数据集成。
5) 事件溯源:Kafka 可以记录和重放系统事件,支持故障分析、审计和数据重播。
6) 流处理:结合流处理框架(如Apache Flink或Apache Spark Streaming),Kafka 可以构建实时分析和处理流水线。

Kafka 的组件

Kafka 的架构主要由以下几部分组成:
1) Producers(生产者):生产者负责创建和发布消息到 Kafka 的 Topics。
2) Brokers(代理节点):Kafka 的服务器节点,负责存储消息和处理请求。Broker 是 Kafka 集群中的核心组件。
3) Topics(主题):消息的分类目录,生产者将消息发布到特定的主题,消费者则订阅这些主题来消费消息。
4) Partitions(分区):主题的物理分片,每个分区是一个有序的消息队列,可以分布在不同的 Broker 上,以支持并行处理和水平扩
展。
5) Consumers(消费者):消费者订阅 Topics 并消费消息。它们可以独立消费,也可以通过 Consumer Groups 共享消费。
6) Consumer Groups(消费者组):一组协同工作的消费者,可以确保消息在组内被均衡消费。
7) ZooKeeper:虽然不是必须的,但 Kafka 常常使用 ZooKeeper 来协调集群的元数据和管理状态。

适用场景

Kafka 在以下场景中特别有用:
1) 实时数据分析:如实时监控、告警系统和市场数据流分析。
2) 日志聚合:集中收集来自多个服务器的日志,便于分析和存储。
3) 微服务间通信:作为微服务架构中的消息总线,实现服务间的异步通信。
4) 事件驱动架构:构建基于事件驱动的应用程序和服务。
5) 流处理应用:与流处理引擎集成,实现数据流的实时处理和分析。

总之,Kafka 是构建实时数据管道和流处理应用的强大工具,尤其适用于需要高并发、低延迟和数据持久性的场景。

Kafka作为消息队列,它可解决什么样的问题?

Kafka作为一个分布式、高吞吐量的消息队列,主要解决了以下几类问题:

1) 解耦:
在大型系统中,不同的服务或组件之间经常需要通信。当它们紧密耦合时,一个服务的改变可能会影响到其他多个服务。通过将消息发送到
Kafka,服务之间可以实现解耦。这样,一个服务的改变只需要考虑如何发送或接收消息,而不需要关心其他服务的内部逻辑。
2) 异步通信:
在许多场景中,请求/响应模式并不是最高效的通信方式。例如,一个用户操作可能需要触发多个后台任务,而这些任务可能需要一些时间才
能完成。使用Kafka,这些后台任务可以异步地处理消息,从而提高系统的响应速度和吞吐量。
3) 数据管道:
Kafka可以作为一个数据管道,用于在系统之间传输数据。例如,你可以将日志数据、事件数据或其他实时数据流式传输到Kafka,然后让其
他系统或服务从Kafka中消费这些数据。
4) 缓冲:
当系统面临高并发写入请求时,Kafka可以作为一个缓冲区来存储这些请求,直到它们可以被处理。这有助于防止系统过载并平滑流量高峰。
5) 分布式处理和容错:
Kafka的分布式架构允许你水平扩展处理能力。通过将消息分发到多个消费者组,你可以并行处理大量数据。此外,Kafka的副本机制提供了
数据冗余和容错能力,即使部分节点出现故障,系统仍然可以继续运行。
6) 实时数据流:
Kafka支持实时数据流处理,这使得它成为构建实时分析、监控和告警系统的理想选择。通过将数据流式传输到Kafka,你可以实时地分析数
据并做出决策。
7) 顺序保证:
Kafka为每条消息提供了一个唯一的偏移量,并在分区内保证消息的顺序。这使得Kafka在处理需要顺序保证的场景(如金融交易、日志分析
等)时非常有用。
8) 多租户和安全性:
Kafka支持多租户,允许多个应用程序或团队共享同一个Kafka集群。此外,Kafka还提供了ACLs(访问控制列表)等安全特性,以控制对
Kafka资源的访问。

综上所述,Kafka作为一个消息队列,主要解决了系统之间的解耦、异步通信、数据管道、缓冲、分布式处理和容错、实时数据流、顺序保证
以及多租户和安全性等问题。

说下Kafka架构

Apache Kafka 的架构设计是为了满足高吞吐量、低延迟、持久性和可扩展性的需求,特别是在大规模数据流处理场景下。以下是 Kafka 
架构的关键组成部分:

1、Producers(生产者):
生产者是向 Kafka 发布消息的客户端。它们将消息发布到特定的 Topics。生产者负责选择要发布消息的 Topic 和 Partition。
2、Brokers(代理节点):
Brokers 是 Kafka 集群中的服务器节点,它们存储消息并处理来自生产者和消费者的请求。每个 Broker 是一个单独的 JVM 进程,可
以运行在集群中的不同机器上。Kafka 集群可以由一个或多个 Broker 组成,以提供冗余和高可用性。
3、Topics(主题):
Topics 是消息的分类目录,它们是逻辑上的概念。一个 Topic 可以有多个 Partition,以支持更高的并发和数据分布。生产者将消息发
布到 Topics,而消费者订阅 Topics 来消费消息。
4、Partitions(分区):
Partitions 是物理上的概念,是每个 Topic 的子集,它们是消息的实际存储单元。每个 Partition 是一个有序的消息队列,可以分布
在不同的 Broker 上。消息在 Partition 内是有序的,但在不同的 Partition 之间不一定保持顺序。Partitions 支持水平扩展和
并行处理。
5、Replicas(副本):
Kafka 为了保证数据的持久性和高可用性,支持 Partition 的复制。每个 Partition 可以有多个副本,其中一个是 Leader,其余的
是 Followers。Leader 负责处理所有读写请求,而 Followers 同步 Leader 的数据。如果 Leader 失败,Follower 可以提升为
新的 Leader。
6、Consumers(消费者):
消费者是从 Kafka 集群中读取消息的客户端。它们订阅 Topics 并消费消息。消费者可以独立消费,也可以通过 Consumer Groups 来
共享消费。
7、Consumer Groups(消费者组):
消费者组是一组协同工作的消费者,它们共同消费一个 Topic 的消息。在一个消费者组中,每个 Partition 的消息只被组内的一个消费
者消费,从而实现消息的均衡消费。
8、ZooKeeper:
Kafka 早期版本使用 ZooKeeper 来管理集群的元数据,如 Broker 信息、Topic 配置和 Partition 的领导选举。然而,从 Kafka 
0.10.0 版本开始引入了 KRaft(Kafka Raft)模式,允许 Kafka 不再依赖 ZooKeeper,直接使用 Raft 协议来管理集群状态。

Kafka 的架构设计使得它能够处理大量数据的实时处理和存储,同时保持低延迟和高可用性。这种架构非常适合构建大规模的数据管道和流
处理系统。

说下Kafka的特点,优缺点

Kafka作为一个分布式、高吞吐量的消息队列系统,具有许多显著的特点、优点和缺点。以下是对其特点、优点和缺点的详细分析:

特点

1、高吞吐量:Kafka能够处理非常高的消息吞吐量,适用于大规模数据处理和实时数据流。例如,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
2、低延迟:Kafka具有较低的消息传递延迟,能够提供快速的消息传递服务,确保在大数据的情况下,消息延迟可以达到亚秒级。
3、可伸缩性:Kafka可以水平扩展,通过增加更多的节点来扩展处理能力和存储容量,保证系统的可靠性和性能。
4、持久性:Kafka使用磁盘存储消息,确保消息的持久性和可靠性,并支持消息的批量处理。
5、高可靠性:Kafka通过副本机制保证消息的可靠性,即使某些节点发生故障,也不会丢失消息。
6、分区:Kafka的消息被分成多个分区,每个分区可以在不同的服务器上进行写入和读取,提高了并发性能。
7、支持流处理:Kafka提供了强大的流处理功能,可以进行实时数据处理、转换和分析。
8、社区活跃:Kafka拥有庞大的开源社区支持,持续更新和改进,解决了许多实际场景中的数据处理问题。

优点
1、支持多个生产者和消费者:Kafka允许多个生产者和消费者同时处理消息,提高了系统的并发性能。
2、支持broker的横向拓展:Kafka可以方便地扩展集群规模以应对不断增长的数据需求。
3、副本集机制:通过副本机制实现数据冗余,保证数据不丢失。
4、对CPU和内存的消耗比较小:在处理大量数据时,Kafka能够保持较低的CPU和内存占用率。
5、对网络开销也比较小:Kafka通过优化数据传输机制,降低了网络开销。
6、支持跨数据中心的数据复制:Kafka支持将数据复制到不同的数据中心,提高了系统的容错性和可扩展性。

缺点
1、扩容复杂:Kafka的扩容操作相对复杂,需要谨慎处理。当需要增加Kafka集群的容量时,可能需要重新分配分区和副本,这可能会导致
数据迁移和停机时间。
2、依赖Zookeeper:Kafka依赖于Zookeeper进行集群管理和元数据存储。如果Zookeeper集群出现问题,可能会影响到Kafka的稳定性
和可用性。
3、消息顺序性:虽然Kafka可以保证每个分区内的消息顺序性,但在跨分区的场景下,消息的顺序性可能无法得到保证。
4、监控不完善:Kafka的监控功能相对较弱,需要安装额外的插件或工具来监控系统的运行状态。
5、可能会丢失数据:在某些情况下,如网络故障或节点故障,Kafka可能会丢失部分数据。
6、可能会重复消费数据:由于Kafka的分布式特性,消费者可能会重复消费某些消息。

以上是对Kafka的特点、优点和缺点的详细分析。需要注意的是,这些特点、优点和缺点可能会因具体的使用场景和配置而有所不同。因此,
在选择使用Kafka时,需要根据实际情况进行综合考虑。

Kafka相比于其它消息组件有什么好处?

Apache Kafka 相对于其他消息组件(如 RabbitMQ、Amazon SQS、ActiveMQ、RocketMQ 等)具有独特的优点,尤其是在处理大规模
数据流和构建实时数据管道方面。以下是 Kafka 的一些显著优势:

1、高吞吐量:
Kafka 能够处理极高的消息吞吐量,每秒可达到数十万条消息,这得益于其设计为磁盘缓存优化的存储方式,以及高效的批量读写和零拷贝
技术。
2、低延迟:
Kafka 提供低至毫秒级别的延迟,这对于实时数据处理至关重要。
3、可扩展性:
Kafka 的分布式架构允许通过简单地添加更多的 Broker(服务器节点)来水平扩展,以增加存储容量和处理能力。
4、持久性和可靠性:
Kafka 使用数据持久化和副本机制来保证数据的高可靠性和容错性。即使在单个节点发生故障的情况下,数据仍然可以被访问。
5、消息持久化:
Kafka 将消息存储在磁盘上,并且可以配置保留时间,这使得数据可以长时间保留,即使没有消费者,数据也不会丢失。
6、消息排序:
Kafka 在单个 Partition 内保证消息的顺序,这在很多场景下是必要的。
7、灵活的消费模型:
Kafka 支持消费者组的概念,可以实现消息的并行消费和故障恢复。消费者可以选择从最早的、最新的或者特定偏移量的位置开始消费。
8、事件重播:
Kafka 的数据保留特性允许事件的重播,这对于调试和历史数据分析很有用。
9、流处理支持:
Kafka 集成了流处理能力,允许实时数据流的转换和分析,这在构建复杂的数据流处理应用时非常有用。
10、无单点故障:
Kafka 使用 ZooKeeper 或 KRaft(自 Kafka 0.10.0 版本起)来管理集群状态,避免了单点故障问题。
11、成熟的生态系统:
Kafka 拥有一个庞大的社区和广泛的工具生态,包括各种连接器、适配器和流处理框架,如 Apache Flink 和 Apache Spark Streaming。
12、广泛的应用场景:
Kafka 不仅适用于传统的消息队列场景,还广泛应用于日志收集、事件驱动架构、数据集成、实时监控和流式数据处理等多个领域。

尽管 Kafka 有很多优势,但它可能不是所有场景的最佳选择。例如,在需要事务性消息传递、精确一次语义或复杂消息路由的场景中,其他
消息队列系统可能会更适合。选择合适的消息组件应该基于具体的应用需求和技术栈。

Kafka生产者与消费者

在 Apache Kafka 中,生产者和消费者是消息传递系统中的关键角色,它们负责数据的产生和消费。下面是关于 Kafka 生产者与消费者
的一些详细信息:

生产者 (Producer)

生产者是 Kafka 中生成消息的客户端。它们将消息发送到特定的主题 (Topic),并且可以指定消息应发送到哪个分区 (Partition) 或
者使用消息的键 (Key) 来确定分区。生产者的主要职责包括:

1) 消息发布:生产者向 Kafka 的一个或多个主题发送消息。
2) 分区策略:生产者可以显式指定消息发送到的分区,或者让 Kafka 根据消息的键或默认分区策略来决定。
3) 批处理和压缩:生产者可以将多个消息打包成一个批次进行发送,减少网络开销,并可以对消息进行压缩以节省带宽。

消费者 (Consumer)

消费者是 Kafka 中读取和处理消息的客户端。它们订阅一个或多个主题,可以从特定的分区中读取消息。消费者的主要功能包括:

1) 消息订阅:消费者订阅一个或多个主题,接收并处理这些主题中的消息。
2) 偏移量管理:消费者跟踪消息的读取位置,即偏移量 (Offset)。消费者可以手动提交偏移量,或者让 Kafka 自动管理。
3) 消费者组:消费者可以加入消费者组 (Consumer Group),同一组内的消费者将消息分散到不同的成员,实现负载均衡和故障恢复。
4) 容错机制:消费者可以从上次提交的偏移量继续消费,即使在消费者重启或失败后,也可以从中断处继续读取。

关系

生产者和消费者通过 Kafka 的主题进行间接通信。生产者将消息发送到主题,而消费者订阅这些主题以接收消息。Kafka 的设计允许生产
者和消费者独立运作,这意味着生产者不知道哪些消费者正在接收消息,同样,消费者也不知道消息是由哪个生产者发送的。

这种设计提供了高度的解耦和灵活性,使得 Kafka 能够支持高并发的生产者和消费者,以及大规模的数据处理。生产者和消费者可以根据需
要动态地增加或减少,而不会影响到系统的整体性能和稳定性。

此外,Kafka 的生产者和消费者可以配置不同的参数,如批量大小、压缩类型、重试策略等,以优化其性能和资源使用。这些配置允许用户
根据具体的应用场景调整 Kafka 的行为,以达到最佳的性能和可靠性。

Kafka分区容错性

Kafka的分区容错性主要体现在其分布式架构和副本机制上,这些特性确保了即使在面临硬件故障、网络问题或其他系统故障时,Kafka也能
保持服务的稳定性和数据的完整性。以下是关于Kafka分区容错性的详细分析:

1、数据复制(Replication)与分区副本:
Kafka中的每个分区都可以有一个或多个副本,这些副本分布在不同的Broker上。每个分区有一个领导者(Leader)和若干追随者
(Follower)。领导者处理所有的读写请求,而追随者则复制领导者的数据。
这种数据复制的机制确保了当某个Broker或分区出现故障时,其他Broker上的副本可以继续提供服务,从而保证了数据的高可用性和容错
性。
2、ISR(In-Sync Replicas)列表维护:
ISR列表是Kafka中用于维护同步副本的一个机制。当一个Follower副本成功地从Leader副本复制了数据,并且与Leader保持同步时,它
会被加入到ISR列表中。
当Leader出现故障时,Kafka会从ISR列表中选择一个新的Leader来继续处理读写请求。这样确保了即使Leader失效,也能快速地选举出
新的Leader,保证了服务的高可用性。
3、数据可靠性:
Kafka通过数据的副本机制和ISR列表保证消息数据的可靠性。即使部分Broker宕机,只要ISR列表中的副本还存在,就不会丢失数据。
Kafka还提供了消息确认机制,即只有当消息被写入到所有的同步副本中后,才会被确认为已提交。这种机制进一步确保了数据的可靠性和一
致性。
4、容错性配置:
Kafka允许用户根据实际需求配置容错性相关的参数,如副本因子(replication factor)、最小同步副本数(min.insync.replicas)等。这些参数可以根据集群的规模和性能要求进行调整,以达到最佳的容错性和性能平衡。
5、集群扩展性:
Kafka的分区机制能够很好地支持集群的扩展。当新增加的Broker节点加入集群时,旧有的分区可以被重新分配,从而实现负载均衡。这种
扩展性使得Kafka能够应对不断增长的数据量和处理需求。

总结来说,Kafka的分区容错性主要依赖于其分布式架构、副本机制、ISR列表维护以及数据可靠性保证等方面。这些特性确保了Kafka在面
临各种故障和异常情况时,仍能够保持服务的稳定性和数据的完整性。同时,Kafka还提供了灵活的容错性配置选项和扩展性支持,使得用户
可以根据实际需求进行定制和优化。

Kafka的消费端的数据一致性

Apache Kafka 在设计上提供了多种机制来保证消费端的数据一致性,这些机制涉及到Kafka的基本架构,如分区、副本、消费者组,以及
更高级的功能,例如幂等性和事务。下面是一些关键点:

1. 分区和偏移量
分区:Kafka将数据分割到多个分区中,每个分区作为一个有序的日志,保证了在单个分区内部的消息顺序。
偏移量:消费者通过跟踪每个分区的偏移量来记录他们最后消费的位置。偏移量是一个单调递增的数字,代表消息在分区中的位置。消费者可
以手动提交偏移量,或者让Kafka自动提交。
2. 消费者组
消费者组:一组消费者可以订阅同一个主题,但每个分区在任何时候只由一个消费者组中的一个消费者消费。这确保了消息的均匀分配和故障
恢复。
3. 幂等性
幂等性:自Kafka 0.11版本开始,引入了幂等性(Idempotence)的概念,允许生产者发送多次相同的消息而不改变结果状态。对于消费
者而言,虽然Kafka本身不直接提供消费者端的幂等性,但应用程序可以通过确保在消息处理中的幂等逻辑来达到类似的效果。
4. 事务
事务:Kafka的事务特性允许生产者和消费者参与两阶段提交协议,确保跨多个分区或多个主题的操作能够原子性地完成。事务提供了强一致
性的保证,但需要注意的是,事务增加了系统的复杂性,可能会影响性能。
5. 消费确认
消费确认:消费者在成功处理完消息后提交偏移量,这确保了只有成功处理的消息才会被视为已消费。如果消费者在处理消息时失败或崩溃,
未提交的偏移量将被保留,以便在恢复时可以重新处理那些消息。
6. 容错和恢复
副本机制:Kafka通过在集群的不同节点上保存数据的多个副本(包括领导者和跟随者副本)来提高数据的可用性和容错性。如果主副本失
效,可以从其他副本中快速恢复数据。
7. 消费者配置
自动提交与手动提交:消费者可以选择自动提交偏移量,但这可能会导致消息丢失的风险,因为在处理失败和偏移量提交之间可能存在窗口
期。因此,推荐使用手动提交偏移量,以确保在消息处理完成后才提交偏移量。

综上所述,Kafka通过上述机制和配置选项提供了强大的数据一致性保证。然而,最终的数据一致性也依赖于应用程序的正确实现,尤其是在
处理消息时确保幂等性和事务的正确使用。

Kafka的leader挂掉之后处理方法

当 Apache Kafka 中的 leader 副本(replica)发生故障时,Kafka 有一套内置的机制来处理这种情况,以确保服务的连续性和数据
的一致性。以下是处理 leader 故障的步骤:

1、检测故障:
Kafka 的控制器(Controller)持续监控集群的状态,包括所有 broker 的健康状况。当 leader 所在的 broker 宕机或 leader 
本身变得不可用时,控制器会检测到这一情况。
2、选举新的 leader:
当控制器检测到 leader 故障时,它会在该分区的“同步副本集”(In-Sync Replica Set, ISR)中选举一个新的 leader。ISR 包含
了所有与当前 leader 副本同步的副本。选举通常会选择 ISR 中的某个 follower 提升为新的 leader。
3、更新元数据:
一旦新的 leader 被选举出来,控制器会更新集群的元数据,反映分区的新领导关系。这些元数据的变化会被广播到集群中的所有 
broker,以确保所有 broker 都知道新的 leader 是哪一个。
4、消费者和生产者的重新定位:
所有正在与故障 leader 交互的消费者和生产者都会检测到这一变化,并重新建立与新的 leader 的连接。这可能需要一段时间,具体取
决于客户端的配置和网络条件。
5、恢复数据流:
一旦消费者和生产者成功连接到新的 leader,数据流就可以继续。生产者可以向新的 leader 发送消息,消费者可以从新的 leader 读
取消息。
6、副本同步:
如果在 leader 故障期间有新的消息被写入,这些消息需要在 ISR 中的所有副本之间同步,以确保数据的一致性。follower 副本会从新
的 leader 拉取任何缺失的消息,并将其追加到自己的日志中。
7、故障恢复:
如果故障的 broker 最终恢复,它会重新加入 ISR,并开始从新的 leader 复制数据。一旦它再次与 leader 同步,它就可以重新成为
分区的 follower。
8、持久化元数据:
Kafka 通常使用 ZooKeeper 或者 KRaft 协议来持久化和管理集群的元数据。在 leader 故障和恢复过程中,这些元数据的变化会被持
久化,以确保集群状态的一致性。

整个过程旨在最小化服务中断的时间,并确保数据的完整性和一致性。然而,这种切换可能会导致短暂的服务延迟,特别是对于那些需要重新
连接到新 leader 的消费者和生产者。此外,如果 ISR 中没有可用的副本,或者由于网络分区等问题,可能需要更长的时间来恢复服务。

说下Kafka的ISR机制

Kafka的ISR(In-Sync Replicas)机制是确保Kafka集群数据一致性和可靠性的核心组件。以下是关于Kafka ISR机制的详细解释,按
照清晰的结构进行分点表示和归纳:

ISR机制概述

定义:ISR指的是与分区领导者(Leader)保持同步的副本集合,即In-Sync Replicas。这些副本已经复制了领导者副本的所有数据,并
且与领导者的落后时间在一定范围内。
作用:ISR机制在Kafka中起到了至关重要的作用,它保证了数据的可靠性和高可用性。只有当ISR中的副本才能参与到数据的读写操作中,
从而确保了数据的一致性。

1、ISR机制的关键概念
领导者(Leader)与追随者(Follower)每个分区有一个领导者副本和零个或多个追随者副本。领导者负责处理客户端的写请求,而追随者
则复制领导者的数据。
2、ISR集合
ISR集合是领导者的一组追随者副本,它们与领导者保持数据同步。只有ISR集合中的副本才能参与数据的读写操作。
3、数据复制
领导者将消息写入其本地日志,并定期将这些消息发送给ISR集合中的追随者。追随者接收消息后,将其写入本地日志,以保持与领导者的数
据同步。
4、Leader Epoch和Log Start Offset
ISR集合中的每个追随者都维护了领导者的日志信息,包括领导者的Leader Epoch和Log Start Offset。这些信息用于确保数据的正确
复制和同步。
5、数据一致性
只有在ISR集合中的所有追随者都成功复制了一条消息后,领导者才会将该消息标记为已提交,确保数据的一致性。

ISR的动态维护

加入与移除

当新的追随者副本成功与领导者同步后,它会被加入ISR集合。
如果某个追随者由于各种原因(如网络问题、性能问题等)落后于领导者过多,它可能会被从ISR集合中移除。

重新加入
被移除的追随者在追赶上来后,会重新加入ISR集合。

ISR与AR、OSR的关系

1) AR(Assigned Replicas):分区中的所有副本集合。
2) ISR(In-Sync Replicas):与领导者保持同步的追随者副本集合。
3) OSR(Out-of-Sync Replicas):未能与领导者保持同步的追随者副本集合。
4) 关系:AR = ISR + OSR

总结

Kafka的ISR机制通过维护一个与领导者保持同步的追随者副本集合,确保了数据的一致性和可靠性。当领导者发生故障时,Kafka可以从
ISR集合中选择一个新的领导者,从而保证了服务的高可用性。同时,ISR机制也通过动态地添加和移除副本,确保了在不牺牲性能的前提下
提供数据的高可靠性和容错性。

Kafka的选举机制

Apache Kafka 的选举机制主要涉及两个层面的选举:

1) Controller(控制器)选举
2) Leader(领导者)副本选举

Controller 选举

Kafka 集群中的一个关键组件是控制器(Controller),它是集群中负责管理和协调所有分区状态的 broker。Controller 的主要职责
包括:

1) 管理集群的元数据。
2) 当有 broker 上线或下线时,重新分配分区。
3) 当 leader 副本不可用时,选举新的 leader。
4) 管理分区的副本状态。

Controller 的选举机制如下:

1) 当 Kafka 集群启动时,第一个启动的 broker 会尝试在 ZooKeeper 中创建一个特殊的节点,这个节点用于标识 Controller 的
身份。
2) 如果创建成功,则该 broker 成为 Controller。其他 broker 在启动时会尝试做同样的事情,但由于节点已经被创建,它们会收到
一个异常,从而意识到 Controller 已经存在。
3) 这些非 Controller 的 broker 会在 ZooKeeper 中创建一个 watcher(观察者)来监听 Controller 的变化。如果 
Controller 出现故障,ZooKeeper 会通知所有 watcher,然后集群中的其他 broker 将尝试成为新的 Controller。

Leader 副本选举

Kafka 的每个分区都有一个 leader 副本,它负责处理所有读写请求。此外,还有多个 follower 副本,它们被动地从 leader 复制数
据。当 leader 副本不可用时,Controller 负责选举新的 leader。选举过程如下:

1) Controller 监控分区的副本状态,特别是同步副本集(ISR)。
2) 当 leader 副本失效时,Controller 会从 ISR 中选择一个新的 leader。ISR 包含所有与 leader 保持同步的副本。
3) 选举通常选择 ISR 中的第一个 follower 作为新的 leader。
4) Controller 更新集群的元数据,反映新的 leader 信息,并通知集群中的所有 broker 进行元数据更新。
5) 消费者和生产者会检测到 leader 的变化,并重新建立与新的 leader 的连接。

这些选举机制确保了 Kafka 集群的高可用性和数据的一致性。通过 ZooKeeper 或 KRaft 协议的协调,Kafka 能够在 broker 失效或
网络分区的情况下迅速恢复服务。

Kafka的ISR、OSR和ACK介绍,ACK分别有几种值?

Kafka中的ISR、OSR和ACK介绍如下:

ISR(In-Sync Replicas)
定义:ISR是与分区领导者(Leader)保持同步的副本集合。这些副本已经复制了领导者副本的所有数据,并且与领导者的数据保持同步。
作用:确保数据的一致性和可靠性。只有处于ISR中的副本才会被认为是同步的,其他副本将被视为不可靠的。
动态维护:当follower副本无法及时跟上leader副本的同步进度时,它将被移出ISR,直到它能够追赶上来。

OSR(Out-of-Sync Replicas)
定义:OSR是与领导者副本不同步的follower副本集合。当follower副本无法及时跟上leader副本的同步进度时,它将被移出ISR,并被标记为OSR。
行为:OSR副本将尝试追赶上来,一旦追赶上来并与leader副本保持同步,它将被重新添加到ISR中。

ACK(确认机制)

Kafka的ACK机制是producer的消息发送确认机制,它决定了producer在发送消息后需要等待多少个副本的确认。ACK有三种可选值:

1) ACK = 0
producer不等待broker的ack,这一操作提供了一个最低的延迟。
broker一接收到消息(还没有写入磁盘)就已经返回ack给producer。
当broker故障时有可能丢失数据。

2) ACK = 1
producer等待broker的ack,只要leader副本成功写入消息就返回ack。
如果在follower同步成功之前leader故障,那么将会丢失数据。
这是Kafka的默认设置。

3) ACK = -1
producer等待broker的ack,直到partition的leader和所有ISR中的follower副本都成功写入消息后才返回ack。
这样可以确保消息的可靠性,但可能会增加延迟。

如果在follower同步完成后,但在broker发送ack之前,leader发生故障,那么可能会造成数据重复。
通过合理设置ACK的值,可以在吞吐量和消息可靠性之间找到平衡。在实际应用中,可以根据具体需求和环境来调整ACK的值。

引用:https://www.nowcoder.com/discuss/353159520220291072

通义千问、文心一言

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值