宕机了?!DolphinScheduler 高可用和 Failover 机制关键时刻保命

高可用性是 Apache DolphinScheduler 的特性之一。它通过冗余来避免单点问题,所有组件天然支持横向扩容;但仅仅保证了冗余还不够,当系统中有节点宕机时,还需要有故障转移机制能够自动将宕机节点正在处理的工作转移到新节点上执行,从而实现高可用。
01 DolphinScheduler架构介绍
Apache DolphinScheduler是一个分布式易扩展的工作流编排调度系统。其核心架构主要由3部分组成:APIServer, Master, Worker。
其中API-Server负责接收所有的用户操作请求,Master负责工作流的编排和调度,Worker负责工作流中任务的执行。整个系统通过注册中信做服务发现,通过数据库持久化元数据。 
一个工作流执行的生命周期如下:
- 在API-Server中创建,并将元数据持久化到DB中。
- 通过手动点击或定时执行生成一个触发工作流执行的Command写入DB。
- Master消费DB中的Command,开始执行工作流,并将工作流中的任务分发给Worker执行。
- 当整个工作流执行结束之后,Master结束工作流的执行。
02 DolphinScheduler集群高可用
分布式系统中必须要考虑的因素是系统整体的高可用(HA)。高可用指的是系统整体能够对外提供服务的时间占比很高,系统因为故障而无法提供服务的时间占比很短。
为了保证系统的高可用,架构的一个设计原则是通过冗余来避免出现单点问题。单点问题是指系统中某一任务组件只有单个实例,如果该实例出现了故障,那么会导致系统整体不可用。
Apache DolphinScheduler也是通过冗余来避免单点问题,在DolphinScheduler中,所有组件天然就支持横向扩容。
01 API-Server高可用
对于API-Server来说,由于API-Server是一个无状态服务,因此API-Server可以很容易的通过部署多台来保证高可用。在部署多台API-Server之后,只需要将他们注册在同一网关,即可一起对外提供服务。 
02 Master高可用
Master作为DolphinScheduler中处理工作流的核心组件,其可用性直接关系到整个系统的稳定性。
由于Master并不像API-Server一样只是被动的接收外界的请求,Master会主动的消费数据库中的工作流,而一个工作流在某一时刻只能被一个Master处理,因此Master在横向扩容的时候需要考虑的问题更多。
一种比较简单的方案是采用active-standby的方式,即部署多台Master服务,但是只有一台处于active状态,对外工作,其他Master服务都处于standby状态,只有等active的Master宕机,standby状态的Master会重新选举出一台新的active Master对外工作。 
这种方案实现起来简单,同时可以很好的解决Master单点问题,但是这种active-standby的架构同一时刻只能有一台Master进行工作,对于DolphinScheduler来说,由于Master需要处理工作流的调度,因此这会导致整个集群的工作流处理吞吐量上不去。
在DolphinScheduler中采用分片的方式对工作流元数据进行了预划分,具体来说对工作流产生的command根据id进行分片,将command均匀的分散到所有的Master,这样来达到所有Master都可以同时工作,并且不会互相影响。
Master通过注册中心来感知集中其他Master的节点信息,由于当节点上下线的时候,Master的元数据变更通知到所有Master服务时间会不一致,因此通过数据库事务做了进一步的保障,保证同一个Command只会被处理一次。
03 Worker高可用
Worker作为DolphinScheduler中任务执行组件,其扩展比较容易,这是由于在设计上,Worker主要是被动的接收Master分发的任务,他不会主动去数据库中拉取任务。因此Woker只需要在横向扩容之后注册到注册中心即可,Master会通过注册中心感知到Worker的元数据变更。
03 DS中的Failover实现原理
仅仅保证了冗余还不够,当系统中有节点宕机时,还需要有故障转移机制能够自动将宕机节点正在处理的工作转移到新节点上执行。在DolphinScheduler中所有的故障转移工作都由Master完成。
Master会监听注册中心中所有Master和Worker的健康状况,一旦有节点下线,所有Master会收到该节点下线的事件,然后执行容错逻辑。
通过竞争分布式锁的方式来决定由谁来进行本次故障转移操作。
在执行容错操作时,会根据Master/Worker的类型不同执行不同的容错操作。对于发生Master容错时,所有存活的Master会通过竞争分布式锁的方式来决定由谁来进行本次故障转移操作,竞争到分布式锁的Master会去数据库中查询出宕机节点中正在运行的工作流实例生成容错请求。对于发生Worker容错,所有Master会找出当前内存中是否有正在该Worker上运行的任务,如果有那么触发任务容错逻辑。
一种特殊情况是,可能集群中所有Master都宕机了,那么此时没有Master可以执行容错逻辑,因此当后面集群恢复时,在Master启动的时候也会进行容错逻辑。
本文由 白鲸开源科技 提供发布支持!
相关文章:
宕机了?!DolphinScheduler 高可用和 Failover 机制关键时刻保命
高可用性是 Apache DolphinScheduler 的特性之一。它通过冗余来避免单点问题,所有组件天然支持横向扩容;但仅仅保证了冗余还不够,当系统中有节点宕机时,还需要有故障转移机制能够自动将宕机节点正在处理的工作转移到新节点上执行&…...
try(){}用法try-with-resources、try-catch-finally
属于Java7的新特性。 经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话,最后在finally块中显示的释放掉有可能被占用的资源。 但是如果资源类已经实现了AutoCloseable这个接口的话,可以在try()括号中可以写操作资源的语句(…...
常见Http错误码学习
常见 http 错误码 服务器巡检时比较常见的 http 错误码 400 Bad Request408 Request Timeout499 client has closed connection502 Bad Gateway504 Gateway Timeout 这些错误码反映了服务器什么样的状态,仅看字面意思还不太容易理解,就动手做个试验…...
qemu-基础篇——ARM 链接过程分析(六)
文章目录 ARM 链接过程分析源文件global_bss_file.cglobal_data_fle.cglobal_function_file.cglobal_rodata_file.cmain.c 链接文件 link.lds编译命令及反汇编命令解析 .o 文件global_bss_file.oglobal_data_fle.oglobal_function_file.oglobal_rodata_file.omain.o 链接观察链…...
Java企业工程项目管理系统+spring cloud 系统管理+java 系统设置+二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
Eureka与Zookeeper的区别
著名的CAP 理论指出,一个分布式系统不可能同时满足 C( 一致性 ) 、 A( 可用性 ) 和 P( 分区容错性 ) 。 由于分区容错性在是分布式系统中必须要保证的,因此我们只能在 A 和 C 之间进行权衡,在此 Zookeeper 保证的是 CP, 而 Eureka 则是 AP…...
顺序表和链表的各种代码实现
一、线性表 在日常生活中,线性表的例子比比皆是。例如,26个英文字母的字母表(A,B,C,……,Z)是一个线性表,表中的数据元素式单个字母。在稍复杂的线性表中,一个数据元素可以包含若干个数据项。例…...
C# 介绍三种不同组件创建PDF文档的方式
1 c# 数据保存为PDF(一) (spire pdf篇) 2 c# 数据保存为PDF(二) (Aspose pdf篇) 3 c# 数据保存为PDF(三) (PdfSharp篇) 组件名称 绘制…...
极简面试题 --- Redis
什么是 Redis? Redis 是一个基于内存的键值存储系统,也被称为数据结构服务器。它支持多种数据结构,例如字符串、哈希表、列表、集合和有序集合,并且可以在内存中快速读写。 Redis 的优势有哪些? 快速:由…...
可视化图表API格式要求有哪些?Sugar BI详细代码示例(4)
Sugar BI中的每个图表可以对应一个数据 API,用户浏览报表时,选定一定的过滤条件,点击「查询」按钮将会通过 API 拉取相应的数据;前面说过,为了确保用户数据的安全性,Sugar BI上的所有数据请求都在Sugar BI的…...
学习vue(可与知乎合并)
一:组件及交互 1、什么是组件? 组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是 。我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用: 声明组件 // 定义一个名…...
【UEFI实战】Linux下如何解析ACPI表
本文介绍如何在Linux下查看ACPI表示。使用的系统是Ubuntu18.04: Linux home 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 可以在如下的目录看到ACPI的基本信息: 但是默认的表都是不可以直接查看的&…...
Java-Redis持久化之RDB操作
Java-Redis持久化之RDB操作 1.为什么redis需要持久化?2.什么是RDB操作?3.请你用自己的话讲下RDB的过程?4.如何恢复rdb文件? 1.为什么redis需要持久化? Redis是内存数据库,如果不将内存数据库保存到磁盘,那么服务器进程退出&am…...
信号signal编程测试
信号会打断系统调用,慎用,就是用的时候测一测。 下面是信号的基础测试 信号 信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。信号可以由各种异步事件产生,例如…...
Linux学习记录——이십삼 进程信号(2)
文章目录 1、可重入函数2、volatile关键字3、如何理解编译器的优化4、SIGCHLD信号 1、可重入函数 两个执行流都执行一个函数时,这个函数就被重入了。比如同一个函数insert,在main中执行时,这个进程时间片到了,嵌入了内核…...
Revit中如何创建曲面嵌板及一键成板
一、Revit中如何创建曲面嵌板 在我们的绘图过程中可能会遇见一些曲面形状,而我们的常规嵌板没办法满足我们绘制的要求,我们今天学习如何在revit中绘制曲面嵌板。 1.新建“自适应公制常规模型”族,创建4个点图元并为其使用自适应。 2.在相同的…...
STM32F4_DHT11数字温湿度传感器
目录 前言 1. DHT11简介 2. DHT11数据结构 3. DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h 前言 DH…...
WiFi(Wireless Fidelity)基础(十一)
目录 一、基本介绍(Introduction) 二、进化发展(Evolution) 三、PHY帧((PHY Frame ) 四、MAC帧(MAC Frame ) 五、协议(Protocol) 六、安全&#x…...
操作系统—— 精髓与设计原理--期末复习
一、计算机系统概述 1、基本构成 计算机有四个主要的结构化部件: ①处理器(Processor):控制计算机的操作,执行数据处理功能。当只有一个处理器时,它通常指中央处理器(CPU) ②内存…...
每天一道算法练习题--Day21 第一章 --算法专题 --- ----------位运算
我这里总结了几道位运算的题目分享给大家,分别是 136 和 137, 260 和 645, 总共加起来四道题。 四道题全部都是位运算的套路,如果你想练习位运算的话,不要错过哦~~ 前菜 开始之前我们先了解下…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
