KAFKA节点故障的容错方案

KAFKA节点故障的容错方案

  • 1. broker启动加载逻辑
    • 1.1 日志组成和分析
    • 1.2 snapshot文件
    • 1.3 broker启动流程
    • 1.4 LogManager的初始化和启动过程
  • 2. controller高可用
    • 1.1 选主逻辑
    • 1.2 HA切换
    • 1.3 controller的职责
  • 3. partition高可用
    • 3.1 ISR列表
    • 3.1 选举Leader
  • 4. 疑问和思考
    • 4.1 如果一个broker宕机,运行在broker上的partiton数据丢失,是否会自动做均衡?
  • 5. 参考文档

本文主要探讨kafka集群的高可用容错方案和容错能力的探讨。涉及NN、JN和DN相关组件,在出现单机故障时相关的容错方案。

更多关于分布式系统的架构思考请参考文档关于常见分布式组件高可用设计原理的理解和思考


1. broker启动加载逻辑

在kafka中,只有broker JVM进程,其余的组件或者角色都是通过broker衍生出来,因此broker的高可用和数据加载流程有必要理解和分析。

1.1 日志组成和分析

可以参考文章KAFKA高可用架构涉及常用功能整理,本文不再赘述。

1.2 snapshot文件

目前,Kafka对三类位移做checkpointing:

  • Log Start Offset
  • Recovery Point Offset
  • Replication Offset

Log Start Offset: 每个topic partition log对象都有一个重要的位移字段:log start offset,标识分区消息对外部用户或应用可见的最早消息位移。在一些事件发生时Kafka会触发对该值的更新。Kafka对该offset进行checkpointing的初衷是更快地保存分区的元数据,这样下次再初始化Log对象时能够直接加载并初始化log start offset。

Recovery Point Offset: 第二个是recovery point offset,它保存的是第一条未flush到磁盘的消息。Kafka对它进行checkpointing能够显著加速日志段恢复(recover)的速度,因为直接从recovery point offset所在的日志段开始恢复即可,没必要从头恢复日志段。毕竟生产环境上,分区下的日志段文件可能是非常多的。

Replication Offset: 保存replication过程中副本的高水位(HW)位移值。通常的场景是当副本重启回来后创建Log对象时直接使用这个文件中的offset对高水位对象进行赋值,省去了读取日志段自行计算HW值的步骤。

总之,checkpointing大体的作用都是将Kafka Broker端重要的日志元数据保存下来,避免需要通过扫描segment日志,计算获取相关元数据,从而提升恢复速度。

1.3 broker启动流程

broker启动后,整体的启动流程如下。

  1. 修改当前broker的状态为Starting
  2. 启动kafka内部调度器KafkaScheduler
  3. 初始化Zookeeper上的kafka基础目录
  4. 创建并启动日志管理对象LogManager
  5. 启动通信服务SocketServer
  6. 创建ReplicaManager管理对象
  7. 创建offset管理线程OffsetManager
  8. 创建KafkaController
  9. 启动请求处理线程,并修改broker的状态为RunningAsBroker
  10. 启动replicaManager服务
  11. 启动KafkaController,进行Controller选举
  12. 创建并启动TopicConfigManager对象
  13. 创建并启动心跳服务KafkaHealthcheck
  14. 注册动态统计到JMX
  15. 启动完成

整体启动流程中,最耗时的是步骤4,创建和启动LogManager后,会扫描和加载本地的日志文件,读取相关的数据索引信息,因此整个加载过程比较耗时。整个过程是串行执行,只有日志加载完成后,才能进行下一步的启动工作。

1.4 LogManager的初始化和启动过程

  1. 初始化 LogManger 代码有两个主要方法:
  • createAndValidateLogDirs():创建指定的数据目录,并做相应的检查: 1.确保数据目录中没有重复的数据目录、2.数据目录不存在的话就创建相应的目录;3. 检查每个目录路径是否是可读的;
  • loadLogs():加载所有的日志分区(先加载snapshot,在加载日志文件),而每个日志也会调用 loadSegments() 方法加载该分区所有的 segment 文件,过程比较慢,所以 LogManager 使用线程池的方式,为每个日志的加载都会创建一个单独的线程。整体耗时较长。
    在这里插入图片描述
  1. 启动LogManger后,主要在后台启动四个定时线程:
  • cleanupLogs:定时清理过期的日志 segment,并维护日志的大小(默认5min);
    f- lushDirtyLogs:定时刷新将还没有写到磁盘上日志刷新到磁盘(默认 无限大);
  • checkpointRecoveryPointOffsets:定时将所有数据目录所有日志的检查点写到检查点文件中(默认 60s);
  • deleteLogs:定时删除标记为 delete 的日志文件(默认 30s)。

2. controller高可用

controller的高可用和Leader是通过zk的临时锁实现的。

1.1 选主逻辑

在kafka集群启动的时候,会自动选举一台broker作为controller来管理整个集群,选举的过程是集群中每个broker都会尝试在zookeeper上创建一个 /controller 临时节点,zookeeper会保证有且仅有一个broker能创建成功,这个broker就会成为集群的总控器controller。

在这里插入图片描述

1.2 HA切换

当这个controller角色的broker宕机了,此时zookeeper临时节点会消失,集群里其他broker会一直监听这个临时节点,发现临时节点消失了,就竞争再次创建临时节点,就是我们上面说的选举机制,zookeeper又会保证有一个broker成为新的controller。

1.3 controller的职责

具备控制器身份的broker需要比其他普通的broker多一份职责,具体细节如下:

  • 监听broker相关的变化。为Zookeeper中的/brokers/ids/节点添加BrokerChangeListener,用来处理broker增减的变化。
  • 监听topic相关的变化。为Zookeeper中的/brokers/topics节点添加TopicChangeListener,用来处理topic增减的变化;为Zookeeper中的/admin/delete_topics节点添加TopicDeletionListener,用来处理删除topic的动作。
  • 从Zookeeper中读取获取当前所有与topic、partition以及broker有关的信息并进行相应的管理。对于所有topic所对应的Zookeeper中的/brokers/topics/[topic]节点添加PartitionModificationsListener,用来监听topic中的分区分配变化。
  • 更新集群的元数据信息,同步到其他普通的broker节点中。

所以所有的broker保存的元数据都是一致的,随时可以HA切换成为controller。

3. partition高可用

partition的高可用和Leader是通过controller来实现的。

3.1 ISR列表

副本进入ISR列表有两个条件:

  • 副本节点不能产生分区,必须能与zookeeper保持会话以及跟leader副本网络连通
  • 副本能复制leader上的所有写操作,并且不能落后太多。(与leader副本同步滞后的副本,是由 replica.lag.time.max.ms 配置决定的,超过这个时间都没有跟leader同步过的一次的副本会被移出ISR列表)

3.1 选举Leader

  1. controller感知到分区leader所在的broker异常(controller监听了很多zk节点可以感知到broker存活)
  2. controller会从ISR列表(参数unclean.leader.election.enable=false的前提下)里挑第一个broker作为leader(第一个broker最先放进ISR列表,可能是同步数据最多的副本)
  3. 如果参数unclean.leader.election.enable为true,代表在ISR列表里所有副本都挂了的时候可以在ISR列表以外的副本中选leader,这种设置,可以提高可用性,但是选出的新leader有可能数据少很多。

在这里插入图片描述

注明
unclean.leader.election.enable:是否启用不在ISR中的副本参与选举leader的最后的手段。这样做有可能丢失数据。

4. 疑问和思考

4.1 如果一个broker宕机,运行在broker上的partiton数据丢失,是否会自动做均衡?

不会,需要人工干预后才能修复。

kafka的数据机制是,对于每一个partition进行数据分配后,原则上不会再改动,因此不会重新分配一个Follower副本给这个paritition,并主动触发数据迁移。需要人工干预,重新分配Follower副本后,新的Follower主动向Leader获取消息,follower每次读取消息都会更新HW状态。具体操作可以参考 KAFKA高可用架构涉及常用功能整理中的《3.2.3 topic的partition扩、缩容、数据均衡》章节。

5. 参考文档

  • Kafka 源码解析之日志管理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着cherno手搓游戏引擎【15】DrawCall的封装

目标: Application.cpp:把渲染循环里的glad代码封装成自己的类: #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…

VRRP负载平衡

1.构图 2.实验 2.1如图提示配置pc1-pc4 掩码:255.255.255.0网关均设置为192.168.1(\2).254 2.2配置sw1-sw2 [sw1]port-group 1 //创建接口组,组号是1[sw1-port-group 1]group-member gigabitethernet 0/0/1 to gigabitethernet 0/0/3 //添加组成员,从…

Java注解和反射

注解和反射 课程:注解和反射02:内置注解_哔哩哔哩_bilibili 一.注解入门 1.Annotation是jdk1.5开始引入的新技术。 2.Annotation的作用: 不是程序本身,可以对程序作出解释; 可以被其他程序(例如编译器&…

4D毫米波雷达分类和工程实现

4D毫米波目标检测信息丰富,可获得目标3维位置信息、径向速度vr和rcs等,能够对目标准确分类。 4D毫米波和激光做好时空同步,可以用激光目标给4D毫米波做标注,提升标注效率。 1 激光用做4D毫米波分类真值 128线激光推理的结果作为4…

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换?总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

基于二值化图像转GCode的双向扫描实现

基于二值化图像转GCode的双向扫描实现 什么是双向扫描双向扫描代码示例 基于二值化图像转GCode的双向扫描实现 什么是双向扫描 在激光雕刻中,双向扫描(Bidirectional Scanning)是一种雕刻技术,其中激光头在雕刻过程中沿两个方向…

怎么查询鸿蒙真机支持的API版本

1、打开设备的开发者模式与USB调试并通过USB连接上电脑。 2、管理员身份运行cmd。 3、进入hdc.exe所在目录。(鸿蒙OS IDE的SDK下载目录中) 4、输入hdc shell,进入特殊模式 5、输入 getprop hw_sc.build.os.apiversion 查看API版本 6、输入 getprop hw_sc.build…

算法:积木游戏学习数学

一、算法描述 小华和小微一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小微找到这排积木中数字相同且所处位置最远的2块积木块,计算他们的…

Java 开发环境 全套包含IDEA

一、JDK配置 1.下载 JDK Builds from Oracle 去这边下载open JDK 2.JDK环境变量配置 按win,打开设置 找到环境变量编辑 这边输入的是你下载的那个JDK的bin的路径 检擦配置是否正确在cmd中输入 二、IDEA安装配置 1.下载(社区版) JetBrai…

华为---STP(二)---STP报文和STP端口状态

目录 1. STP报文简介 1.1 Configuration BPDU 1.2 TCN BPDU 2. STP交换机端口状态 2.1 STP交换机端口状态表 2.2 STP交换机端口状态迁移过程图 2.3 STP交换机端口状态变化举例说明 3 引起的STP网络拓扑改变的示例 3.1 根桥出现故障 3.2 有阻塞端口的交换机根端口所在…

学习鸿蒙基础(2)

arkts是声名式UI DevEcoStudio的右侧预览器可以预览。有个TT的图标可以看布局的大小。和html的布局浏览很像。 上图布局对应的代码: Entry //入口 Component struct Index {State message: string Hello Harmonyos //State 数据改变了也刷新的标签build() {Row()…

万户 ezOFFICE DocumentEditExcel.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Unity3D正则表达式的使用

系列文章目录 unity工具 文章目录 系列文章目录前言一、匹配正整数的使用方法1-1、代码如下1-2、结果如下 二、匹配大写字母2-1、代码如下1-2、结果如下 三、Regex类3-1、Match()3-2、Matches()3-3、IsMatch() 四、定义正则表达式…

React、React Router、JSX 简单入门快速上手

React、React Router、JSX 简单入门快速上手 介绍特点 JSX使用js表达式渲染列表样式控制注意事项 入门脚手架创建react项目安装目录介绍入口文件解析 组件解析介绍函数式组件类组件 事件绑定注意点定义使用事件对象事件处理函数接收额外参数 组件状态状态的定义使用 组件通信父…

探索水下低光照图像检测性能,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建海底生物检测识别分析系统

海底这类特殊数据场景下的检测模型开发相对来水比较少,在前面的博文中也有一些涉及,感兴趣的话可以自行移步阅读即可: 《尝试探索水下目标检测,基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBA…

ElementUI Form:Radio 单选框

Radio 单选框 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue 页面效果图 项目里el-radio.vue代码 <script> export default {name: el_radio,data() {return {radio: 1,radio2: 2,radio3: 3,radio4: 上海,radio5: 上海,radio6: 上海,radio7: 上海,r…

微信小程序如何实现点击上传图片功能

如下所示,实际需求中常常存在需要点击上传图片的功能,上传前显示边框表面图片显示大小,上传后将图形缩放到边框大小。 实现如下: .wxml <view class="{{img_src==?blank-area:}}" style="width:100%;height:40%;display:flex;align-items: center;jus…

【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr

目录 1 -> 引用 1.1 -> 引用概念 1.2 -> 引用特性 1.3 -> 常引用 1.4 -> 使用场景 1.5 -> 传值、传引用效率比较 1.6 -> 值和引用作为返回值类型的性能比较 1.7 -> 引用和指针的区别 2 -> 内联函数 2.1 -> 概念 2.2 -> 特性 3 -…

聊聊DoIP吧

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

Uniapp小程序端打包优化实践

背景描述&#xff1a; 在我们最近开发的一款基于uniapp的小程序项目中&#xff0c;随着功能的不断丰富和完善&#xff0c;发现小程序包体积逐渐增大&#xff0c;加载速度也受到了明显影响。为了提升用户体验&#xff0c;团队决定对小程序进行一系列打包优化。 项目优化点&…