本文是Fault-Tolerant VM论文的阅读笔记。本文实现了一个容错虚拟机,在另一个服务器上备份主虚拟机的运行。能够有两种实现思路:服务器
VMware已经在vSphere中实现了本文的虚拟机备份机制,可以在主虚拟机发生故障以后无缝启用备份虚拟机。目前这个技术只支持单核处理器,由于多核处理器指令访存也是不肯定的事件。固然,本文实现的备份机制奏效的前提是故障在被外部发现以前都能被检测到。网络
一个容错的配置以下图所示,对于一台虚拟机(主虚拟机)而言,咱们在其余物理服务器上运行一台备份虚拟机,两台主机处于虚拟锁步状态。它们会链接到同一个共享磁盘。其中,全部的输入(包括网络、鼠标、键盘等等)只会交给主虚拟机,而后经过日志信道发送给备份虚拟机。异步
复制虚拟机的运行主要面临三个挑战:性能
不过,VMware vSphere已经提供了VMware肯定回放[2]功能。优化
输出要求:若是备份虚拟机在故障以后替代了主虚拟机,备份虚拟机运行期间要保证外界获得的输出是彻底一致的。
复制代码
只有知足了输出要求,外界才不会观测到故障的发生,而这个要求须要延迟外部输出直到备份虚拟机收到足够的信息来重放输出操做。一个必要的条件就是备份虚拟机须要收到输出操做以前的全部日志。备份虚拟机不能在输出操做以前上线,由于可能主虚拟机中会存在不肯定事件取消了后续的输出。spa
输出规则:主虚拟机不会将输出发送给外界,直到收到了来自备份虚拟机收到产生输出的操做的日志的确认。
复制代码
容错协议以下图所示,异步事件、输入和输出操做发送给了备份虚拟机,主虚拟机只有在备份虚拟机确认收到输出操做后输出。操作系统
不过协议没法保证重复输出,由于备份虚拟机无从知晓主虚拟机在输出以前仍是以后崩溃,另外故障发生时发送给主虚拟机的包也会丢失。不过好在,网络基础设施、操做系统、应用程序一般都能处理丢包或者重复的状况。设计
在备份虚拟机取代主虚拟机以前,须要应用所有的日志。主虚拟机和备份虚拟机主要经过心跳包和日志通讯来判断对方是否故障。为了解决脑裂问题,两个虚拟机须要经过共享磁盘上得知对方是否故障。若是主虚拟机故障,那么备份虚拟机取代主虚拟机,并建立一个新的备份虚拟机;若是备份虚拟机故障,那么建立一个新的备份虚拟机。3d
在启动主虚拟机或者备份虚拟机故障后,须要建立一个和主虚拟机相同状态的备份虚拟机,而且不能打断主虚拟机的运行。具体经过VMware VMotion实现,VMotion将虚拟机复制到另一个物理服务器上,将源虚拟机做为主虚拟机,将目标虚拟机做为备份虚拟机。日志
备份虚拟机一般位于集群中另一台服务器上,由vSphere调度选择放置的服务器,这些服务器可以访问共享的磁盘。
日志信道能够经过一个大的缓冲来实现,必要的时间能够控制主虚拟机的运行速度来保证备份虚拟机可以遇上。
虚拟机会有各类各样的控制操做,例如关机、修改资源分配,这些其实均可以经过特殊的控制操做日志来实现。
容错机制给VMotion带来了挑战,VMotion用来无缝迁移虚拟机,要求在切换的时候挂起全部磁盘I/O。主虚拟机能够挂起磁盘I/O,可是备份虚拟机重复主虚拟机的,须要经过日志信道请求主虚拟机挂起磁盘I/O。
实现磁盘I/O会面临如下问题
vSphere实现了一些网络方面的优化,例如直接从网络缓冲区取走数据,而不经过陷阱,可是这将带来不肯定,所以须要禁用这个优化。另外也作了如下优化:
主虚拟机和备份虚拟机其实能够采用独立的磁盘,磁盘是内部存储,因此不须要知足输出要求,可是两个磁盘须要在启动容错之初进行同步。不过,这是脑裂问题就不能经过磁盘解决了,须要经过第三方协调服务器。
备份虚拟机也能够考虑直接从磁盘读取数据而不须要经过日志信道。可是这会致使备份虚拟机变慢,由于须要等待磁盘读取操做,而且须要处理读取故障,以及推迟写入操做保证以前的读取操做被备份服务器成功执行。