【Kafka】分区与复制机制:解锁高性能与容错的密钥

news2024/9/21 15:11:28

🐇明明跟你说过:个人主页

🏅个人专栏:《大数据前沿:技术与应用并进》🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、kafka简介

2、kafka使用场景

二、Kafka消息可靠性基础

1、消息确认机制(ack机制)

2、消息持久化策略 

三、Kafka消息的顺序性保证

1、为什么需要顺序性保证

2、分区内的顺序性保证机制

四、Kafka的分区机制

1、分区策略与分区键

2、分区对性能与扩展性的影响

五、Kafka的复制机制

1、ISR(In-Sync Replicas)列表

2、领导者选举

3、故障转移


一、引言

1、kafka简介

Kafka 是由 Apache 软件基金会开发的一种分布式流处理平台,旨在处理高吞吐量的实时数据流。Kafka 主要用于构建实时数据管道和流式应用程序。它以其高性能、可扩展性和可靠性广泛应用于各大企业。

Kafka 的特点

1. 高吞吐量:

  • Kafka 通过水平扩展和数据分区,实现了高吞吐量的数据处理能力。


2. 持久化存储:

  • Kafka 将数据持久化到磁盘,以确保数据的可靠性。


3. 可扩展性:

  • Kafka 通过增加 broker 节点来扩展其处理能力,支持高并发的数据流。


4. 高可靠性:

  • Kafka 通过副本机制(replication)确保数据的高可靠性,避免数据丢失。


5. 实时处理:

  • Kafka 支持低延迟的数据传输,适用于实时数据处理场景。

 

2、kafka使用场景

1. 日志聚合:

  • Kafka 常用于收集和聚合分布式系统的日志数据。


2. 流式处理:

  • Kafka 可以与流处理框架(如 Apache Flink、Apache Storm)集成,用于实时数据处理和分析。


3. 数据集成:

  • Kafka 用于将不同数据源的数据集成到一个统一的平台上。


4. 消息队列:

  • Kafka 作为一种高吞吐量的消息队列,支持大规模的消息传输和处理。

 

 

二、Kafka消息可靠性基础

1、消息确认机制(ack机制)

在 Kafka 中,消息确认机制(ack机制)是确保消息从生产者发送到 Kafka 集群,并在消费者处理消息时得到确认的一种方法。它的主要目的是确保数据的可靠性和一致性,防止消息丢失或重复处理。Kafka 提供了多种消息确认模式,

主要包括以下几种:

生产者的 ACK 机制
生产者在发送消息时可以通过设置不同的 acks 参数来控制消息确认的机制:

1. acks=0:

  • 生产者在消息发送后不会等待任何确认即认为消息发送成功。
  • 这种模式下,消息的吞吐量最高,但可靠性最低,因为如果消息在传输过程中丢失,生产者不会收到任何错误提示。


2. acks=1:

  • 生产者在消息被发送到 leader 分区并确认写入后,即认为消息发送成功。
  • 这种模式下,消息的吞吐量较高,并且提供了一定的可靠性。但如果 leader 分区在确认消息写入后但在消息复制到 follower 分区前发生故障,消息可能会丢失。


3. acks=all 或 acks=-1:

  • 生产者在消息被发送到 leader 分区并且所有同步的 follower 分区都确认接收到消息后,才认为消息发送成功。
  • 这种模式下,消息的可靠性最高,但吞吐量较低。它确保了消息不会丢失,即使 leader 分区发生故障。


消费者的 ACK 机制
消费者在处理消息后,可以通过手动或自动提交位移(offset)来确认消息已被成功处理。Kafka 提供了两种主要的确认机制:

1. 自动提交(auto-commit):

  • 通过配置 enable.auto.commit=true 来启用自动提交。
  • Kafka 消费者会定期(由 auto.commit.interval.ms 参数控制)提交最新的偏移量。
  • 这种方式简单易用,但存在潜在的风险,即消息可能在消费者处理完之前被确认,导致消息丢失。


2. 手动提交(manual commit):

  • 通过配置 enable.auto.commit=false 来禁用自动提交。
  • 消费者在处理完每条消息后,显式地调用 commitSync() 或 commitAsync() 方法来提交偏移量。
    •  commitSync() 方法会阻塞,直到提交成功,适用于需要严格顺序处理的场景。
    •  commitAsync() 方法会异步提交,不会阻塞处理流程,适用于对性能要求较高但对严格顺序处理要求不高的场景。


消费者组的再均衡
当消费者加入或离开消费者组,或发生分区重新分配时,Kafka 会触发再均衡(rebalance)。再均衡过程中,消费者组内的分区可能会被重新分配给不同的消费者。为了确保消息不会丢失或重复处理,再均衡前消费者必须提交其处理的最新偏移量。

2、消息持久化策略 

Kafka 的消息持久化策略是其高可靠性和高可用性的关键特性之一。Kafka 通过将消息持久化到磁盘,确保即使在发生故障的情况下,消息数据也不会丢失。

以下是 Kafka 消息持久化的几个关键方面:

1. 分区和日志

Kafka 将每个主题分为若干个分区,每个分区在磁盘上对应一个日志文件。生产者发送的每条消息都会被追加到对应分区的日志文件中,Kafka 使用写入操作的顺序保证消息的有序性。

2. 副本机制

为了确保数据的高可用性和高可靠性,Kafka 实现了分区的副本机制。每个分区都有一个 leader 和多个 follower 副本。leader 负责处理所有的读写请求,follower 通过从 leader 同步数据来保持一致性。

  • 副本同步:每个 follower 定期从 leader 拉取消息并追加到自己的日志文件中。Kafka 使用 ISR(In-Sync Replicas)机制来跟踪那些完全同步的副本。
  • 故障转移:如果 leader 发生故障,Kafka 会从 ISR 中选出一个新的 leader,保证数据的高可用性。

3. 数据保留策略

Kafka 允许配置数据保留策略来管理消息的持久化时间和空间:

  • 基于时间的保留:可以通过配置 log.retention.hours(默认为 168 小时,即 7 天)来设置消息在日志文件中保留的时间。
  • 基于大小的保留:可以通过配置 log.retention.bytes 来设置日志文件的最大大小,当日志文件超过此大小时,Kafka 会删除最旧的消息。
  • 基于日志段:Kafka 将每个分区的日志文件进一步分割为多个段(segment)。通过配置 log.segment.bytes 来设置每个段的最大大小。

4. 清理策略

Kafka 提供了两种清理日志的策略:

  • 删除(delete)策略:默认情况下,Kafka 使用删除策略,即超过保留时间或大小限制的消息将被删除。
  • 压缩(compact)策略:Kafka 也支持日志压缩,通过配置 log.cleanup.policy=compact 来启用。压缩策略会保留每个唯一键的最新消息,对于需要存储更新数据的场景非常有用。

5. 持久化配置

以下是一些常用的 Kafka 持久化配置参数及其说明:

  • log.dirs:指定 Kafka 存储日志文件的目录,可以配置多个目录以提高 IO 性能。
  • num.partitions:指定每个主题的默认分区数量。
  • log.segment.bytes:指定日志段的最大大小。
  • log.retention.hours:指定消息保留的时间,超过此时间的消息将被删除。
  • log.retention.bytes:指定每个日志分区的最大大小,超过此大小的消息将被删除。
  • log.cleanup.policy:指定日志清理策略(delete 或 compact)。

 

实践示例

以下是一个配置示例,展示了如何设置 Kafka 的持久化策略:

# Kafka 存储日志文件的目录
log.dirs=/var/lib/kafka/logs

# 每个主题的默认分区数量
num.partitions=3

# 日志段的最大大小(1GB)
log.segment.bytes=1073741824

# 消息保留的时间(7天)
log.retention.hours=168

# 每个日志分区的最大大小(10GB)
log.retention.bytes=10737418240

# 日志清理策略(delete 或 compact)
log.cleanup.policy=delete

Kafka 的消息持久化策略通过分区、日志、数据保留和清理策略,以及副本机制,确保了数据的高可靠性和高可用性。通过合理配置 Kafka 的持久化策略,可以在保证数据安全的同时,优化存储和性能,满足不同应用场景的需求。

三、Kafka消息的顺序性保证

1、为什么需要顺序性保证

1. 数据一致性

  • 顺序性保证可以确保消费者按照生产者的发送顺序处理消息,这对于数据的一致性非常重要。例如,在金融交易系统中,交易的顺序至关重要,确保交易记录按正确的顺序处理才能保证账户余额的准确性。

2. 业务逻辑需求

  • 许多业务逻辑依赖于消息的顺序。例如,在电商平台上,用户的操作顺序必须严格按照时间顺序处理,以避免订单状态混乱或库存数量错误。若顺序不被保证,可能会导致数据不准确和业务逻辑错误。

3. 幂等性问题

  • 尽管某些系统设计为幂等的(即相同的操作可以重复执行而不会导致不同的结果),但确保顺序性可以简化幂等处理,减少重复消息带来的复杂性。例如,处理同一个用户的多次登录请求,保证请求按顺序处理能避免重复登录操作的幂等性问题。

   

2、分区内的顺序性保证机制

在 Kafka 中,分区内的顺序性保证是通过多种机制实现的。这些机制确保了消息在分区内的顺序性,从而提高了系统的可靠性和一致性。

以下是 Kafka 中分区内顺序性保证的主要机制:

1. 分区写入顺序

  • Kafka 保证生产者发送到同一分区的消息按照发送顺序被追加到该分区的日志文件中。生产者发送的每条消息都会被追加到该分区的末尾,因此分区内的消息顺序与生产者发送的顺序一致。

2. Leader-Follower 复制机制

  • 每个分区都有一个 leader 和多个 follower。生产者发送的消息首先被写入 leader 分区,然后 follower 分区从 leader 中复制数据。Kafka 保证 follower 分区按照 leader 分区的顺序复制消息,从而保证所有副本中的消息顺序一致。

3. 消费者读取顺序

  • 消费者从 Kafka 分区读取消息时,Kafka 保证消费者按照消息在分区中的存储顺序读取消息。消费者按顺序处理每条消息,并根据偏移量(offset)追踪消息的处理进度。

   

四、Kafka的分区机制

1、分区策略与分区键

Kafka 的分区策略(partitioning strategy)分区键(partition key)是确保消息有序性和负载均衡的重要机制。

分区策略

分区策略决定了消息被发送到哪个分区。Kafka 默认提供几种分区策略:

1. 轮询策略(Round Robin):

  • 没有指定分区键时,Kafka 使用轮询策略。消息被均匀分布到所有分区,保证负载均衡。

2. 自定义策略(Custom Partitioning):

  • 用户可以实现自己的分区器类,继承 Kafka 的 Partitioner 接口,实现自定义的分区逻辑。这样可以根据具体业务需求,将消息分配到特定的分区。

分区键

分区键用于确定消息被发送到哪个分区。当生产者发送消息时,可以指定一个分区键,Kafka 使用这个键进行哈希计算,将消息映射到特定的分区。

1. 使用分区键保证顺序性:

  • 当同一分区键的消息总是发送到同一个分区时,可以保证这些消息在分区内的顺序性。


2. 负载均衡与分区键:

  • 使用分区键可以实现负载均衡,同时保持相关消息的有序性。例如,将同一用户的所有消息发送到同一个分区,可以保证用户消息的顺序性。

   

2、分区对性能与扩展性的影响

Kafka 的分区机制对系统的性能和扩展性有重要影响。理解和合理配置分区策略,可以显著提升 Kafka 集群的性能和可扩展性。

性能影响

1. 并行处理:

  • 分区允许 Kafka 在多个服务器上并行处理数据,提升数据处理速度。
  • 生产者可以并行发送消息到不同分区,消费者可以并行消费不同分区的消息,从而提高吞吐量和延迟性能。


2. 负载均衡:

  • 通过合理的分区策略,消息可以均匀分布到各个分区,防止某个分区成为性能瓶颈。
  • 分区的数量和分布对集群的性能有直接影响,分区越多,负载均衡效果越好,但管理和协调成本也会增加。


3. 磁盘 I/O:

  • 每个分区对应一个日志文件,分区越多,磁盘 I/O 需求越高。
  • 多个分区可以利用多个磁盘的并行读写能力,提升整体磁盘 I/O 性能。


扩展性影响

1. 水平扩展:

  • 分区使得 Kafka 可以水平扩展,通过增加更多的分区和节点,可以处理更大的数据量和更高的并发量。
  • 当集群负载增加时,可以增加更多的分区和消费者实例来分担负载,从而实现无缝扩展。


2. 数据分布:

  • 分区策略影响数据的物理分布,决定了数据在集群中的存储和处理位置。
  • 使用合适的分区键,可以将相关的数据分配到同一个分区,提高数据的本地性和处理效率。


3. 容错和高可用性:

  • 分区和复制机制结合,可以提高系统的容错和高可用性。
  • 通过分区复制,可以在一个分区的 leader 节点故障时,自动选举新的 leader,确保数据的高可用性。

   

 

五、Kafka的复制机制

1、ISR(In-Sync Replicas)列表

ISR(In-Sync Replicas,同步副本)列表是 Kafka 中用于实现数据高可用性和一致性的重要机制。ISR 列表包含了那些与分区 leader 保持同步的副本(replica)。这些副本始终与 leader 保持一致,以确保数据的可靠性和可用性。

ISR 列表的作用

  1. 数据同步:ISR 列表中的副本与 leader 副本保持数据同步。当生产者发送消息到 leader 时,这些消息会被复制到 ISR 列表中的所有副本。
  2. 数据可靠性:由于 ISR 列表中的副本都保存了完整的数据副本,即使 leader 副本发生故障,Kafka 也能从 ISR 列表中选举出新的 leader,确保数据不丢失。
  3. 高可用性:ISR 列表保证了系统的高可用性。当 leader 副本不可用时,Kafka 可以迅速从 ISR 列表中选举出新的 leader,使系统能够继续处理读写请求。

ISR 列表的维护

  1. 添加副本:当某个 follower 副本与 leader 副本完全同步后,该副本会被加入到 ISR 列表中。
  2. 移除副本:如果某个副本落后于 leader 副本,未能在一定时间内同步数据,该副本会被从 ISR 列表中移除。

   

ISR 列表的示例

假设有一个 Kafka 分区,其副本位于三个 broker 上,分别是 broker 1、broker 2 和 broker 3。其中,broker 1 是当前的 leader 副本。

初始 ISR 列表:

ISR: [1, 2, 3]


这表示 broker 1、broker 2 和 broker 3 都是同步的。

如果 broker 2 落后于 leader 副本,未能在规定时间内完成同步,则 broker 2 会被移出 ISR 列表:

ISR: [1, 3]


如果 broker 1(leader 副本)发生故障,Kafka 会从 ISR 列表中选举新的 leader。例如,broker 3 被选举为新的 leader:

Leader: 3
ISR: [3, 1]


此时,broker 3 是新的 leader,broker 1 和 broker 3 保持同步,broker 2 仍在尝试重新同步数据。

2、领导者选举

Kafka中的每个分区都有一个领导者(Leader)副本和多个跟随者(Follower)副本。领导者负责处理所有读写请求,而跟随者负责从领导者同步数据,以确保数据的冗余和一致性。

领导者选举过程

  1. 初始选举:当Kafka启动时,集群会根据分区的元数据进行领导者选举。ZooKeeper会存储分区的元数据,包括所有副本的位置。
  2. 新分区的领导者选举:当创建新的主题或分区时,Kafka会根据配置的分区策略和副本分配策略,在集群中选举领导者。
  3. 重新选举:当现有领导者副本不可用(如崩溃或网络分区)时,Kafka会触发领导者重新选举,从剩余的同步副本(ISR列表)中选出新的领导者。

领导者选举策略

  1. 优先选择同步副本:Kafka会优先从ISR列表中选举新的领导者,以确保数据的一致性和完整性。
  2. 无优先选择:如果所有副本都从ISR列表中移除,Kafka会根据配置选择是否允许从滞后副本中选举领导者。这个策略由配置参数unclean.leader.election.enable控制。如果设置为true,Kafka允许从滞后副本中选举领导者,可能导致数据丢失;如果设置为false,Kafka等待ISR列表恢复。

   

3、故障转移

故障转移是指当领导者副本不可用时,Kafka自动将读写请求切换到新的领导者副本,以保证服务的连续性。

故障转移过程

  1. 检测故障:Kafka集群通过ZooKeeper监控领导者副本的状态。当领导者副本不可用时,ZooKeeper会通知Kafka集群。
  2. 触发选举:Kafka根据ISR列表触发新的领导者选举。优先选择与领导者保持同步的副本作为新的领导者。
  3. 更新元数据:新领导者选举完成后,Kafka更新分区的元数据,将新的领导者副本信息通知所有相关的生产者和消费者。
  4. 恢复服务:生产者和消费者接收到新的元数据后,开始向新的领导者发送读写请求,保证服务的连续性。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于大数据的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【短距离通信】【WiFi】精讲WiFi P2P技术特点及拓扑组成

1. WiFi P2P技术特点 1.1 WiFi P2P定义 WiFi P2P(WiFi Peer-to-Peer),也被称为WiFi Direct,是是WiFi联盟发布的一种无线通信技术,允许设备直接相互连接,而无需通过传统的WiFi接入点(AP&#x…

【Python篇】matplotlib超详细教程-由入门到精通(下篇)

文章目录 前言第六部分:保存与导出图表6.1 保存为图片文件示例:保存图表为 PNG 文件解释:关键点: 6.2 保存为高分辨率图片示例:保存为高分辨率图片解释: 6.3 保存为不同文件格式示例:保存为不同…

SpringCloudAliaba生成式JavaAI应用开发文生问答音像

采用SpringCloudAliabaAI型式大模型LLM,进行生成式JavaAI应用开发,实现文生问答、图像和语音合成,Web应用页面交互展现。SpringBootGradle软件框架,Idea集成开发环境,API_Post嵌入插件一体测试。 1 工效展示[文生-答/图…

牛津大学:自动发现跨领域高阶抽象泛化框架

随着LLM等技术的快速发展,进一步的抽象和泛化问题亦被看作是未来AI甚至AGI发展的关键。 然而鉴于当前不论是LLM下的自回归AR条件预测Gen方法还是CV领域的diffusion扩散Gen方法,甚至于传统DNN的无监督学习模式,在所涉及的更多通用或领域场景下…

Java+Swing用户信息管理系统

JavaSwing用户信息管理系统 一、系统介绍二、功能展示1.管理员登陆2.用户信息查询3.用户信息添加4.用户信息修改5.用户信息删除 三、系统实现1.UserDao .java 四、其它1.其他系统实现 一、系统介绍 该系统实现了管理员系统登陆、用户信息查询、用户信息添加、用户信息修改、用…

大模型→世界模型下的「认知流形」本质·上

本篇内容节选自今年初我撰写的那篇10万的文章《融合RL与LLM思想,探寻世界模型以迈向AGI》,其观点也是文章中核心中的核心。 想进一步完整阅读电子版的伙伴大家可关注评论联系我,节选内容如下↓ “...存在一个大的开放的tokenization世界。 …

解锁SQL基础应用新境界:从入门到精通的扩展实践指南(SQL扩展)

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

Unity AnimationClip详解(1)

【动画片段】 前文我们介绍了骨骼动画,在Unity中骨骼动画的部分静态数据存储在SkinedMeshRender中,而另一部分动态的关键帧数据就是存储在AnimationClip中的。 关键帧数据来自与FBX、OBJ等动画模型文件,可以在动画导入后的Animation选项卡中…

通信工程学习:什么是GSMP通用交换机管理协议

GSMP:通用交换机管理协议 GSMP(General Switch Management Protocol,通用交换机管理协议)是一种用于IP交换机对ATM交换机进行控制的协议。以下是对GSMP的详细解释: 一、定义与概述 GSMP是一种异步协议,它在…

Python画笔案例-040 绘制五角星顶圆

1、绘制五角星顶圆 通过 python 的turtle 库绘制五角星顶圆,如下图: 2、实现代码 绘制五角星顶圆,以下为实现代码: """五角星顶圆.py """ import turtledef draw_circle(d):turtle.left(90)for _ …

C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿&…

客户端绑定本地端口与服务器建立连接的详细实现

客户端绑定本地端口与服务器建立连接的详细实现 一、网络编程基础1.1 TCP/IP协议1.2 套接字(Socket)1.3 客户端与服务器模型二、客户端程序的设计2.1 需求分析2.2 流程设计三、具体代码实现3.1 伪代码3.2 C代码实现四、代码详解4.1 初始化套接字库4.2 创建套接字4.3 绑定本地…

嵌入式Linux学习笔记-C语言编译过程

c语言的编译分为4个过程,分别是预处理,编译,汇编,链接。 一、预处理 预处理是c语言编译的第一个阶段,该任务主要由预处理器完成。预处理器会根据预处理指令对源代码进行处理,将预处理指令替换为相应的内容…

Learn ComputeShader 12 Setting up a buffer-based particle effect

unity有自己的粒子系统,但是这次我们要尝试创建一个我们自己的粒子系统,而且使用计算着色器有下面这些好处。总而言之,计算着色器适合处理大规模的数据集。例如,能够高效地处理数万个甚至数百万个粒子的计算。这对于粒子系统这样的…

【HarmonyOS】骨架屏(数据请求回来之前使用组件生成骨架屏,数据回来以后【骨架屏】消失)不会让页面白屏显示空

#骨架屏作用用途 骨架屏用途就是防止用户焦虑(为了迷惑用户) #效果图 #思路: #步骤: 1.首先是封装一个骨架 (所使用的思路就是利用 linearGradient translate animation onAppear 实现骨架的闪光效果&#xff09…

【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析

【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析 目录 【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析电路交换性能分析报文交换性能分析分组交换性能分析对比 电路交换性能分析 4Kb 需要8毫秒 数据传送需要11ms 报文交换性能分…

数组与贪心算法——452、435、646、406、169(1简4中)

452. 用最少数量的箭引爆气球(中等) 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可…

Python自带日志库实现springboot彩色效果

整体目标 涉及的库均为Python3自带库实现 loggingsysenum 终端显示彩色基本原理参考👉Terminal里的颜色的那些事 Python打印日志可以直接借用logging自带的库实现,但是默认的打印实在太丑了,长下面这样 这只是一条日志看着还好比较清爽&…

VUE+Tailwind网页开发

从nodejs官网下载安装包并安装&#xff1a;https://nodejs.org/zh-cn 参考vue官网步骤配置项目&#xff1a;https://cn.vuejs.org/guide/quick-start.html $ npm create vuelatest $ cd <your-project-name> $ npm install 参考&#xff0c;安装vue-router:安装 | Vue…

【CanMV K230】矩形检测

【CanMV K230】矩形检测 什么是 矩形检测矩形检测应用领域1.目标检测2.自动驾驶3.医学图像处理4.智能零售5.图像识别6.计算机视觉 K230应用相关函数官方例程 本篇内容&#xff1a; 什么是 矩形检测矩形检测应用领域K230应用&#xff08;包含相应函数及例程&#xff09; B站视频…