Orleans的成员管理和故障检测故障检测

news2025/1/18 9:55:07

Orleans的成员管理和故障检测故障检测

简介

Orleans框架是一个基于.NET平台的开源分布式系统框架,用于开发可扩展,高可用,高性能的云服务应用程序。它采用了Actor模型,将分布式系统中的各个节点抽象成为Actor,使得开发者可以更加专注于业务逻辑的实现,而无需关注底层的通信和协调机制。

Orleans框架中的故障检测算法主要是基于心跳检测实现的。通过选择一些节点来进行检测,从而实现故障检测和恢复。

算法详情

Orleans通过内置的成员管理协议提供集群管理,我们有时将其称为Silo Membership(Silo在Orleans中就是节点的意思)。该协议的目标是让所有Silo就当前活跃Silo集合达成一致,检测失败的Silo,并允许新的Silo加入集群。下文中提到的节点与Silo的概念是一致的。

该协议依赖 IMembershipTable 的一组接口。IMembershipTable 可以理解是一组操作数据库的接口,用于存储当前的节点列表以及一些与故障检测相关的信息。目前,IMembershipTable有多种实现:基于 Azure 表存储、SQL Server、Apache ZooKeeper、Consul IO、AWS DynamoDB 和用于开发节点使用的内存模拟。

  1. 最开始时每个节点都调用IMembershipTable将自己的信息(ip:port:epoch)写入到数据库中。epoch其实就是节点启动时间,因此ip:port:epoch是全局唯一的。

  2. 节点间通过心跳来互相监控,心跳和业务消息走的是同一条TCP连接,所以心跳成功与否与服务器的实际运行状况相关。节点间监控并不是all-to-all的,而是从一致性HASH环上选择X个后继节点进行检测。比如,如果有10个节点,X=3,那么节点S就会在Hash环上选取S节点后面的三个节点进行检测。
    在这里插入图片描述

  3. 如果节点S监控了P,且多次(N)未收到P的回复。则它会将带时间戳的怀疑信息(可理解为投票)写入IMembershipTable 中。

  4. 如果K秒内有超过Z个节点怀疑P是故障的,则S会将P标记为故障,并写入IMembershipTable,并广播所有节点要求所有节点重新读取成员列表(每个节点本身也会定时读取的)。

  5. 更详细地来讲:

  1. 当S怀疑P时,它会写入"S在时间T1怀疑P"
  2. 仅有S怀疑P是没用的,需要在时间窗口T(通常为3分钟)内有Z个不同节点怀疑,才能宣布P的死亡
  3. 如果S是最后一个怀疑者(即在T时间内已经有Z-1个节点怀疑P),则S决定宣布P死亡,在这种情况下,S会将P死亡的信息写入IMembershipTable
  4. 注意此处是有并发控制的,同时只有一个节点会写入成功,多个节点并发写可能会导致某些写失败,写入失败时会重试直到成功。
  1. 每个节点也会定时读取成员列表进行更新,这样节点可以尽快地了解其他节点的加入或退出事件。
  2. Orleans的默认配置 心跳周期:10s、T:3分钟,Z:2,X:3,N:3。即:每个节点监控3个后继节点,也被3个前继节点监控。S每10秒发送一次心跳给P,连续3次未收到回复则怀疑P故障,当3分钟内有2个节点都怀疑P故障时,认为P真的故障了。
  3. 主动退出机制:如果某个节点与其他节点失去了通信,该节点进程本身还在运行,此节点还是会被其他节点认为故障的。当本节点发现自己被其他节点认为故障时,会主动退出。所以这也需要另外的机制来保障进程退出后被重新拉起,比如k8s、自行实现的看门狗等。

算法的特点

  1. 可以处理任意数量的失败

    传统的比如基于Paxos的算法,故障节点不能超过一半。 而本算法没有此限制,微软官方文档说他们在生产环境上看到过一半以上的节点出现故障时,此系统仍然正常运行。

  2. 准确性和完整性可调节,可以通过调节参数来在两者之间进行取舍

  3. 规模

    本算法可以处理上千、甚至上万台服务器。这与传统的基于 Paxos 的解决方案形成鲜明对比,例如组通信协议,众所周知,组通信协议的规模不能超过数十个。

  4. 诊断

    诊断也非常的方便,因为算法的中间过程都写在IMembershipTable中,可以方便地看到故障检测情况。

  5. 为什么需要可靠的持久存储来实现IMembershipTable

    我们为 IMembershipTable 使用持久存储(Azure 表、SQL Server、AWS DynamoDB、Apache ZooKeeper 或 Consul IO KV)有两个目的。首先,它被用作节点相互寻找以及客户端寻找节点的集合点。其次,将成员资格视图存储在可靠的存储中,并使用该存储提供的并发控制机制来就谁还活着、谁已经死了达成一致。这样,从某种意义上说,我们的协议将分布式共识的难题外包给了存储服务。

  6. 如果存储无法访问时会如何

    存储服务关闭、不可用或存在通信问题时——在这种情况下,我们的协议不会错误地宣布节点已死亡。已经存在的节点会继续运行。但是,我们将无法声明某个节点已故障(就算检测到某些节点已故障,也无法将此事实写入表中),并且也无法允许新的节点加入。因此,完整性会受到影响,但准确性不会。此外,在出现部分网络分区的情况下(例如某些节点可以访问表,而有些则不能),我们可能会将死筒仓声明为已死,但需要一些时间才能让所有其他筒仓了解它。因此检测可能会延迟,但我们绝不会因为表不可用而误杀某个节点。

  7. 各个节点还会定时(例如5分钟一次)将“我还活着”的信息写入表中,这个仅用于调试排查问题时使用,对算法本身没啥作用。

配置:

默认配置如下:

<Liveness ProbeTimeout="5s"
    TableRefreshTimeout="10s"
    DeathVoteExpirationTimeout="80s"
    NumMissedProbesLimit="3"
    NumProbedSilos="3"
    NumVotesForDeathDeclaration="2" />

这个默认值是根据Azure多年生产使用情况确定的,微软相信它们代表了良好的默认设置。一般来说没必要改变他们。

设计原理

人们可能会问的一个自然问题是,为什么不完全依赖 Apache ZooKeeper 来实现集群成员身份,为什么我们要费心实施我们的会员协议?主要有以下三个原因:

  1. 在云中部署/托管
    Zookeeper 不是托管服务(至少在 2015 年 7 月撰写本文时,而且当我们在 2011 年夏天首次实现此协议时,任何主要云提供商都没有作为托管服务运行的 Zookeeper 版本)。这意味着在云环境中 Orleans 客户必须部署/运行/管理他们的 ZK 集群实例。这只是另一个不必要的负担,我们不想强加给我们的客户。通过使用 Azure Table,我们依赖于托管、托管服务,这使我们客户的生活变得更加简单。基本上,在云中,将云用作平台,而不是基础设施。另一方面,当在本地运行并管理服务器时,依赖 ZK 作为 IMembershipTable 的实现是一个可行的选择。

  2. 直接故障检测
    使用ZK时,ZK会对Orleans节点进行健康检测,但是这并不能说明Orleans节点之间实际的通信状态。比如ZK和Orleans节点网络故障了,但实际上Orleans节点还是能正常提供服务的,此时ZK仍然会认为Orleans节点故障。而本文提出的算法中,即使Orleans各节点与存储服务之间通信故障,依然可以继续提供服务。

  3. 便携性和灵活性

    作为 Orleans 理念的一部分,我们不想强迫对任何特定技术的强烈依赖,而是拥有灵活的设计,可以轻松地在不同的实现中切换不同的组件。这正是 IMembershipTable 抽象所服务的目的。

参考资料

[1] Orleans官方文档

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

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

相关文章

Linux入门---页表的理解

目录标题 第一次认识页表第二次认识页表如何看待页表页表的大致构成 第一次认识页表 我们第一次认识页表是在介绍地址空间的时候&#xff0c;我们知道操作系统将内存划分为好几个区域&#xff0c;比如说栈区&#xff0c;堆区&#xff0c;未初始化区&#xff0c;已初始化区&…

力扣刷题 day47:10-17

1.位1的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 方法一&#xff1a;逐个判断 利用n&1 #方法一&#xff1a;逐个…

重载、重写(覆盖)与重定义(隐藏)

重载、重写&#xff08;覆盖&#xff09;与重定义&#xff08;隐藏&#xff09; 重载隐藏&#xff08;重定义&#xff09;多态&#xff1a;重写&#xff08;覆盖&#xff09; 三者的区别 重载 必须是在一个作用域&#xff0c;函数名相同&#xff0c;参数不同&#xff08;个数不…

C复习-基础知识

参考&#xff1a; 里科《C和指针》Bryant, Hallaron 《深入理解计算机系统》何昊&#xff0c;叶向阳《程序员面试笔试宝典》 从hello.c到可执行文件hello 在Unix系统中&#xff0c;从源文件到目标文件的转化是由编译器驱动程序完成的&#xff1a; root> gcc -o hello hel…

RTOS(4)自己的第一个FreeRTOS程序

创建两个任务 什么是任务呢&#xff1f; 对于整个单片机程序&#xff0c;我们称之为application&#xff0c;应用程序。 使用FreeRTOS时&#xff0c;我们可以在application中创建多个任务(task)&#xff0c;有些文档把任务也称为线程 (thread)。 void Task1Function(void *p…

课时4作业3

Description 某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张&#xff0c;且每种票子至少一张。问&#xff1a;有几种换法&#xff1f; Input 无输入 Output 一个数&#xff0c;表示共有多少种换法 Sample Input 1 无 Sample O…

手写一个PrattParser基本运算解析器1: 编译原理概述

点击查看 基于Swift的PrattParser项目 编译原理概述 编译原理是我们每一个程序猿必须要了解的技能, 编译原理实际上并没有啥高深的技术, 我们如果在做业务开发, 也很少会用到编译开发的知识, 但是编译原理又是我们必备的基础知识之一. 所以我们需要对编译原理的内容有一个大概的…

76.C++ STL list容器

目录 1.什么是list容器 2.list构造函数 3. 元素插⼊和删除操作 4.大小操作 5.赋值操作 6.数据存取操作 7.反转、排序 1.什么是list容器 list 是 C 标准库提供的双向链表容器。它与 vector 和 deque 不同&#xff0c;不是连续的内存块&#xff0c;而是由节点组成的链表结…

C语言——二周目——数据在内存中的存储

目录 一、整数的存储方式 二、浮点数的存储方式 一、整数的存储方式 因为CPU只有加法器&#xff0c;所以对于整型来说&#xff0c;数据在内存中通常采用补码的方式进行储存。 在这里复习一下原码、反码、补码。 正数和无符号数的原码、反码、补码相同&#xff1b; 负数的原…

考察软件开发公司的能力

当公司需要与软件外包公司合作时需要考察软件开发公司的能力和水平&#xff0c;这会涉及到很多方面的因素。需要通过综合考察和了解软件开发公司的能力和水平&#xff0c;选择合适的合作伙伴&#xff0c;确保项目的成功交付。下面分享一些关键步骤和方法&#xff0c;希望对大家…

【JVM】JVM的垃圾回收机制

JVM的垃圾回收机制 对象死亡判断方法引用计数算法可达性分析算法 垃圾回收算法标记清除法复制算法标记整理算法分代算法 Java运行时内存的各个区域,对于程序计数器,虚拟机栈,本地方法栈这三个部分区域而言,其生命周期与相关线程有关,随线程而生,随线程而灭,并且这三个区域的内存…

Excel冻结窗格

1、冻结表格首行 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结首行”&#xff1b; 2.冻结表格首列 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结…

图扑智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑软件应用自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&a…

【轻松搞定】Edge 或 Google 无法上网问题

目录 前言 一、解决 Edge 无法上网的问题 1.1 键盘按下 WIN R 或 右键开始标志&#xff0c;启动运行 1.2 输入 regedit 进入注册表管理 1.3 打开到 \HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 位置下新建项 Edge 1.4 右键 Edge 新建 DWORD (32) 文件&#xff0c…

<FPGA>好的编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)

什么是组合逻辑环路&#xff1f; 组合逻辑环路&#xff08;Combinational Loops&#xff09;&#xff1a;指组合逻辑的输出信号不经过任何时序逻辑&#xff08;FF等&#xff09;&#xff0c;而是直接反馈到输入节点&#xff0c;从而构成的电路环路。 此外&#xff0c;如果直接将…

【开源分享】基于Html开发的房贷计算器,模仿新浪财经

房贷计算器是一种房贷计算的在线计算Web应用&#xff0c;按用户选择的贷款类型、贷款金额、期限、利率可计算得出每月月供参考、支付利息、还款总额这些信息。本文模仿新浪财经开发的房贷计算器。 作品预览 https://fangdai.gitapp.cn 源码地址 https://github.com/geeeeeee…

Qt5.12.12构建64位QMYSQL数据库驱动“driver not loaded”

在调用QSqlDatabase::open()时,会报错:“driver not loaded” 原因实际上是mysql 的驱动 qsqlmysql.dll 没有成功加载。 所以本篇文章将详细介绍一下:Qt5.12.12如何构建64位QMYSQL数据库驱动。 执行 写在最前,以下出现的文件路径为我自己电脑安装的路径,可根据自己的路…

vim快捷指令

普通模式—>插入模式 i:插入到当前光标的前面&#xff08;insert&#xff09; a:插入到光标的后面&#xff08;append&#xff09; o:插入到下一行 I:插入到行首 A:插入到行尾 O&#xff1a;插入到前一行 H:行首 L:页的最后一行的行首 W:光标跳到下一个单词词首 b:上一个单…

广州华锐互动:VR模拟高楼层建筑应急逃生,提供身临其境的虚拟体验

随着城市化进程的不断加速&#xff0c;高层建筑越来越多地出现在我们的生活中。然而&#xff0c;高层建筑的安全问题也日益凸显。一旦发生火灾、地震等突发事件&#xff0c;如何迅速、安全地逃离高楼成为了人们关注的焦点。近年来&#xff0c;虚拟现实&#xff08;VR&#xff0…

JUC并发编程——ForkJoin与异步回调

ForkJoin &#xff08;分支合并&#xff09; 什么是ForkJoin ForkJoin在JDK1.7出现 &#xff0c;并行执行任务&#xff0c;在大数据量下&#xff0c;能够提高效率 讯飞星火提供的说法&#xff1a; Forkjoin是一种并行计算的算法&#xff0c;用于将一个大任务分解为多个小任务…