KAFKA节点故障的容错方案

news2024/9/28 21:19:08

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集群的高可用容错方案和容错能力的探讨。在出现单机故障时相关的容错方案。

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


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数据丢失,是否会自动做均衡?

每一个parition数据都在创建的时候做了分工,固定在某个brokerid上。不会主动迁移到其他的broker。

1, 如果机器宕机,并且该机器不能自动修复。
不会,需要人工干预后才能修复。因为每一个parition数据都在创建的时候做了分工,固定在某个brokerid上。不会主动迁移到其他的broker。

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

2, 重新申请一个机器,保持原有的brokerid启动
会。因为每个parition的数据分配到不同的brokerid上,对应的broker以相同的id启动后,相关的partition会分配到对应的broker上,该broker以follower的形式启动,并从leader同步拉起数据。但是如果数据还没有追上leader数据后,不能加入ISR中,因此也不影响客户端的生产和消费

3, 重新申请一个机器,以新的brokerid启动
不会,需要人工干预后才能修复。 原因是新的brokerid没有分配到对应的partition,因此这台机器此时是空的,需要人工介入,分配相关的partion,完成后才会主动从leader拉取数据,进行数据同步。

测试情况如下

右侧的kafka的数据清理后,重启,有brokerid不变,能够分配到对应的partition,会自动从leader拉取数据,完成数据同步
在这里插入图片描述

5. 参考文档

  • Kafka 源码解析之日志管理

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

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

相关文章

11:按键

按键 1、按键的相关知识2、独立按键3、CPU如何处理按健4、编程测试(用LED1作为指示)5 、编程测试(用8个LED作为指示) 1、按键的相关知识 分为独立按键和矩阵按键 2、独立按键 由图得独立按键右边接地,左边独立连接到…

正则表达式可视化工具regex-vis

什么是正则表达式 ? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…

题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?

lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…

【课程作业_01】国科大2023模式识别与机器学习实践作业

国科大2023模式识别与机器学习实践作业 作业内容 从四类方法中选三类方法,从选定的每类方法中 ,各选一种具体的方法,从给定的数据集中选一 个数据集(MNIST,CIFAR-10,电信用户流失数据集 )对这…

微信小程序新手入门教程三:基础语法介绍

WXML(WeiXin Markup Language)是框架设计的一套标签语言,可以与各种组件相结合,进行页面构建。 一 常用标签 wxml的语法结构与我们熟悉的html很像,但在细节处略有不同,我们可以参考html标签对比记忆。wxm…

基于协同过滤的个性化电影推荐系统分析设计python+flask

本系统为用户而设计制作个性化电影推荐管理,旨在实现个性化电影推荐智能化、现代化管理。本个性化电影推荐自动化系统的开发和研制的最终目的是将个性化电影推荐的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利…

华为OD机试真题【日志首次上报最多积分】

1、题目描述 【日志首次上报最多积分】 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验; 如果一次上报的…

京东物流基于 StarRocks 的数据分析平台建设

作者:京东物流 数据专家 刘敬斌 小编导读: 京东集团 2007 年开始自建物流,2017 年 4 月正式成立京东物流集团,截至目前,京东物流已经构建了一套全面的智能物流系统,实现服务自动化、运营数字化及决策智能化…

whale-quant 学习 part7:量化回测

量化回测 计算策略评估指标聚宽平台量化回测实践策略实现 参考 计算策略评估指标 使用数据为:贵州茅台(600519.SH)、工商银行(601398.SH)、中国平安(601318.SH),策略基准是沪深300指…

使用输出事件激活Simulink块

什么是输出事件? 输出事件是发生在Stateflow图表中,但在图表外的Simulink块中可见的事件。这种类型的事件允许图表将图表中发生的事件通知模型中的其他块。 您可以使用输出事件来激活同一模型中的其他块。您可以在图表中定义多个输出事件,其中每个输出事件映射到一个输出端…

Flutter组件 StatefulWidget、StatelessWidget 可继承写法

前言 学过Java的同学,应该都知道面向对象语言的三大特征,封装、继承、多态; Dart也是面向对象的语言,但是在Flutter中的很多组件都被下划线 _ 标记为私有,导致无法继承,本文将介绍一种非私有的创建组件写…

大数据-Spark-关于Json数据格式的数据的处理与练习

上一篇: 大数据-MapReduce-关于Json数据格式的数据的处理与练习-CSDN博客 16.7 Json在Spark中的引用 依旧利用上篇的数据去获取每部电影的平均分 {"mid":1,"rate":6,"uid":"u001","ts":15632433243} {"m…

Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

一、前言 之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutpu…

centOS/Linux系统安全加固方案手册

服务器系统:centos8.1版本 说明:该安全加固手册最适用版本为centos8.1版本,其他服务器系统版本可作为参考。 1.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险。 操作步骤  使用命令 userdel <用户名> 删除不必要的账号。  使用命令 passwd…

ubuntu 上安装和配置Apache2+Subversion

目录 一、安装Apache2和SVN 二、Apache2设置 三、subversion配置 四、创建仓库和设置权限 五、仓库备份和恢复 系统环境 Ubuntu Linux (20.04) apache2 Subversion(1.13.0) 一、安装Apache2和SVN 通过命令在线安装apache2和subversion apt-get install apache2 libap…

Datax问题记录

1、同步mysql&#xff1a;OS errno 24 - Too many open files 2023-11-20 12:30:04.371 [job-0] ERROR JobContainer - Exception when job run com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的…

颐和园龙纹珍宝展亮相,文物预防保护科技护航

在皇家园林颐和园的深处&#xff0c;一场独特的文化盛宴正静静上演。2月1日&#xff0c;“祥龙贺岁—颐和园藏龙纹题材文物特展”在德和园华丽揭幕。此次特展汇聚了66件珍贵文物&#xff0c;包括玉器、瓷器、书画、珐琅、家具等&#xff0c;每一件都是颐和园园藏的瑰宝。这些文…

LLM应用开发与落地:使用gradio十分钟搭建聊天UI

一、背景 如果你是做LLM应用开发的&#xff0c;特别是做后端开发&#xff0c;你一定会遇到怎么快速写一个聊天UI界面来调试prompt或agent的问题。这时候的你可能在苦恼中&#xff0c;毕竟react.js, next.js, css, html也不是每个人都那么熟练&#xff0c;对吧&#xff1f;即使…

pyqt5-QCheckBox控件使用介绍

一、简介 作用&#xff1a;用于给用户提供若干选项中的多选操作&#xff0c;比如&#xff1a;爱好可以有多个 等等。 继承自 QAbstractButton。 1、基础工程 from PyQt5.Qt import * import sysapp QApplication(sys.argv)window QWidget()window.setWindowTitle("Q…

一文掌握SpringBoot注解之@Configuration知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…