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

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.rhkb.cn/news/161503.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯每日一题2023.10.17

迷宫 - 蓝桥云课 (lanqiao.cn) 题目描述 样例&#xff1a; 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 0100000000101010001101000010100000101010101100…

nginx正反向代理,负载均衡

Nginx 正向代理&#xff0c;反向代理 &#xff0c;负载均衡 Nginx有两种代理协议 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;tcp/udp流量转发&#xff09; 四层代理七层代理概念 四层代理 四层代理&#xff1a;基于tcp/ip协议层的转发代理方式&#…

LabVIEW建立生产者消费者

LabVIEW建立生产者消费者 生产者/消费者设计模式由并行循环组成&#xff0c;这些循环分为两类&#xff1a;生产者循环和消费者循环。生产者循环和消费者循环间的通信可以使用队列或通道连线来实现。 队列 LabVIEW内置的队列操作VI可在函数选板>>数据通信>>队列操…

python每日一练(9)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

小程序框架

目录 一.什么是小程序框架 二.视图层 先建立四个包 数据绑定 条件渲染 ​编辑 使用模板 事件系统 所有a.js 输出结果 ​编辑 三.跳转 a页面跳b页面 ​编辑 a页面跳c页面 测试结果 四.生命周期 一级跳一级 一级跳二级 二级跳二级 页面隔代跳转 一.什么是小程…

Flink 的集群资源管理

集群资源管理 一、ResourceManager 概述 1、ResourceManager 作为统一的集群资源管理器&#xff0c;用于管理整个集群的计算资源&#xff0c;包括 CPU资源、内存资源等。 2、ResourceManager 负责向集群资源管理器申请容器资源启动TaskManager实例&#xff0c;并对TaskManag…

安装Elasticsearch步骤(包含遇到的问题及解决方案)

注&#xff1a;笔者是在centos云服务器环境下安装的Elasticsearch 目录 1.安装前准备 2.下载Elasticsearch 3.启动Elasticsearch 非常容易出问题 第一次运行时&#xff0c;可能出现如下错误&#xff1a; 一、内存不足原因启动失败 二、使用root用户启动问题 三、启动ES自…

Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!

先上效果图 插件安装 先说 word 文件是docx-preview插件 excel文件是用 xlsx 插件 介绍后端返回的数据 因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含: url : blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示…

Educational Codeforces Round 156 (Rated for Div. 2)

C. Decreasing String 分析&#xff1a;暴力做法是很容易想到的&#xff0c;但时间复杂度为O(n2) 这是我打cf以来看到的最好的题解。 #include<cstdio> #include<set> #include<list> #include<queue> #include<math.h> #include<stdlib.h&g…

力扣刷题 day47:10-17

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

人工智能时代大模型算法之文心大模型4.0

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

NSS [BJDCTF 2020]easy_md5

NSS [BJDCTF 2020]easy_md5 先看题目&#xff0c;给了一个输入框 翻阅了源码没发现什么可疑点 扫一下试试&#xff0c;也没东西 抓个包试试&#xff0c;在响应头发现了hint 那就是奇妙的md5了&#xff0c;输入ffifdyop 原理&#xff1a; ffifdyop的MD5加密结果是276f722736c…

索引背后的数据结构——B+树

为什么要使用B树&#xff1f; 可以进行数据查询的数据结构有二叉搜索树、哈希表等。对于前者来说&#xff0c;树的高度越高&#xff0c;进行查询比较的时候访问磁盘的次数就越多。而后者只有在数据等于key值的时候才能进行查询&#xff0c;不能进行模糊匹配。所以出现了B树来解…

JVM垃圾回收算法介绍

堆的分代和区域 &#xff08;年轻代&#xff09;Young Generation&#xff08;eden、s0、s1 space&#xff09; Minor GC &#xff08;老年代&#xff09;Old Generation &#xff08;Tenured space&#xff09; Major GC|| Full GC &#xff08;永久代&#xff09;Permanent…

B2R Raven: 2靶机渗透

B2R Raven: 2靶机渗透 视频参考&#xff1a;ajest &#xff1a;https://www.zhihu.com/zvideo/1547357583714775040?utm_id0 原文参考&#xff1a;ajest &#xff1a;https://zhuanlan.zhihu.com/p/270343652 文章目录 B2R Raven: 2靶机渗透1 启动靶机&#xff0c;查看后网卡…

Kotlin笔记(三):扩展函数,运算符重载

1. 扩展函数 扩展函数表示即使在不修改某个类的源码的情况下&#xff0c;仍然可以打开这个类&#xff0c;向该类添加新的函数。 在Java中,如果我们需要统计字符串中的字母的数量的话,我们通常需要建立一个工具类,然后在工具类里面创建一个新的方法来实现该功能. 在Kotlin中,由于…

【mysql】关于mysql的数据结构特点 索引特点

文章目录 二叉树红黑树 b treehash结构b tree索引存放特点myisamInnoDB 最左原则主键相关知识点缓存池淘汰机制 前言&#xff1a;翻自己博客 发现缺少mysql数据结构和索引相关内容 两年前整理的mysql知识点 一直存在于博主的笔记本里面 &#xff08;是的 纸质的那种笔记本 不是…

JVM八股文

1.JVM的内存结构&#xff1f; 2.OOM是什么&#xff0c;怎么排查&#xff1f; 3.请解释四种引用是什么意思有什么区别&#xff1f; 4.GC的回收算法有哪些&#xff1f; 5.怎么判断对象是否存活&#xff1f; 1.什么是JVM内存结构 jvm将虚拟机分为5大区域&#xff0c;程序计数器、…

中国移动集采120万部,助推国产5G赶超iPhone15

近期媒体纷纷传出消息指中国移动将大规模集采&#xff0c;预计将采购国产5G手机120万台&#xff0c;加上另外两家运营商的集采数量&#xff0c;估计集采数量可能达到300万部&#xff0c;如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市&#xff0c;获益…

PostgreSQL性能调优:优化查询和索引设计

随着数据量的增长和业务需求的变化&#xff0c;数据库性能成为了许多企业关注的焦点之一。在众多的数据库管理系统中&#xff0c;PostgreSQL因其稳定性和可靠性而备受青睐。然而&#xff0c;即使是最强大的系统也需要合适的调优&#xff0c;以确保其能够高效地处理大规模数据和…