升级 OpenNebula 3.x 到 OpenNebula 4.0

正在测试 OpenNebula 的升级工作,安装和测试新版 OpenNebula 4.0 是一件事,还有一件事是测试升级过程中可能遇到的问题和解决办法。升级是危险操作,每一个阶段都可能会有问题,所以升级前的各种备份和测试工作都需要准备妥当,配置文件、虚拟机、数据库等等都是必须备份的。好的升级除了应该保证数据完整、各部分运行正常外还应该尽量让用户察觉不到。

OpenNebula 官方文档说如果要升级的话需要参考相关版本的文档然后逐个版本依次升级:

If you are upgrading from a version prior to 3.8, read the 3.4 upgrade guide, 3.6 upgrade guide and 3.8 upgrade guide for specific notes.

逐个版本升级的过程太麻烦,我们看看能不能一次升级到位。

先停掉 OpenNebula 3.x 的相关服务:

$ sunstone-server stop
$ econe-server stop
$ occi-server stop
$ oneacctd stop
$ one stop

导出数据库(会在 /var/lib/one 下生成一个名为 one.db.bck 的备份文件):

$ onedb backup -v -f --sqlite /var/lib/one/one.db

关闭所有虚拟机后,然后在控制节点和计算节点正常安装 OpenNebula 4.0.

安装完 OpenNebula 4.0 后用新版的 onedb 升级数据库(也就是升级 one.db.bck 里面的表结构、字段等),这个升级过程将会自动从 3.2.1 到 3.3.0 到 3.3.80 到 … 逐个版本升级到 3.9.80,整个过程完成后会纪录在当前目录的 one.upgrade.log 日志文件里:

$ onedb upgrade -v -f --sqlite one.db.bck

注意升级前(onedb upgrade)一定要关闭所有虚拟机,否则升级数据库会报错:

> Running migrator /usr/lib/one/ruby/onedb/3.3.0_to_3.3.80.rb
You can't have active VMs. Please shutdown or delete the following VMs:
...

如果不想(或者不允许)关闭所有虚拟机的话,可以通过直接修改数据库的办法 “骗过” 升级脚本(onedb),只需要到数据库里手动把所有 VMs 的状态(state)改成 shutdown 就可以了:

$ sqlite3 one.db.bck
sqlite> SELECT oid,name,state,lcm_state FROM vm_pool WHERE (state <> 1 AND state <> 6);
sqlite> UPDATE vm_pool set state=1 WHERE (state <>1 and state <>6);

数据库升级完后就要开始升级配置文件,OpenNebula 4.0 一些配置文件、参数以及目录结构有改动,比如 OpenNebula 配置文件里的一些驱动名改了,im_kvm 改成了 kvm、vmm_kvm 改成了 kvm,为了兼容,所以需要增加 im_kvm 和 vmm_kvm. 修改 oned.conf 配置文件:

$ vi /etc/one/oned.conf
...
IM_MAD = [
      name       = "kvm",
      executable = "one_im_ssh",
      arguments  = "-r 0 -t 15 kvm" ]
IM_MAD = [
      name       = "im_kvm",
      executable = "one_im_ssh",
      arguments  = "-r 0 -t 15 kvm" ]
...
VM_MAD = [
    name       = "kvm",
    executable = "one_vmm_exec",
    arguments  = "-t 15 -r 0 kvm",
    default    = "vmm_exec/vmm_exec_kvm.conf",
    type       = "kvm" ]
VM_MAD = [
    name       = "vmm_kvm",
    executable = "one_vmm_exec",
    arguments  = "-t 15 -r 0 kvm",
    default    = "vmm_exec/vmm_exec_kvm.conf",
    type       = "kvm" ]
...

注意 authn 这一行需要有 server_cipher:

$ vi /etc/one/oned.conf
...
AUTH_MAD = [
    executable = "one_auth_mad",
    authn = "ssh,x509,ldap,server_cipher,server_x509"
]
...

/var/lib/one 目录结构中增加了一些新目录,比如 datastore, vms 等,OpenNebula 3.x 老版本的虚拟机镜像在 /var/lib/one 需要移到新的 /var/lib/one/vms 下,所以需要登陆到每个 OpenNebula 节点移动虚拟机镜像目录:

$ mkdir /var/lib/one/vms
$ mv /var/lib/one/[0-9]* /var/lib/one/vms

然后启动所有服务和虚拟机、观察日志文件,看看新版 OpenNebula 有什么问题:

$ one start
$ occi-server start
$ sunstone-server start

在 CentOS 6.4 上安装和配置 OpenNebula 4.0

我们实验室的 OpenNebula 3.2 已经很稳定的运行了两年,除了开头一个月不熟悉这套云计算软件有点乱、容易犯错外接下来的时间里都很稳定,期间还包括一次防火演习(突然拉闸似断电)和安全检查(计划中的断电),服务器、虚拟机、存储设备、系统和服务都能自动起来并能正常工作。现在正在考虑升级的事情,OpenNebula 4.0 有很多新特性值得一试,现在的问题是升级很麻烦,官方文档貌似说要逐个版本升级,这个是小问题,更大的问题是如何升级整个运行中的生产环境,这里面有太多的因素需要考虑到,想了都头大~先安装一个 OpenNebula 4.0 试玩一下,看看数据库表结构、一些工具、配置文件,看看能不能琢磨出一个可行的升级方案出来,具体的升级操作将会在圣诞节期间进行(人最少的时候),不过现在应该开始计划和测试了。

下面的安装过程采用最小化的 CentOS 6.4 安装版本(CentOS-6.4-x86_64-minimal.iso)。不熟悉 OpenNebula 和云计算的朋友可以先看看 “在 CentOS 上安装和配置 OpenNebula” 的开头部分预热一下。

开始之前先装上 EPEL 源,然后升级系统:

# yum install wget
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum update

到官网 http://downloads.opennebula.org/ 下载 OpenNebula 4.0 for CentOS 6.4 的安装包、解压后安装,因为有包依赖问题,所以最好用 yum localinstall 安装,不要用 rpm -ivh 命令直接安装。在控制节点(或叫做头节点)上安装 opennebula 和 opennebula-sunstone 等:

# cd /usr/src
# tar zxvf CentOS-6.4-opennebula-4.0.0-1.tar.gz
# cd opennebula-4.0.0-1

# yum localinstall opennebula-common-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-ruby-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-sunstone-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-server-4.0.0-1.x86_64.rpm

在计算节点上安装 kvm 和 opennebula-node-kvm:

# yum install qemu-kvm qemu-kvm-tools libvirt
# yum localinstall opennebula-node-kvm-4.0.0-1.x86_64.rpm

# /etc/init.d/libvirtd start

安装搞定,OpenNebula 4.0 的安装就是这么简单,开始在控制节点上启动服务吧:

# service opennebula start
Starting OpenNebula daemon:                                [  OK  ]
# service opennebula-sunstone start
Starting Sunstone Server daemon: VNC proxy started
sunstone-server started
                                                           [  OK  ]

我们通常都会通过 IP 访问(或者内部域名)访问 sunstone 界面,所以需要改变 sunstone 的默认接听地址,把 host: 127.0.0.1 换成机器所在 IP 地址,需要重启服务让设置生效。注意这里使用 9869 端口,CentOS 6.x 默认是开启防火墙的,所以可以把这个端口加到防火墙规则里也可以直接把防火墙关掉:

# vi /etc/one/sunstone-server.conf
...
# Server Configuration
#
:host: 192.168.2.150
:port: 9869

# service opennebula-sunstone restart
Stopping Sunstone Server daemon: VNC server is not running
sunstone-server stopped
                                                           [  OK  ]
Starting Sunstone Server daemon: VNC proxy started
sunstone-server started
                                                           [  OK  ]

# /etc/init.d/iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]

打开浏览器,访问 http://192.168.2.150:9869 登陆界面,那登陆的用户名和密码是啥呢?用户名和密码在安装的时候已经随机生成,oneadmin 是用户名,后面的一串是密码:

# cat /var/lib/one/.one/one_auth
oneadmin:0dee417dfb22f2372866d686c7b12889

登陆成功后界面比以前的版本有很大改进:

opennebula 4.0 sunstone

安装 OpenNebula 基于 Web 的管理控制台

我们一般用 onehost/onevm/onevnet 这些命令行工具来管理 OpenNebula 云计算平台,不过有个项目组开发了 OpenNebula Management Console 管理工具,基于 PHP 和 MySQL,安装和配置也不是很复杂,和配置普通 CMS 系统差不多。上周我们在两台服务器上安装和配置了一个最小的 OpenNebula 云计算平台,我们将在生产环境测试一段时间 OpenNebula,争取能用 OpenNebula 替换我们自己的脚本,并逐步用这个平台来统一管理我们的 Xen 服务器。VPSee 周末试了试这个基于 Web 界面的 OpenNebula 管理工具,界面简单清晰,使用也很方便。这个控制台管理工具(onemc)只能安装在前端(Front-End)服务器上。

安装必备软件包

onemc 是基于 PHP 和 MySQL 的,需要安装一些必要的软件包:

# yum install php php-mysql mysql-server php-curl php-xmlrpc httpd \
php-pear php-devel php-adodb

下载 onemc

下载和解压 onemc-1.0.0.tar.gz 后直接放在 apache 的默认目录里(懒得改 httpd.conf):

# cd /var/www/html
# wget http://dev.opennebula.org/attachments/download/128/onemc-1.0.0.tar.gz
# tar zxvf onemc-1.0.0.tar.gz
# cd onemc

配置数据库

# mysql -uroot -p
Enter password: 
mysql> create database onemc;
mysql> create user 'oneadmin'@'localhost' identified by 'oneadmin';
mysql> grant all privileges on onemc.* to 'oneadmin'@'localhost';
mysql> \q

# mysql -u oneadmin -p onemc < /var/www/html/onemc/include/mysql.sql

配置 onemc

# vi /var/www/html/onemc/include/config.php
...
// vmm: kvm or xen
$vmm = "xen";
...
// ADODB settings
$adodb_type = "mysql";
$adodb_server = "localhost";
$adodb_user = "oneadmin";
$adodb_pass = "oneadmin";
$adodb_name = "onemc";
...

登录

如果系统设置了 http_proxy 环境变量的话一定要先关闭,然后重启 one 和 httpd:

# unset http_proxy
# one stop; one start
# /etc/init.d/httpd restart

打开 http://172.16.39.110/onemc/index.php 页面后就会显示登录信息(172.16.39.110 是 OpenNebula 前端的 IP 地址),用户名和密码是安装和配置 OpenNebula 的时候在 one_auth 中设置的密码(cat "oneadmin:password" > one_auth)。

opennebula management console

在 CentOS 上安装和配置 OpenNebula

我们提到的云计算一般有三种类型:软件即服务(Software as a Service, SaaS),平台即服务(Platform as a Service, PaaS)和基础架构即服务(Infrastructure as a Service, IaaS)。云概念刚出来的时候被人说的云里雾里摸不着头,现在云技术已经深入人心,也许你正在使用云而自己没有察觉呢,比如每天使用的 Gmail 就在 Google 大云上。为了更好理解这三种不同的云,我们可以拿 Google 来举例,刚好这家公司提供了三种形式的云服务,首先看 SaaS,Google Gmail/Docs/Gtalk/Maps 这些 Apps 都运行在 Google 云上,所以他们为普通用户提供了 “软件即服务”;Google 同时提供面向开发人员的 AppEngine,可以让开发人员在他们的平台(Platform)上使用 Python, Java 等语言和他们提供的 API 开发软件和服务,所以他们为开发人员提供了 “平台即服务”;Google 自己内部构建了基于 GFS, BigTable, MapReduce 之上的庞大基础云设施,为自己内部人员提供了 “基础架构即服务”,这就是三种不同类型的云。

OpenNebula 是一套开源的云计算基础管理工具,用来方便管理员在数据中心统一部署、创建、分配和管理大量的虚拟机,企业数据中心可以利用这套工具搭建自己的私有云,为自己内部提供 IaaS 服务,类似的开源产品还有 OpenStack, CloudStack, Eucalyptus, openQRM 等等。以下的安装过程在 VPSee 的两台装有 CentOS 5.5 系统的服务器上完成,一台服务器做 OpenNebula 前端(node00),另一台服务器用来做节点(node01),搭建一个最小的 “云”,如果想扩展这个云的话,只需要逐步增加节点(node02, node03, …)就可以了。如果对其他类似的开源云计算平台感兴趣的话可以看看:在 Ubuntu 上安装和配置 OpenStack Nova,最新的 OpenNebula 4.0 安装看这里:在 CentOS 6.4 上安装和配置 OpenNebula 4.0.

安装和配置前端(Front-End)

增加 CentOS Karan 源:

# cd /etc/yum.repos.d
# wget http://centos.karan.org/kbsingh-CentOS-Extras.repo
# yum update

安装 OpenNebula 需要的软件包以及编译 OpenNebula 源代码所需的工具:

# yum install gcc gcc-c++ make openssl-devel flex bison

# yum install ruby ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc
# yum install rubygems
# gem install nokogiri rake xmlparser

# yum install scons
# yum install xmlrpc-c xmlrpc-c-devel

CentOS 自带的 sqlite 版本不行,需要下载和编译 sqlite 3.6.17 版本:

# wget http://www.sqlite.org/sqlite-amalgamation-3.6.17.tar.gz
# tar xvzf sqlite-amalgamation-3.6.17.tar.gz
# cd sqlite-3.6.17/
# ./configure; make; make install

下载和编译 opennebula 2.0.1 源码包后,解压、编译和安装:

# tar zxvf opennebula-2.0.1.tar.gz
# cd opennebula-2.0.1
# scons
# ./install.sh -d /srv/cloud/one

# ls /srv/cloud/one/
bin  etc  include  lib  share  var

启动 OpenNebula 前需要配置 ONE_AUTH 环境变量,这个环境变量从 $HOME/.one/one_auth 这个文件读取,所以要先创建 one_auth 这个文件后再启动 one(OpenNebula 服务程序):

# cd /root/
# mkdir .one
# cd .one/
# echo "oneadmin:password" > one_auth

# one start

OpenNebula 支持 KVM, Xen 和 VMware 三种虚拟技术,我们还需要告诉 OpenNebula 我们想用哪种,并重启 one 以便配置生效:

# vi /etc/one/oned.conf
...
IM_MAD = [
    name       = "im_xen",
    executable = "one_im_ssh",
    arguments  = "xen" ]

VM_MAD = [
    name       = "vmm_xen",
    executable = "one_vmm_ssh",
    arguments  = "xen",
    default    = "vmm_ssh/vmm_ssh_xen.conf",
    type       = "xen" ]
...

# one stop
# one start

安装和配置节点(Compute Node)

需要在每个 node 上都安装 Xen 或 KVM 的虚拟环境,具体请参考:在 CentOS 上安装和配置 Xen在 CentOS 上安装和配置 KVM,还需要 ruby 运行环境:

# yum install ruby 

交换 SSH Key

因为 OpenNebula Front 和 Nodes 之间是通过 SSH 通讯的,所以 front 和 nodes 之间要设置成 SSH 无密码登录避免 front 运行 node 上脚本或克隆镜像的时候输入密码,首先在 front 和 nodes 上配置 sshd:

# vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes

# /etc/init.d/sshd restart

在 front (node00) 上创建 key 后拷贝到 node (node01):

# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub node01

在1个 node (node01) 上创建 key 后拷贝到 front (node00):

# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub node00

onehost

front 和 每个 node 都能无密码 ssh 沟通后,就可以在 front 上 onehost create 命令来逐个加入 node,并用 onehost list 来查看是否创建成功:

# onehost create node01 im_xen vmm_xen tm_ssh

# onehost list
  ID NAME              CLUSTER  RVM   TCPU   FCPU   ACPU    TMEM    FMEM STAT
  1 node01     default    0    400    400    400    3.8G    383M   on

如果执行 onehost create 报错,查看 oned.log 日志发现 sudo: sorry, you must have a tty to run sudo 字样,原因则是 OpenNebula 需要远程 ssh/sudo 执行命令,而 CentOS 的 sudo 选项 requiretty 是默认打开的,ssh 需要一个 tty 才能执行,所以远程 sudo 就会出错,:

# onehost create node01 im_xen vmm_xen tm_ssh

# tail /var/log/one/oned.log 
Tue Feb 22 11:08:58 2011 [InM][I]: Command execution fail: 'if [ -x "/var/tmp/one/im/run_probes" ]; then /var/tmp/one/im/run_probes xen 172.16.39.111; else                              exit 42; fi'
Tue Feb 22 11:08:58 2011 [InM][I]: STDERR follows.
Tue Feb 22 11:08:58 2011 [InM][I]: sudo: sorry, you must have a tty to run sudo
Tue Feb 22 11:08:58 2011 [InM][I]: Error executing xen.rb
...

解决办法就是关闭(注释掉) requiretty 这行:

# chmod 600 /etc/sudoers
# vi /etc/sudoers
#Defaults    requiretty

因为 VPSee 的这两台服务器使用了 HTTP 代理上网,所以 OpenNebula 读取了系统的 http_proxy 环境变量,在 sched.log 日志里发现了 HTTP response 错误,这时候需要关闭 http_proxy:

# cat /var/log/one/sched.log
Tue Feb 22 14:27:39 2011 [HOST][E]: Exception raised: Unable to transport XML to server and get XML response back.  HTTP response: 504
Tue Feb 22 14:27:39 2011 [POOL][E]: Could not retrieve pool info from ONE

# unset http_proxy

onevnet

创建和编辑虚拟网络配置文件,然后创建一个 OpenNebula 虚拟网络:

# vi small_network.net
NAME = "Small network"
TYPE = FIXED

BRIDGE = br0
LEASES = [ IP="192.168.0.5"]
LEASES = [ IP="192.168.0.6"]
LEASES = [ IP="192.168.0.7"]

# onevnet create small_network.net 

# onevnet list
  ID USER     NAME              TYPE BRIDGE P #LEASES
   0 oneadmin Small network    Fixed    br0 N       0

onevm

创建和编辑虚拟机的启动配置文件,这里的 centos.5.5.x86.img 可以从 http://stacklet.com/ 下载(收费)或者自己利用 Xen 工具创建一个:

# wget http://stacklet.com/sites/default/files/centos/
centos.5.5.x86.img.tar.bz2
# tar jxvf centos.5.5.x86.img.tar.bz2
# mv centos.5.5.x86.img /srv/cloud/one/var/images/

# vi centos.one 
NAME   = centos
CPU    = 1
MEMORY = 256

DISK = [
  source   = "/srv/cloud/one/var/images/centos.5.5.x86.img",
  target   = "sda1",
  clone    = "yes",
  readonly = "no" ]

NIC = [ MAC = "00:16:3E:00:02:64", bridge = br0 ]

OS = [ bootloader     = "/usr/bin/pygrub" ]

用 onevm create 命令启动上面的 VM 配置文件,就会在 node01 上创建一个虚拟机,用 onevm list 查看会看到 prol 状态,表示正在创建过程中,创建完毕后状态会变成 runn:

# onevm create centos.one

# onevm list
   ID     USER     NAME STAT CPU     MEM  HOSTNAME        TIME
    1 oneadmin   centos prol   0      0K  node01   00 00:09:09

# onevm list
   ID     USER     NAME STAT CPU     MEM  HOSTNAME        TIME
    1 oneadmin   centos runn   0      0K  node01   00 00:22:17

就这样,我们在 node00 (front) 和 node01 (node) 这两台服务器上部署了一个最小的云,并且在 node01 上运行了一个基于 Xen 的虚拟机实例。

Google Chrome OS 想干嘛?

在机场转机的时候从网上下了一个 Chrome OS 的 VMware 镜像,很惊讶机场居然没有限制 Wi-Fi 上网的流量和时间。把下载后的镜像解开后直接在 VMware Fusion 下启动,用 Gmail 账号登陆后就可以看到界面了,界面非常类似 Chrome 浏览器。

chrome

玩了玩 Chrome OS 后,谈谈个人对 Chrome OS 的一些想法。表面上看 Google 在同一个市场(上网本、上网终端)推出了两个类似的产品:Android 和 Chrome,注意 Android 也可以移植到上网本上。有人可能会认为同时存在 Android 和 Chrome OS 增加了市场混乱,而且在开发人员眼里增加了开发多平台的难度,多一个平台就多了一套 SDK/API,实际上没有那么复杂,Chrome OS 上的一切程序都是 web app,能在浏览器上运行就能在 Chrome OS 上运行,所以不用特别为 Chrome OS 开发应用程序。Chrome OS 就目前看来就是一个浏览器,Chrome OS 有的功能现在任何带浏览器的操作系统都有,显然 Chrome OS 的竞争对手不是现有的 PC 操作系统。考虑到手机的特殊性,Chrome OS 目前也不能替代 Android,竞争对手也不是 Android. 现在的问题是为什么 Google 要推出另一个操作系统?

VPSee 大胆猜测一下,Google 对 Chrome OS 的期望和未来的计划不仅仅是上网本这么简单。Google 的目标是统一通信和网络,使用任何装置都可以上网、打电话、使用 web app,推出 Chrome OS 这一系统是想加速这一转变过程。Google 想依靠自己强大的数据中心和网络建立和提供统一的通信基础设施和网络,把互联网和电话网络连在一起。从用户角度看就是可以通过浏览器使用低廉甚至免费的电话、语音信箱、电话会议等服务。

Google 最近又收购了一家基于 SIP 的 VoIP 公司 Gizmo5,Google 本身拥有基于 XMPP 的 VoIP 软件 Gtalk,并且 Gtalk 的功能包括视频在内都已经被移植到了 Gmail 上,Google 还推了 Google Voice,上个星期还收购了一家手机广告商 AdMob. 可以看出 Google 正在一步一步的把 VoIP 和手机移植到 web app. Chrome OS 现在不能替代 Android 是因为 Chrome OS 不能打电话,如果 Google 推出 web app 并改善 Chrome OS 使得 Chrome OS 能通过 Google Voice 或其他服务访问到全球电话网络的话,那么我们就不需要电话、手机了,任何带浏览器的装置,比如:上网本、手机、电脑等各种终端都可以当做电话使用并且在 Google 有一个唯一的电话号码。这个时候受打击的应该是 Nokia 等手机制造商,所以现在手机制造商也在推出类似的上网终端向互联网靠拢,比如 Nokia N900,基于 Maemo 开源平台的 mobile computer.

如果 Chrome OS 能成功的话,那未来将是 web app 的天下,现在一般都在云上部署 web app,计算方式也正在从个人计算向云计算转变,所以这就是为什么现在云计算这么火的原因。

SnowFlock 快速克隆 Xen VM

这个周末看了一篇关于快速克隆 Virtual Machine(VM)的文章,SnowFlock: Rapid Virtual Machine Cloning for Cloud ComputingSnowFlock 是 University of Toronto 的一个项目,核心想法是把 Unix 操作系统中 fork 的概念引入到云计算,不过不是用来 fork 进程,是 fork 虚拟机,这个 fork 与原始的 Unix fork 有几点不同:

1、VM fork 可以 fork 到其他物理机器上,Unix fork 只能在本机操作系统内 fork;
2、parallel fork,一次 fork 调用可以创建多个 child VMs;
3、VM fork 从 parent VM 那里复制所有的进程和线程。

SnowFlock 从不同的物理机器上 fork 出相同的 VM,这些 VMs 连在一起构建一个私有 cluster,拥有自己的虚拟网络。SnowFlock 根据计算的需要分配计算资源,从众多的物理机器中创建一个合理大小的 Xen VM Cluster,由这个 cluster 来完成目标计算,完成计算后,这个 cluster 就自动消失了。

snowflock

把 Unix 中的 fork 概念用到云计算 VM 克隆中是个很有意思的想法,SnowFlock 如何做到快速克隆呢?做到 fork 并不难,最土的想法就是 fork 时利用虚拟机的 suspend/resume 功能,把 VM suspend 后将整个 VM 文件拷贝到别的机器上然后 resume 运行。但是这个过程太慢,在 VPSee 的 Mac 上 suspend 一个 vmware 虚拟机大概需要 30秒,又需要另外 30秒 resume。SnowFlock 克隆 VM 只需要不到1妙,它是如何做到这点的?

1、VM 文件里包含 memory image,disk image,各种状态、配置信息等,SnowFlock 只复制必要的状态信息(VM descriptor),这样就不必复制包含整个操作系统在内的 VM 文件,如果 disk image 设的是 10GB,那就不必复制 +10GB。Memory-On-Demand 允许 child VM 只在需要某个 memory 页面的时候才去 parent VM 那里克隆,可以在 fork 后进行,减少了初始克隆 VM 的体积;
2、VM 克隆的时候不必克隆所有的 memory image,只需要原始 image 中一小部分信息(Memory State),这又减少了需要克隆的体积;
3、child VM 可以在 fork 到其他机器上后再分配内存。如果先分配内存会造成 memory image 过大,影响克隆速度。如果 parent VM 分配了页面,比如 malloc,但是还没有用到这些页面、没有数据的话这些页面也用不必克隆到 child VM。还有一些可以循环使用的 kernel buffer 也不必克隆,,进一步减少克隆体积;
4、child VM 通常执行类似的代码和数据结构,如果 fork 多个 VMs 的话有助于 multicast;
5、把数据 multicast 给多个 VMs,只要有1个 VM 请求页面,这个页面也会被 multicast 给其他 VMs。一次操作就把数据分发给所有 VMs 还可以减少网络负载。

简单的说就是,尽可能减少 VM 携带的信息量来达到快速克隆的目的,这篇论文指出只需要克隆原 VM 0.1% 的信息就足够运行一个 child VM 了。SnowFlock 在 Xen 3 上实现了上述快速克隆的概念,具体实现过程很复杂,如有兴趣可参考论文和代码。SnowFlock 实现的简单图示:

snowflock

(图片来自 SnowFlock 官方网站和资料。)

云计算可以用来替代高性能计算吗?

周末看了两篇有趣的论文,关于云计算的,云计算被称为 “scale by credit card” 的技术,看看 credit card 足够多的话能不能用来替代高性能计算(HPC),能不能替代那些超级计算机和集群:)。一篇是:Benchmarking Amazon EC2 for high-performance scientific computing;另一篇是:Can Cloud Computing Reach The TOP500?

云计算大致可以分为以下三种,目前关于云计算做 HPC 的探讨主要集中在 IaaS,Amazon EC2/S3 是 IaaS 的典型代表,也是目前最好的 IaaS 服务商:

1、Infrastructure-as-a-Service(IaaS)
2、Platform-as-a-Service(PaaS)
3、Software-as-a-Service(SaaS)

第一篇文章作者使用 NAS Parallel Benchmarks 比较了云计算的 Amazon EC2 Cluster 和传统 HPC 的 NCSA Cluster,为了测试两者硬件配置基本相同:

Amazon EC2 Cluster NCSA Cluster
7 GB memory, 4 CPU cores per processor (2.33-GHz Xeon), 8 CPU per node, 64 bits, 1690 GB storage 8 GB memory, 4 CPU cores per processor (2.33-GHz Xeon), 8 CPU per node, 64 bits, 73 GB storage
High I/O performance (specific
interconnect technology unknown)
Infiniband switch

测试结果一点也不惊讶,显然专门的 HPC 集群要快一些。在计算方面,即使在单个 node 上,EC2 也要慢7-21%,如果在 32 CPUs 上则要慢40-1000%,而且 node 之间还没有通信,算上通信会慢更多;在网络性能和延迟方面,EC2 没办法和专门为 HPC 打造的 Infinband switch 比。

第二篇文章得到类似的结果并且认为,如果云计算厂商有意进入 HPC 市场的话,并且能在内存、网络延迟、价格方面有所改进的话,对于 HPC 来说云计算还是很有吸引力的。两篇文章都得出类似的结论,虽然云计算在 web services 领域如火如荼,但是在 HPC 领域还没有准备好。用 Cloud Computing 进行计算的花费随着计算复杂度的增加而指数增加,这一点和 HPC 是一样的,并不能带来特别的好处。

Amazon EC2 远远没有达到 HPC 的性能,目前替代 HPC 还太早。我们知道一台超级计算机的价格太高,而且资源稀缺,不是买一个放在那里就完了,电源、机房、设备、人力导致总体成本更高。一般高校、研究机构都养不起超级计算机。个人认为云计算在 HPC 领域还是可以有所作为的,对与要求不高的 HPC 云计算可以按需付费使用,不必自己养一台庞然大物,养超级计算机每年的电费可能都超过了付给云计算的服务费。虽然目前云计算对于商业 HPC 的应用还不成熟,但足够用来运行一个小计算机集群,供小规模的 HPC 应用。或者云计算可以作为已有的超级计算机集群的扩展,某个高峰时期现有集群不够用时临时扩展到云计算应急一下。云计算还有一个显而易见的好处就是马上就可以获得,付费马上就可以使用,不必等待超级计算机预算、决策、购买、安装、调试漫长的等待过程,如果对于性能不是很在意,不关心计算速度有多快,云计算是个不错的替代选择。

37signals 的 RoR 架构

37signals 是除了 Twitter 以外的又一个高流量 Ruby on Rails 架构的示例。

数据

数据来源(2007):Ask 37signals: Numbers?

约30台服务器组成的 cluster,从 1 CPU 的文件服务器到 8 CPU 的应用服务器,加起来大慨 100 CPUs 和 200GB 内存(正计划把服务器数量减到16台,92 CPUs 和 230GB 内存,性能更高,架构更简单更易管理)。
客户总共上传约 5.9TB 的数据

Stack

以下是 37signals 用到的一些 stack:

Apache
HAProxy
Ruby on Rails
Mongrel
Memcached
MySQL
Xen
Amazon S3

值得注意的是用到了 Xen 虚拟技术和 Amazon S3 云存储。Memcached 现在已是高访问量网站的标准配置了,就不介绍了。有意思的是,DHH 在 Interview with David Heinemeier Hansson 提到,随着技术的发展,硬件越来越便宜,如果能用硬件解决问题就尽量用硬件,除非绝对必要,否则 shard 数据库来分载流量很痛苦。所以 37signals 不太赞成随便 shard,他们现在的主程序就跑在1台 128GB 的主服务器上,然后有多个备份服务器支持,主服务器不久会扩充到 256GB。VPSee 推测他们的 load balancing 是 Xen 之间的 load balancing,不是物理服务器之间的分载。

继续阅读 »