Kafka高可用性原理深度解析

server/2024/10/25 10:12:07/

在分布式系统中,高可用(High Availability, HA)是指系统在面对硬件故障、网络分区、软件崩溃等异常情况时,仍能继续提供服务的能力。对于消息队列系统而言,高可用性尤为重要,因为它通常作为数据流通的中枢,任何中断都可能导致数据丢失或服务不可用。

Apache Kafka,作为一个分布式流处理平台,其高可用机制是其核心特性之一,确保了即使在部分节点失效的情况下,消息的产生和消费仍然可以持续进行。

在这里插入图片描述

Kafka的高可用机制主要依赖于以下几个关键组件和原理:

副本机制

Kafka的每个分区(Partition)都有多个副本,这些副本分布在不同的服务器(Broker)上。其中一个副本被选举为领导者(Leader),处理所有的读写操作。其余的副本称为追随者(Follower),它们从 Leader 那里同步数据。

如果 Leader 发生故障,Kafka会从 Follower 中选举出新的 Leader ,继续提供服务。

ISR机制

Leader 维护了一个动态的 ISR,含义是和 Leader 保持同步的副本集合(Leader + Follower),如果Follower长时间没有向Leader发送通信请求或同步数据,该Follower就会被踢出 ISR,该时间由 replica.lag.time.max.ms 配置,默认是 30s。

只有ISR中的副本才有资格成为新的领导者。

ACK机制

生产者发送的消息中包含acks字段,该字段代表Leader应答生产者前Leader收到的应答数。

【acks = 0】:生产者发送过来的数据,不需要等待数据落盘应答。
【数据可靠性】:丢数。


【acks = 1】:生产者发送过来的数据,Leader 收到后就应答。
【数据可靠性】:丢数。


【acks = -1】:生产者发送过来的数据,Leader 和 ISR队列里面所有的节点收到后再应答。
【数据可靠性】:丢数。

这里为啥丢数呢?

如果分区副本设置为 1 个,或者 ISR 里应答的最小副本数量(min.insync.replicas)设置为 1,就和 acks = 1 的效果是一样的,仍有丢数风险。


数据完全可靠条件:ACK 级别设置为-1 + 分区副本大于等于2 + ISR 应答的最小副本数量大于等于2

故障恢复机制

首先需要在集群所有Broker中选出一个Controller,负责各Partition的Leader选举以及Replica的重新分配;

当出现Leader故障后,Controller会将Leader/Follower的变动通知到需为此作出响应的Broker;

Kafka使用ZooKeeper存储Broker、Topic等状态数据,Kafka集群中的Controller和Broker会在ZooKeeper指定节点上注册Watcher(事件监听器),以便在特定事件触发时,由ZooKeeper将事件通知到对应Broker。

broker

当Broker发生故障后,由Controller负责选举受影响Partition的新Leader并通知到相关Broker

  • 当Broker出现故障与ZooKeeper断开连接后,该Broker在ZooKeeper对应的znode会自动被删除,ZooKeeper会触发Controller注册在该节点的Watcher;
  • Controller从ZooKeeper的/brokers/ids节点上获取宕机Broker上的所有Partition;
  • Controller再从ZooKeeper的/brokers/topics获取所有Partition当前的ISR;
  • 对于宕机Broker是Leader的Partition,Controller从ISR中选择幸存的Broker作为新Leader;

controller

  • 集群中的Controller也会出现故障,因此Kafka让所有Broker都在ZooKeeper的Controller节点/kafka/controller上注册一个Watcher;
  • Controller发生故障时对应的Controller临时节点会自动删除,此时注册在其上的Watcher会被触发,所有活着的Broker都会去竞选成为新的Controller(即创建新的Controller节点,由ZooKeeper保证只会有一个创建成功)
  • 竞选成功者即为新的Controller

总结

Kafka通过复制机制、ISR机制、Controller机制和故障检测转移等多种机制来保证数据的可靠性和高可用性,确保数据能够安全可靠地传输和存储。


http://www.ppmy.cn/server/134681.html

相关文章

远控代码的重构-远控网络编程的设计上

套路化代码 但是我们这是一个MFC工程,我们需要考虑不是所有操作都需要到main函数里面实现,有些操作可以在main函数之前完成,有些可以在main函数返回以后完成,静态全局变量满足这个需求,我们需要添加一个自己的类 编辑器细节1 添加类和添加类向导的区别,一个是添加自己的类,一…

【数据结构】队列和栈相互实现

文章目录 1.用队列实现栈2.用栈实现队列 1.用队列实现栈 这个类使用两个队列来模拟栈的行为,其中一个队列用于主要操作(queue1),另一个队列作为辅助(queue2)。通过这种方式,我们可以确保栈的后…

分享一个开源的、自托管的 API 创建工具——Strapi

软件介绍 在当今数字化时代,应用程序的开发已变得日益重要。为了满足市场对于高效、稳定且易于维护的应用程序的需求,众多开发工具与框架应运而生。其中,Strapi以其独特的功能和优势,在开发者社区中引起了广泛关注。 Strapi 是一…

LabVIEW提高开发效率技巧----用户权限控制

在LabVIEW开发中,用户权限控制是一个重要的设计模块,尤其在多用户系统中,它可以确保数据安全并控制不同用户的操作权限。为了实现用户权限控制,可以通过角色与权限管理模块来进行设计和实施。以下将从多个角度详细说明如何在LabVI…

算法汇总整理——贪心与动态规划学习路线及思考

​ 算法的知识储备 ​​ 动态规划算法(重中之重) 如果某⼀问题有很多重叠⼦问题,使⽤动态规划是最有效的 动规是由前⼀个状态推导出来的,⽽贪⼼是局部直接选最优的 不同路径II dp[i][j] 表示到达位置ij共有多少中方法 class Solution { public: int …

LinkedList 源码分析

LinkedList 简介 我们在项目中一般是不会使用到 LinkedList 的,需要用到 LinkedList 的场景几乎都可以使用 ArrayList 来代替,并且,性能通常会更好!就连 LinkedList 的作者约书亚 布洛克(Josh Bloch)自己…

springboot 读取配置的方式

Spring Boot 提供了多种方式来读取和使用配置属性。这些配置可以来自不同的源,如 application.properties 或 application.yml 文件、环境变量、命令行参数等。Spring Boot 会自动将这些配置加载到环境中,并且提供了方便的机制来访问它们。以下是几种常见…

LabVIEW水质监测系统

在面对全球性的海洋污染问题时,利用先进技术进行水质监测成为了保护海洋环境的关键手段之一。开发了一种基于LabVIEW的海洋浮标水质监测系统,该系统能够实时监测并评估近海水域的水质状况,旨在为海洋保护和污染防治提供科技支持。 项目背景 …