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 和用于开发节点使用的内存模拟。
-
最开始时每个节点都调用
IMembershipTable
将自己的信息(ip:port:epoch
)写入到数据库中。epoch其实就是节点启动时间,因此ip:port:epoch
是全局唯一的。 -
节点间通过心跳来互相监控,心跳和业务消息走的是同一条TCP连接,所以心跳成功与否与服务器的实际运行状况相关。节点间监控并不是all-to-all的,而是从一致性HASH环上选择X个后继节点进行检测。比如,如果有10个节点,X=3,那么节点S就会在Hash环上选取S节点后面的三个节点进行检测。
-
如果节点S监控了P,且多次(N)未收到P的回复。则它会将带时间戳的怀疑信息(可理解为投票)写入
IMembershipTable
中。 -
如果K秒内有超过Z个节点怀疑P是故障的,则S会将P标记为故障,并写入
IMembershipTable
,并广播所有节点要求所有节点重新读取成员列表(每个节点本身也会定时读取的)。 -
更详细地来讲:
- 当S怀疑P时,它会写入"S在时间T1怀疑P"
- 仅有S怀疑P是没用的,需要在时间窗口T(通常为3分钟)内有Z个不同节点怀疑,才能宣布P的死亡
- 如果S是最后一个怀疑者(即在T时间内已经有Z-1个节点怀疑P),则S决定宣布P死亡,在这种情况下,S会将P死亡的信息写入
IMembershipTable
。- 注意此处是有并发控制的,同时只有一个节点会写入成功,多个节点并发写可能会导致某些写失败,写入失败时会重试直到成功。
- 每个节点也会定时读取成员列表进行更新,这样节点可以尽快地了解其他节点的加入或退出事件。
- Orleans的默认配置 心跳周期:10s、T:3分钟,Z:2,X:3,N:3。即:每个节点监控3个后继节点,也被3个前继节点监控。S每10秒发送一次心跳给P,连续3次未收到回复则怀疑P故障,当3分钟内有2个节点都怀疑P故障时,认为P真的故障了。
- 主动退出机制:如果某个节点与其他节点失去了通信,该节点进程本身还在运行,此节点还是会被其他节点认为故障的。当本节点发现自己被其他节点认为故障时,会主动退出。所以这也需要另外的机制来保障进程退出后被重新拉起,比如k8s、自行实现的看门狗等。
算法的特点
-
可以处理任意数量的失败
传统的比如基于Paxos的算法,故障节点不能超过一半。 而本算法没有此限制,微软官方文档说他们在生产环境上看到过一半以上的节点出现故障时,此系统仍然正常运行。
-
准确性和完整性可调节,可以通过调节参数来在两者之间进行取舍
-
规模
本算法可以处理上千、甚至上万台服务器。这与传统的基于 Paxos 的解决方案形成鲜明对比,例如组通信协议,众所周知,组通信协议的规模不能超过数十个。
-
诊断
诊断也非常的方便,因为算法的中间过程都写在
IMembershipTable
中,可以方便地看到故障检测情况。 -
为什么需要可靠的持久存储来实现
IMembershipTable
我们为 IMembershipTable 使用持久存储(Azure 表、SQL Server、AWS DynamoDB、Apache ZooKeeper 或 Consul IO KV)有两个目的。首先,它被用作节点相互寻找以及客户端寻找节点的集合点。其次,将成员资格视图存储在可靠的存储中,并使用该存储提供的并发控制机制来就谁还活着、谁已经死了达成一致。这样,从某种意义上说,我们的协议将分布式共识的难题外包给了存储服务。
-
如果存储无法访问时会如何
存储服务关闭、不可用或存在通信问题时——在这种情况下,我们的协议不会错误地宣布节点已死亡。已经存在的节点会继续运行。但是,我们将无法声明某个节点已故障(就算检测到某些节点已故障,也无法将此事实写入表中),并且也无法允许新的节点加入。因此,完整性会受到影响,但准确性不会。此外,在出现部分网络分区的情况下(例如某些节点可以访问表,而有些则不能),我们可能会将死筒仓声明为已死,但需要一些时间才能让所有其他筒仓了解它。因此检测可能会延迟,但我们绝不会因为表不可用而误杀某个节点。
-
各个节点还会定时(例如5分钟一次)将“我还活着”的信息写入表中,这个仅用于调试排查问题时使用,对算法本身没啥作用。
配置:
默认配置如下:
<Liveness ProbeTimeout="5s"TableRefreshTimeout="10s"DeathVoteExpirationTimeout="80s"NumMissedProbesLimit="3"NumProbedSilos="3"NumVotesForDeathDeclaration="2" />
这个默认值是根据Azure多年生产使用情况确定的,微软相信它们代表了良好的默认设置。一般来说没必要改变他们。
设计原理
人们可能会问的一个自然问题是,为什么不完全依赖 Apache ZooKeeper 来实现集群成员身份,为什么我们要费心实施我们的会员协议?主要有以下三个原因:
-
在云中部署/托管
Zookeeper 不是托管服务(至少在 2015 年 7 月撰写本文时,而且当我们在 2011 年夏天首次实现此协议时,任何主要云提供商都没有作为托管服务运行的 Zookeeper 版本)。这意味着在云环境中 Orleans 客户必须部署/运行/管理他们的 ZK 集群实例。这只是另一个不必要的负担,我们不想强加给我们的客户。通过使用 Azure Table,我们依赖于托管、托管服务,这使我们客户的生活变得更加简单。基本上,在云中,将云用作平台,而不是基础设施。另一方面,当在本地运行并管理服务器时,依赖 ZK 作为 IMembershipTable 的实现是一个可行的选择。 -
直接故障检测
使用ZK时,ZK会对Orleans节点进行健康检测,但是这并不能说明Orleans节点之间实际的通信状态。比如ZK和Orleans节点网络故障了,但实际上Orleans节点还是能正常提供服务的,此时ZK仍然会认为Orleans节点故障。而本文提出的算法中,即使Orleans各节点与存储服务之间通信故障,依然可以继续提供服务。 -
便携性和灵活性
作为 Orleans 理念的一部分,我们不想强迫对任何特定技术的强烈依赖,而是拥有灵活的设计,可以轻松地在不同的实现中切换不同的组件。这正是 IMembershipTable 抽象所服务的目的。
参考资料
[1] Orleans官方文档
相关文章:

Orleans的成员管理和故障检测故障检测
Orleans的成员管理和故障检测故障检测 简介 Orleans框架是一个基于.NET平台的开源分布式系统框架,用于开发可扩展,高可用,高性能的云服务应用程序。它采用了Actor模型,将分布式系统中的各个节点抽象成为Actor,使得开…...

分类选择,最多五级
效果图,这种竖向的分类选择,每一列可以用不同的背景颜色 组件代码 <template><view class"toolTypeBox" :style"max-height:${maxHeight}"><block v-for"(item,index) in datalist"><block v-if&…...

ASP.NET framework升级core .NET 6.0
C# ASP.NET framework 升级core .NET 6.0 .NET 7.0 .NET 8.0 或者以上 .net framework、.net standard、.net core .net 5/6/7/8 区别_.net 6.0和.net framework的区别-CSDN博客 using System.Web.Http; using HttpPostAttribute Microsoft.AspNetCore.Mvc.HttpPostA…...

BootStrap-前端框架
资料:https://v3.bootcss.com/components/ BootStrap的概念(Web框架) Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。…...

解读 | 自动驾驶系统中的多视点三维目标检测网络
原创 | 文 BFT机器人 01 背景 多视角三维物体检测网络,用于实现自动驾驶场景高精度三维目标检测,该网络使用激光雷达点云和RGB图像进行感知融合,以预测定向的三维边界框,相比于现有技术,取得了显著的精度提升。同时现…...

C++ 用户学习 Python 的最佳方法
对于很多是一名计算机科学专业的学生而言,很多入门是学习的C和 C,可能熟悉非常基本的 python 语法,以及 C 中相当高级的数据结构。现在想深入学习Python的话,光看很多在线教程可能没法有较大的提升,这里有一些针对C用户…...
使用docker搭建drogon windows10,linux,mac下开发环境
2023年10月13日14:52:26 本机环境 Windows 10 专业版 22H2 操作内核19045.2965 如果直接在windows,linux,mac上直接搭建环境确实有一点难度,之前drogon官方并未提供官方镜像,现在有了docker镜像确实方便了,其实我是最…...

【RKNN】YOLO V5中pytorch2onnx,pytorch和onnx模型输出不一致,精度降低
在yolo v5训练的模型,转onnx,再转rknn后,测试发现: rknn模型,量化与非量化,相较于pytorch模型,测试精度都有降低onnx模型,相较于pytorch模型,测试精度也有降低ÿ…...

六分科技CEO李阳:精准定位助力汽车智能化普及
10月10日,2023四维图新用户大会在上海成功举办。大会现场,六分科技展示了基于PPP-RTK技术的“星璨”产品和软硬件一体化解决方案。同时在智能驾驶主题论坛上,六分科技CEO李阳受邀发表了以《精准定位助力汽车智能化普及》为主题的演讲。 高精度…...

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(六):衰减和dB
线路中的损耗对信号的主要影响是当信号沿线路长度传播时幅度减小。如果将幅度为 V 的正弦波电压信号引入传输线,则其幅度将随着传输线向下移动而下降。图 9-16 显示了如果我们可以冻结时间并观察直线上存在的正弦波,则正弦波在不同位置可能会是什么样子。…...

吃鸡达人必备:分享顶级干货+作图工具推荐+账号安全查询!
吃鸡达人们,你们好!今天我来给大家介绍一些炙手可热的吃鸡话题,以及一些让你实力飙升的独家干货! 首先,让我们说一下如何提高自己的游戏战斗力。作为一名专业吃鸡行家,我将与你们分享一些顶级游戏作战干货&…...

帆软报表解决单元格不显示问题
前言 使用帆软报表设计器制作普通报表时、设计器界面经常有一根垂直的 “虚线”。一旦单元格超过这条 “虚线” ,那么真正打开报表就看不到这些列了。以下提供了简单的修正方法、欢迎大家讨论交流。 操作环境 设计器是帆软报表 9.0,操作系统是 Window…...

LeetCode讲解篇之138. 随机链表的复制
LeetCode讲解篇之138. 随机链表的复制 文章目录 LeetCode讲解篇之138. 随机链表的复制题目描述题解思路题解代码 题目描述 题解思路 先遍历一遍链表,用哈希表保存原始节点和克隆节点的映射关系,先只克隆节点的Val,然后再次遍历链表ÿ…...
主定理(简化版)
主定理(Master Theorem)是用于分析递归算法时间复杂度的一个重要工具。它适用于形式化定义的一类递归关系,通常采用分治策略解决问题的情况。 假设我们有一个递归算法,它将问题分解成 a a a 个子问题,每个子问题的规模…...
HTTP1.0和HTTP2.0的区别
相同点:所有的HTTP请求都要基于TCP连接。 HTTP1.0:每次发送请求时建立一个TCP连接,得到响应后,释放TCP连接。 HTP1.1:**相比于1.0,引入了Keep live,客户端得到响应后,不会立刻释放T…...

ARM资源记录《AI嵌入式系统:算法优化与实现》第八章(暂时用不到)
1.CMSIS的代码 书里给的5,https://github.com/ARM-software/CMSIS_5 现在有6了,https://github.com/ARM-software/CMSIS_6 这是官网的书,介绍cmsis函数的https://arm-software.github.io/CMSIS_5/Core/html/index.html 2.CMSIS介绍 Cort…...

微信小程序2
一,视图层 1.什么视图层 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。 将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。 WXML(WeiXin Markup language) 用于描述页面的结构。 WXS(WeiXin Script) 是小程序的一套脚本语…...

G.711语音编解码器详解
语音编解码利用人听觉上的冗余对语音信息进行压缩从而达到节省带宽的目的。值得注意的是,本文说的是语音编解码器,也就Speech codec,而常用的还有另一种编解码器称作音频编解码器,英文是Audio codec,它们的区别如下。 以前在学校的时候研究了很多VoIP的编解码器从G.723到A…...

蓝桥杯每日一题2023.10.17
迷宫 - 蓝桥云课 (lanqiao.cn) 题目描述 样例: 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 0100000000101010001101000010100000101010101100…...

16.SpringBoot前后端分离项目之简要配置一
SpringBoot前后端分离项目之简要配置一 前面对后端所需操作及前端页面进行了了解及操作,这一节开始前后端分离之简要配置 为什么要前后端分离 为了更低成本、更高效率的开发模式。 前端有一个独立的服务器。 后端有一个独立的服务器。两个服务器之间实时数据交换…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...