当前位置: 首页 > news >正文

【分布式】VMware FT概要

讨论了1primary + 1backup的情况,比较好理解, 6.824中以该论文为例,介绍了分布式系统中复制的概念,复制的方式。以下简要讲述一些关键点,来源于MIT6.824课程,翻译版本 https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/lecture-04-vmware-ft

文章目录

  • 一、两种复制方法
  • 二、工作原理
  • 三、非确定性事件
  • 四、Log格式猜测
  • 五、防止脑裂的第三方机构:test-and-set服务

一、两种复制方法

  • 状态转移
  • 复制状态机

区别在于,状态转移转移的是系统内部信息,而复制状态机则是传输外部事件。一条执行语句可能会改变很多(甚至全部)内部状态(比如涉及到数据库中schema的改变),如果每次都转移内部状态,那涉及到的太多了。而传输执行指令的操作粒度则比较小。

人们倾向于使用复制状态机的原因是,通常来说,外部操作或者事件比服务的状态要小。如果是一个数据库的话,它的状态可能是整个数据库,可能到达GB这个级别,而操作只是一些客户端发起的请求,例如读key27的数据。所以操作通常来说比较小,而状态通常比较大。所以复制状态机通常来说更吸引人一些。复制状态机的缺点是,它会更复杂一些,并且对于计算机的运行做了更多的假设。而状态转移就比较简单粗暴,我就是将我整个状态发送给你,你不需要再考虑别的东西。

二、工作原理

VMware FT的FT = Fault tolerance。 想要实现错误容忍,那么就需要replication(防止一台机器挂掉了导致的状态丢失)

VMware FT需要两个服务器(在两台物理机上有两台虚拟机):primary和backup,VMM为每个虚拟机分配一段内存,它们的内存镜像需要完全一致。
客户端向primary发送指令, 然后primary会向backup也发送同样指令。primary和backup都会执行指令,生成response,但是只有primary会回复客户端,而backup会把response丢弃。VMware FT论文中将Primary到Backup之间同步的数据流的通道称之为Log Channel 。

正常来说是primary接收指令,然后通过log channel 将其传给backup。 如果backup在一个规定时间内无法收到primary的指令,可以认为是primary挂了/有问题了,此时Backup不会再等待来自于Primary的Log Channel的事件, backup此时不受primary事件驱动,同时告知客户端,后续的请求发往backup而不是primary, backup生成的response此时也不会直接丢弃,它成为了新的primary。

三、非确定性事件

可以理解为同一事件在不同机器上结果不同的事件。也是复制状态机方式需要考虑的特殊情况。

  1. 客户端输入
    在分布式系统中,这里的系统输入指的是网络数据包。一个网络数据包包括两个部分,一个是数据包中的数据,另一个是提示数据包到达的中断。
    中断在哪个位置触发,对于primary和backup来说需要一致,否则状态就会偏差。

  2. “怪异”指令:这些指令在不同机器上的执行结果不同
    比如随机数生成, 获取当前时间的指令,获得计算机唯一id指令

  3. 多CPU并发
    当服务运行在多CPU上时,指令在不同的CPU上会交织在一起运行,因此指令运行的顺序不可预期

假设两个核同时向同一份数据请求锁: 在primary上,CPU core1得到锁; 在backup上,由于细微的时间差别,CPU core2获得了锁,那么执行结果可能很不一样。

四、Log格式猜测

Robert教授猜测log (log channel 中传递的信息)中有三样东西:

  • 事件编号
  • 日志条目类型(普通的网络数据 or 怪异指令)
  • 数据(网络数据包内容,也就是普通指令的内容 or 怪异指令执行结果)

五、防止脑裂的第三方机构:test-and-set服务

网络分区导致脑裂问题的解决:需要有一个第三方的权威机构,决定primary还是backup允许上线,这就是test-and-set服务。

这个就像锁一样,该服务在内存中保留一些标志位,primary和backup需要向这个服务发送test-and-set请求。

当第一个请求送达时,Test-and-Set服务会说,这个标志位之前是0,现在是1。第二个请求送达时,Test-and-Set服务会说,标志位已经是1了,你不允许成为Primary。对于这个Test-and-Set服务,我们可以认为运行在单台服务器。当网络出现故障,并且两个副本都认为对方已经挂了时,Test-and-Set服务就是一个仲裁官,决定了两个副本中哪一个应该上线。

节点成为primary必须向这个第三方机构进行请求,得到许可(得到0)。
也就是test and set当前如果是0,那么该节点可以成为primary,成为primary后,将标志位设置为1; 如果当前标志位1,就不能再成为primary了。 本质上来说,这是一种简化了的锁服务,哪台机器拿到“锁”,哪台机器才能成为primary。

http://www.lryc.cn/news/139155.html

相关文章:

  • 江西南昌电气机械三维测量仪机械零件3d扫描-CASAIM中科广电
  • MySQL三大日志(binlog、redo log和undo log)详解
  • 七大排序算法详解
  • [docker][WARNING]: Empty continuation line found in:
  • 探工业互联网的下一站!腾讯云助力智造升级
  • SpringBoot上传文件的实现与优化
  • 学习python可以做什么?有前景么
  • 还不知道怎么提示LLM?ChatGPT提示入门
  • 反射机制-体会反射的动态性案例(尚硅谷Java学习笔记)
  • uniapp离线打包apk - Android Studio
  • cuda面试准备(一),架构调试
  • docker containers logs清理
  • Ubuntu安装RabbitMQ
  • Vue3获取当前环境信息
  • Linux 系统 diff 文件比较命令详解
  • 【负载均衡】Nacos简单入门
  • 实验一 ubuntu 网络环境配置
  • ubuntu can应用开发环境搭建指南
  • 全流程R语言Meta分析核心技术高阶应用
  • windows下安装使用git-lfs克隆大文件
  • Node.js下载安装及环境配置教程
  • 半导体低压热氧工艺中的真空度精密控制解决方案
  • TCP的可靠性之道:确认重传和流量控制
  • 基于spring boot校园疫情信息管理系统/疫情管理系统
  • 使用Python批量将飞书文档转为MD
  • Nacos配置管理、Feign远程调用、Gateway服务网关
  • 解决Spring Boot前后端分离开发模式中的跨域问题
  • 常见前端面试之VUE面试题汇总五
  • 带着问题看SpringBoot
  • 【Go 基础篇】Go语言匿名函数详解:灵活的函数表达式与闭包