MIT6.824/lecture-04-vmware-ft/4.3.md
2022-01-25 02:41:31 +00:00

65 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 4.3 VMware FT 工作原理
让我来介绍一下VMware FT是如何工作的。
首先VMware是一个虚拟机公司它们的业务主要是售卖虚拟机技术。虚拟机的意思是你买一台计算机通常只能在硬件上启动一个操作系统。但是如果在硬件上运行一个虚拟机监控器VMMVirtual Machine Monitor或者HypervisorHypervisor会在同一个硬件上模拟出多个虚拟的计算机。所以通过VMM可以在一个硬件上启动一到多个Linux虚机一到多个Windows虚机。
![](<../.gitbook/assets/image (262).png>)
这台计算机上的VMM可以运行一系列不同的操作系统其中每一个都有自己的操作系统内核和应用程序。
![](<../.gitbook/assets/image (265).png>)
这是VMware发家的技术这里的硬件和操作系统之间的抽象可以有很多很多的好处。首先是我们只需要购买一台计算机就可以在上面运行大量不同的操作系统我们可以在每个操作系统里面运行一个小的服务而不是购买大量的物理计算机每个物理计算机只运行一个服务。所以这是VMware的发家技术并且它有大量围绕这个技术构建的复杂系统。
VMware FT需要两个物理服务器。将Primary和Backup运行在一台服务器的两个虚拟机里面毫无意义因为容错本来就是为了能够抵御硬件故障。所以你至少需要两个物理服务器运行VMMPrimary虚机在其中一个物理服务器上Backup在另一个物理服务器上。在其中一个物理服务器上我们有一个虚拟机这个物理服务器或许运行了很多虚拟机但是我们只关心其中一个。这个虚拟机跑了某个操作系统和一种服务器应用程序或许是个数据库或许是MapReduce master或者其他的我们将之指定为Primary。在第二个物理服务器上运行了相同的VMM和一个相同的虚拟机作为Backup。它与Primary有着一样的操作系统。
![](<../.gitbook/assets/image (266).png>)
两个物理服务器上的VMM会为每个虚拟机分配一段内存这两段内存的镜像需要完全一致或者说我们的目标就是让Primary和Backup的内存镜像完全一致。所以现在我们有两个物理服务器它们每一个都运行了一个虚拟机每个虚拟机里面都有我们关心的服务的一个拷贝。我们假设有一个网络连接了这两个物理服务器。
![](<../.gitbook/assets/image (267).png>)
除此之外在这个局域网LANLocal Area Network还有一些客户端。实际上它们不必是客户端可以只是一些我们的多副本服务需要与之交互的其他计算机。其中一些客户端向我们的服务发送请求。在VMware FT里多副本服务没有使用本地盘而是使用了一些Disk Server远程盘。尽管从论文里很难发现这里可以将远程盘服务器也看做是一个外部收发数据包的源与客户端的区别不大。
![](<../.gitbook/assets/image (268).png>)
所以基本的工作流程是我们假设这两个副本或者说这两个虚拟机Primary和Backup互为副本。某些我们服务的客户端向Primary发送了一个请求这个请求以网络数据包的形式发出。
![](<../.gitbook/assets/image (269).png>)
这个网络数据包产生一个中断之后这个中断送到了VMM。VMM可以发现这是一个发给我们的多副本服务的一个输入所以这里VMM会做两件事情
* 在虚拟机的guest操作系统中模拟网络数据包到达的中断以将相应的数据送给应用程序的Primary副本。
* 除此之外因为这是一个多副本虚拟机的输入VMM会将网络数据包拷贝一份并通过网络送给Backup虚机所在的VMM。
![](<../.gitbook/assets/image (270).png>)
Backup虚机所在的VMM知道这是发送给Backup虚机的网络数据包它也会在Backup虚机中模拟网络数据包到达的中断以将数据发送给应用程序的Backup。所以现在Primary和Backup都有了这个网络数据包它们有了相同的输入再加上许多细节它们将会以相同的方式处理这个输入并保持同步。
当然虚机内的服务会回复客户端的请求。在Primary虚机里面服务会生成一个回复报文并通过VMM在虚机内模拟的虚拟网卡发出。之后VMM可以看到这个报文它会实际的将这个报文发送给客户端。
![说实话,这里画的挺乱的](<../.gitbook/assets/image (271).png>)
另一方面由于Backup虚机运行了相同顺序的指令它也会生成一个回复报文给客户端并将这个报文通过它的VMM模拟出来的虚拟网卡发出。但是它的VMM知道这是Backup虚机会丢弃这里的回复报文。所以这里Primary和Backup都看见了相同的输入但是只有Primary虚机实际生成了回复报文给客户端。
![](<../.gitbook/assets/image (272).png>)
这里有一个术语VMware FT论文中将Primary到Backup之间同步的数据流的通道称之为Log Channel。虽然都运行在一个网络上但是这些从Primary发往Backup的事件被称为Log Channel上的Log Event/Entry。
![](<../.gitbook/assets/image (273).png>)
当Primary因为故障停止运行时FTFault-Tolerance就开始工作了。从Backup的角度来说它将不再收到来自于Log Channel上的Log条目。实际中Backup每秒可以收到很多条Log其中一个来源就是来自于Primary的定时器中断。每个Primary的定时器中断都会生成一条Log条目并发送给Backup这些定时器中断每秒大概会有100次。所以如果Primary虚机还在运行Backup必然可以期望从Log Channel收到很多消息。如果Primary虚机停止运行了那么Backup的VMM就会说我都有1秒没有从Log Channel收到任何消息了Primary一定是挂了或者出什么问题了。当Backup不再从Primary收到消息VMware FT论文的描述是Backup虚机会上线Go Alive。这意味着Backup不会再等待来自于Primary的Log Channel的事件Backup的VMM会让Backup自由执行而不是受来自于Primary的事件驱动。Backup的VMM会在网络中做一些处理猜测是发GARP让后续的客户端请求发往Backup虚机而不是Primary虚机。同时Backup的VMM不再会丢弃Backup虚机的输出。当然它现在已经不再是Backup而是Primary。所以现在左边的虚机直接接收输入直接产生输出。到此为止Backup虚机接管了服务。
类似的一个场景虽然没那么有趣但是也需要能正确工作。如果Backup虚机停止运行Primary也需要用一个类似的流程来抛弃Backup停止向它发送事件并且表现的就像是一个单点的服务而不是一个多副本服务一样。所以只要有一个因为故障停止运行并且不再产生网络流量时Primary和Backup中的另一个都可以上线继续工作。
> 学生提问Backup怎么让其他客户端向自己发送请求
>
> Robert教授魔法。。。取决于是哪种网络技术。从论文中看一种可能是所有这些都运行在以太网上。每个以太网的物理计算机或者说网卡有一个48bit的唯一IDMAC地址。下面这些都是我Robert教授编的。每个虚拟机也有一个唯一的MAC地址当Backup虚机接手时它会宣称它有Primary的MAC地址并向外通告说我是那个MAC地址的主人。这样以太网上的其他人就会向它发送网络数据包。不过这只是我Robert教授的解读。
>
> 学生提问随机数生成器这种操作怎么在Primary和Backup做同步
>
> Robert教授VMware FT的设计者认为他们找到了所有类似的操作对于每一个操作Primary执行随机数生成或者某个时间点生成的中断依赖于执行时间点的中断。而Backup虚机不会执行这些操作Backup的VMM会探测这些指令拦截并且不执行它们。VMM会让Backup虚机等待来自Log Channel的有关这些指令的指示比如随机数生成器这样的指令之后VMM会将Primary生成的随机数发送给Backup。
>
> 论文有暗示说他们让Intel向处理器加了一些特性来支持这里的操作但是论文没有具体说是什么特性。