云计算技术解析 Amazon EC2 的幕后

今天新闻里报导说,VMWare 拆资 10 亿 5 千万美元,收购 Nicira [0]。Nicira 是一家创业公司,专注于网络虚拟化,主打产品是 vSwitch。云计算产业是技术密集型产业,涉及的技术众多。要了解云计算产业格局,就必须了解各家企业主打产品,所提供的核心价值。从而理解各家企业,在整个云计算产业链中所处的位置,以及与上下游企业的相互关系。

这个文章系列的后续章节,将详细讨论网络虚拟化的问题。Nicira 公司在网络虚拟化方面,引领全球技术前沿。看来我们这个文章系列的写作进度,得提提速了。

我们在上一节,讨论了四种云计算的服务方式,出租裸机、出租虚拟机、出租网站、出租行业服务。Amazon EC2 提供的云计算服务,就是其中第二种方式,出租虚拟机。

OpenStack 被视作是 Amazon EC2 的开源版。OpenStack 自称是“用来搭建云计算平台的开源软件”。如果追问一句,用 OpenStack 搭建好了云计算平台以后,能提供什么服务?答案是,如同 Amazon EC2 一样,提供虚拟机租赁服务。

VMWare 公司的产品,虽然名目繁多,但是也是围绕搭建云计算平台,提供虚拟机租赁服务这个总目标。

所谓提供虚拟机租赁服务,更明确的解释方式是,用户提交什么输入,云计算系统返回什么输出。

输入:用户在任何电脑的浏览器上,通过访问云计算中心的网页,先注册,确定登录姓名和密码。然后输入希望租赁的虚拟机的操作系统及其版本,还有虚拟机的 CPU 的内核个数、内存空间、硬盘空间、实时带宽、以及流量限额。

输出:云计算中心根据用户的需求,生成相应配置的虚拟机,然后把虚拟机的域名或 IP 地址,返回给用户。用户得到这些信息后,可以通过 SSH、远程桌面或者 VNC [1] 这样的远程访问(Remote Access)工具,远程登录并使用运行在云计算中心的虚拟机。

Amazon EC2、OpenStack 和 VMWare 是如何实现这个功能的呢?别着急看答案,先想想,假如我们是 Amazon EC2、OpenStack 和 VMWare 的系统设计师,我们该如何设计后台系统?

我们自己先 DIY (Do It Yourself),然后把我们自己的设计,与 Amazon EC2、OpenStack 和 VMWare 的系统架构,做横向对比,就容易领悟 Amazon EC2、OpenStack 和 VMWare 的系统设计的高妙之处。

当然,任何系统的设计,都会有不足之处。分析缺陷的一个有效方法,也是横向对比。

我们在自行设计 Amazon EC2 那样的系统之前,先想想,假如没有全自动的后台系统,而是靠人工完成,该怎么做?换句话说,当云计算中心的系统管理员,收到用户提交的请求时,他该执行哪些操作?

在云计算中心开始为用户提供服务之前,系统管理员需要预先做一些准备工作。当云计算中心购置了服务器裸机以后,系统管理员需要给这些裸机,安装虚拟化系统。

安装虚拟化系统包括以下三步。

1. 选择虚拟化系统。

虚拟化系统是一个软件系统,目前常用的虚拟化系统有三种,VMWare、Xen、和 KVM。各种虚拟化系统的比较,可参考 [2]。

其中 KVM 是开源软件,不仅操作简单,而且系统运行效率较高。更难得的是,KVM 系统结构十分精巧、代码量小。

2. 安装虚拟化系统。

以 KVM 为例,在裸机上安装 KVM,只需要做两步。1. 安装 Linux OS,2. 在 Linux 上安装 KVM,参考安装手册 [3]。

3. 设置网络。

运行在 KVM 之上的虚拟机实例,与外界网络的数据传输,必须经过物理网卡。所以,需要做相应的系统设置,使虚拟机实例与物理网卡通信。设置网络的操作步骤并不复杂,也参见安装手册[3]。

这里有个疑问,为什么在第二步“安装虚拟化系统”的时候,不一步到位,把网络也设置好?其实,的确是可以两步并一步,在“安装虚拟化系统”时,顺带完成网络的设置。

安装手册 [3] 把网络设置单列出来,或许是基于以下考虑。虚拟机实例与物理网卡的通信,需要用到 vSwitch 技术,但是 vSwitch 的实现方式有多种,包括 Linux Bridge 和 Open vSwitch 等等 [4]。

对于大多数情况,Linux Bridge 基本上能够满足需要,所以安装手册 [3] 只介绍了 Linux Bridge 的配置方法。但是也有观点认为,在某些场合下,例如当虚拟机跨机房迁移时,需要更强大的 vSwitch 的技术实现,例如 Open vSwitch [5]。

关于 vSwitch,以及 Open vSwitch、OpenFlow 等等话题,我们将在后续有关虚拟网络的文章中,详细讨论。

当云计算中心,添置了服务器裸机之后,系统管理员需要执行上述三步操作。这些操作完成以后,新添的服务器就可以为用户,提供虚拟机租赁业务了。

1. 当系统管理员接收到用户提交的需求后,他根据用户指定的操作系统及其版本,把相应的操作系统安装光盘,插入服务器光驱。

或者,系统管理员先把操作系统安装光盘里的所有内容,导出成为一个 ISO 镜像文件。这个 ISO 镜像文件,不仅包含安装光盘上的所有内容数据,而且记录着每一段内容数据,存储在光盘里的哪一个扇区(Sector)。然后,他把这个 ISO 文件拷贝到服务器本地文件系统中。

2. 系统管理员根据用户提交的,虚拟机所需配置的 CPU 内核个数、内存空间、硬盘空间、以及实时带宽,通过调用 Linux 相应工具,启动虚拟机。操作步骤不复杂,也参见操作手册 [3]。

这里有两个问题。

1. 假如开启一个虚拟机实例后,用户在这个虚拟机实例里,下载并保存了某个内容文件,例如一段视频。并且,他安装了某个应用软件,例如 Apache Web Server。然后他让 Apache 运行了一段时间,产生了一些状态文件,例如日志文件。再然后,虚拟机实例被关闭,或许是被用户或系统管理员主动关闭的,也可能是因为故障而宕机的。

问题是,这个虚拟机实例能够被重启吗?虚拟机实例被重启后,用户先前保存的视频等等内容文件、安装的 Apache Web Server 等等应用软件、以及应用软件运行中产生的日志等等状态文件,有没有被保存?

答案是,可以重启这个虚拟机实例,并且用户先前保存的所有内容文件、安装的所有应用软件,以及在应用软件运行过程中,产生的所有状态文件,通通被保存,可以重新使用。

原理是,在用户提交的申请租赁虚拟机实例的请求中,有一个参数是该虚拟机实例占用的硬盘空间的大小。当系统管理员在某一台物理服务器上,调用系统指令,让 KVM 虚拟化系统,为用户创建虚拟机实例时,KVM 虚拟化系统在该物理服务器的本地硬盘中,创建了一个文件,作为这个虚拟机实例的镜像文件(Image)。

这个镜像文件的大小,基本上等于用户指定的虚拟机实例占用的硬盘空间的大小。在虚拟机实例看来,这个镜像文件,就相当于自己的硬盘,所以镜像文件又被称为虚拟硬盘。在这个镜像文件或者虚拟硬盘中,虚拟机实例可以设立不同的虚拟硬盘分区,分区中可以设立文件夹,文件夹中可以再设立子文件夹,或者存放文件。

当先前的虚拟机实例被关闭以后,可以在同一台物理服务器上,根据虚拟机实例的名称,重启该虚拟机实例。这时新的虚拟机实例,将会找到先前那个虚拟机实例所使用的虚拟硬盘,也就是镜像文件。

于是,当新的虚拟机实例开启以后,将会看到先前虚拟机实例,它保存的所有内容文件、安装的所有应用软件、以及应用软件在运行过程中产生的所有状态文件。

2. 问题二,假如先前的虚拟机实例被关闭以后,能不能在另外一台物理服务器上,重启该虚拟机实例?

答案是,可以在其它物理服务器上,重启虚拟机实例。但是有两个前提,1. 这两台物理服务器,必须安装相同的虚拟机系统,例如某版本的 KVM。2. 必须把先前那个虚拟机实例的镜像文件,也就是它的虚拟硬盘,从第一台物理服务器的文件系统,拷贝或者挂载到(mount)到第二台物理服务器的文件系统中去。

原理是,假如我们有两台电脑,当我们把第一台电脑的硬盘,拆下并安装到第二台电脑上去。然后开启第二台电脑,我们将会看到与第一台电脑一模一样的操作系统、文件、还有应用软件。镜像文件对于虚拟机实例来说,就是它的硬盘。迁移虚拟机实例,可以通过迁移它的虚拟硬盘,也就是镜像文件来实现。

我们之所以不厌其烦地介绍手工设置虚拟化系统、并运行虚拟机实例的步骤,是因为 Amazon EC2、OpenStack、以及 VMWare 等等系统,它们的主要功能,是让软件系统替代人工,自动化地去完成这些操作。

类似于 Amazon EC2 的自动化系统并不难设计。事实上,前述的准备工作,也就是安装虚拟化系统的三个步骤,是在添置物理服务器时完成的,是一次性的操作,所以手工完成这些准备工作,无妨大雅。

真正需要实现自动化的,仅仅限于提供虚拟机租赁业务的两个步骤,1. 提供操作系统安装光盘,或相应的 ISO 文件,2. 根据用户提交的虚拟机资源配置,创建虚拟机实例。

我们在下一节,将自行设计这样一套系统,然后把它与 Amazon EC2、OpenStack 等等横向对比。大家会惊奇地发现,我们自行设计的系统,在总体上,与 Amazon EC2、OpenStack 等等系统非常相似。