【分布式】VMware FT概要

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

一、两种复制方法

  • 状态转移
  • 复制状态机

区别在于,状态转移转移的是系统内部信息,而复制状态机则是传输外部事件。一条执行语句可能会改变很多(甚至全部)内部状态(比如涉及到数据库中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。

猜你喜欢

转载自blog.csdn.net/qq_39679772/article/details/132484352
今日推荐