复制(Replication)
复制能处理单台计算机的fail-stop故障,即单纯的“停止运行”故障。但不能修复软件bug和硬件漏洞。
复制还要求副本中的错误是相互独立的。例如,若副本所在计算机有相同的硬件缺陷,则不能保证复制能有效容错。或者副本所在计算机位于同一个建筑中,自然灾害可能使所有副本断电下线。
复制还将带来额外的经济、性能、复杂性开销。
状态转移和复制状态机
状态转移和复制状态机是复制的两种实现方式。以下称主状态机为Primary,备份状态机为Backup。
- 状态转移:Primary定时将自身状态的完整拷贝发送给Backup,令Backup同步状态。为提高效率,有只发送状态变更内容等变种。
- 复制状态机:在没有外部输入的情况下,计算机的内部操作应该是确定的。因此,两台计算机从相同的状态开始,以相同的顺序,在相同的时间,接收相同的输入,那么二者应该一直互为副本、保持一致。复制状态机就是将外部输入从Primary传输到Backup,尝试通过确保输入相同来同步计算机。
一般来说,外部输入比计算机状态要小,更适合频繁传输,所以人们倾向于使用复制状态机。但复制状态机实现更复杂。
在多核CPU上,相同的输入也可能产生不同的结果,则必须引入状态转移提高健壮性。
VMware FT的独特之处在于它复制底层的寄存器和内存,而不是像大多数分布式实现进行应用程序级的复制,所以任何应用程序都可以直接运行在VMWare FT的复制方案上。也就是牺牲了部分性能换取通用性。
工作原理
VMware FT运行在两个物理服务器上,包括一个Primary和一个Backup,共两个虚拟机。每台计算机上的所有虚拟机由各自运行的虚拟机监控器VMM(Virtual Machine Monitor)管理。虚拟机通过局域网连接,并拥有相同的内存镜像。局域网中还存在一些共享硬盘服务器和一些与虚拟机交互的客户端。
称Primary与Backup间的数据流通道为Log Channel,Primary发往Backup的事件称为Log Event。
正常情况下,客户端总是向Primary发送请求。Primary所在VMM将数据包发给Primary,并拷贝一份发给Backup所在VMM。二者都将产生回复报文,但Backup的回复被VMM自动丢弃。
当Primary因故障停止运行时,FT(Fault-Tolerance)开始工作。Backup发现Primary停止发送Log Event后,将成为新的Primary,VMM允许其开始自由执行并产生输出。若Backup停止工作,Primary也将抛弃Backup。
处理非确定性事件
- 客户端输入:VMWare FT中的客户端输入均为网络数据包。接收到网络数据包时,网卡的DMA把网络数据包内容拷贝到内存并触发中断。我们希望Primary和Backup在相同的时间、相同的位置触发中断。
- 随机数生成器、获取当前时间、获取计算机唯一ID等指令,称它们为“怪异指令”。
- CPU多核并发时,指令的执行顺序无法预测,不纳入VMWare FT的讨论。
LogEvent应包含指令序号、指令类型和网络数据包内容,以及“怪异指令”执行结果
虚拟机操作系统需要一个定时器,每秒触发若干次中断,从而允许操作系统对中断次数计数来跟踪时间。进而Primary能够通过发送指令序号来指定Backup执行中断的时间,使二者在逻辑上同步执行中断。此处显然需要CPU的特殊定制设计。
当Backup的LogEvent缓冲区为空时是不允许执行任何指令的,这确保了Backup的CPU时间不会领先Primary,而是至少落后一个LogEvent。
控制输出
为了确保Primary和Backup的一致性,VMWare使用控制输出机制。在Backup确认收到了相应的LogEvent前,不允许Primary产生任何输出。
这避免了客户端的请求得到正确回复,但Primary在将该LogEvent发送到Backup前故障,Backup成为新的Primary后客户端观测到的状态不一致的问题。仅当Backup向Primary发送ACC,确保Backup也接收LogEvent后,Primary才会向客户端产生输出。
这个设计强制Primary等待Backup确认接收到LogEvent,显著限制了系统性能。
重复输出
若Primary将回复报文发往客户端后故障,此时回复对应的请求还在Backup处理缓存区中,Backup接管服务后又将发送一条相同的回复。
由于两次回复产生完全相同的报文,理论上客户端会根据TCP协议丢弃其中一条,意外解决了这个问题。或许也可以通过应用级的请求序列号处理这个问题。
Test-and-Set 服务
Primary与Backup间通信中断,但二者实际都能与部分客户端通信时,二者都会尝试成为唯一的Primary,造成脑裂。
所以在Primary和Backup发现另一方下线时,都要通过网络访问一个公共标志位,确认对方是否故障,并根据情况选择是否成为Primary。




脑裂这个词好形象诶(
听起来很可怕⌇●﹏●⌇
🫡