“云”这个词汇应该讲炒的还是挺热的了,当然其中也不乏过度诠释、强贴标签等现象。在过去的三个月里,我在家里折腾了一个私有云服务,基本上是 SaaS 与 PaaS 的混合。本文大略的记载了此中一些想法。

出于某些原因,我家里的 PC 情况上是有两台相对性能比较强的电脑(我在用的),和若干台上网本以及两台中端笔记本。老爸老妈都是搞土木工程的。之前经常能看到老妈抱着上网本等待 AutoCAD 慢慢开出来,整个屏幕一片白,这也直接促使了我产生进行私有云改造的想法。

刚开始打算使用 Xen HVM 来实现虚拟化,但是我 Linux 实在是比较渣,后来选择了 VMWare ESX Server 作为核心虚拟化系统,可以利用 vSphere 管理员工具方便的在 Mac 或是 PC 上进行管理。其中还是相当要感谢 VMWare 公司的售后服务人员,因为我所有的硬件都是家用级硬件,刚开始与 ESX 产生了非常大的兼容性问题(特别是路由器),不过所幸后来基本解决。硬件上初步采用的是 X58 + i7 920 + DDR3 4G*6 的模式。

SaaS

我的初步计划是解决大型软件在上网本上运行不能的问题,所以首先在 ESX 平台上创建了操作系统模板,这和 Xen 是一样的。我封装了一个 Win7,一个 Linux Mint,并且在 Linux Mint 中安装了 xrdp。这里就涉及到另外一个问题,应以什么形式从远端访问云服务。我选择的是 Windows 远程桌面,相比 VNC、FreeNX 等软件来讲,统一的没什么缝的系统体验对于上一辈人来讲应该还是足够的。

然后就是装软件,为了能够迅速的只部署想要的软件,我没有把软件做进系统模板里,而是依靠 ThinApp 进行部署。ThinApp 的 API 还算简单易用,并且能够提供良好的程序隔离,这对于之后的一步操作相当有用。我把 ThinApp 的数据文件放在了中心服务器上,类似于无盘站的工作方式一样,想启动某个程序时启动器会读取数据文件进行操作。不过令人比较遗憾的是,ThinApp 对大型软件普遍支持较好,反而是一些小型软件支持的不怎么样。

经过这么一番折腾,AutoCAD 这个大家伙的问题总算是搞定了。

我肯定不能指望我老妈每次要用 AutoCAD 都进 vSphere 控制台开了虚拟机出来再远程进去。就算要她手动开远程桌面我觉得都是一件违背设计初衷的事情。本来依旧想使用 VMWare 内的 Unity 功能,不过后来看了一下,Unity 的 API 比 RDP 的协议还复杂,所以改用 VirtualBox 的“无缝模式”技术。相对来讲,VirtualBox 比起 VMWare 这个庞然大物着实简单多了,而且直接可以通过源码理解技术实现。大概写了一个周末的代码之后大致上可以实现,直接从桌面上双击快捷方式,云端自动启动虚拟环境以及程序并接驳到本地计算机中。SaaS,软件即服务的目标基本实现。ThinApp 本身有网络传输功能,但是与在客户端本地运行性能上并无二异。

弹性性能需求

我现在在用 Amazon 的弹性计算云服务,之中相当重要的一点就是根据需求方便的调整运算设备规模。我本来想实现弹性内存,使得虚拟机可以根据实际需求使用内存,不过后来发现,貌似只有微软自家 Windows 2008 R2 Hyper-V 里的某功能可以比较好的实现目标,所以就先放弃了。相较 Hyper-V,ESX 可以比较好的调整 CPU 的占用(主要是通过对时间片的控制),这个 ESX 里有直接的设置,设置成根据资源占用调整 CPU 时间分配就可以了。

我一直相信,用户需要的并非系统,而是应用程序。ESX 可以方便的暂停整个系统,但是整个暂停、恢复的耗时都是令人难以忍受的,尤其是运行了程序之后无法进行实时性能优化的“碎片”系统。所以 ThinApp 提供了一个更优的解决方案,我只需要备份一个程序的运行状态。在其他程序需要资源时,我只需要暂停这个程序,出让更多资源;在整个系统需要关闭时,我只需要暂停程序,第二天就可以重新恢复一切工作。甚好的是,我可以在任意一个系统,甚至是客户端本身的系统上恢复状态,无疑提升了工作的持续性。

这样的话,弹性调整系统性能就相对更方便了。以调整内存为例,可以在工作的同时新开一个目标内存的实例,把应用程序迁移过去之后,关闭旧实例。整个过程中,对客户端完全是透明的,客户端的启动器会自动重新连接不同实例中的应用程序。经测试,停顿现象持续不超过 0.1s,达到预期目标。当然这种基于全虚拟化的云端技术终究不大可能会有 OpenVZ 那样的灵活程度。

共享存储池

接下来要解决的,就是在虚拟实例、客户端之间的数据共享问题。第一个面临的问题是,应该如何把本地设备映射到虚拟实例中。本来我考虑完全的映射,就是在客户端使用驱动,完全拦截所有设备通讯,发往虚拟实例对应的模拟端口,不过因为稳定性的原因放弃了。后来,我考虑到,老爸老妈绝大多数需求也就是 U 盘之类的而已,所以只需要做到简单的文件共享就可以了。

文件共享还是相当简单的,在控制台中创建一块共享虚拟硬盘后映射到每个虚拟实例。再把本地的存储文件夹以及可移动存储设备以网络符号链接(NTFS 的特性之一)的形式映射到共享虚拟硬盘中。说着麻烦拗口,做起来貌似还是挺简单的。

在解决了基本使用问题之后我在考虑性能与安全性的问题。iSCSI 一直应用不够广泛大半是网络性能跟不上存储性能的原因,在局域网环境中尚可。我基本上采取的是“能留在云端就留在云端”的原则,不同步数据,除非主动复制。针对安全性问题,我采取的方案是,除受保护的文件夹之外,其他文件夹云端程序可以自由读取,但是在向共享虚拟硬盘或客户端本地写入数据时,存在的文件会重新创建一份副本,以便追溯历史,不直接写入;不允许静默创建特定类型的文件,比如 exe、dll 等。随后我在虚拟实例中执行了几个病毒来实验,对 ESX 本身、其他虚拟实例以及客户端没有造成影响。

虚拟硬盘本身跨越了若干个物理设备,并且数据和程序分开存放,数据区域有一定的容错能力(RAID 10),程序区域则完全是依靠自校验进行纠错。同时,新的存储设备可以随时加入存储池;离开存储池的过程略微要麻烦一点,但是也只需要预先通知虚拟层,虚拟层在完成数据迁移之后就可以直接卸载设备了。整个数据迁移的过程对虚拟实例、客户端同样是透明的。

 

因不甚笔力,此文暂告一段落。不知道下一篇什么时候会出现,但愿能早点吧。忙死了 T_T

6 Thoughts on “浅涉私有家用云 (1)

  1. EmiNarcissus on 2012/02/16 at 00:34 said:

    嘛,家庭这么搞起来确实蛮赞的(星星眼,不过觉得有些铺张,不过远端网络云平台还是各种头疼,尤其是跨平台~
    因为家中老爷子的原因之前也想过做私有云之类的,不过因为时间因素也搁浅了。
    Saas的思路如果是远端网络的话通过远程桌面的方式整合不够本地化,对于需要大量操作本地文件或者连接阜的soft还是很难做到low latency整合,或许能把Saas无缝整合并实现跨平台的最好方式也是html5了。
    云存储偶在逐渐尝试自己构建dropbox,通过xmpp backend和inotify做监视通知,通过rsync做同步,有时间把web文件整理也给做了。之前搞过远程挂载,烂的一渣….恨死国内该死的网络了…~

  2. 咱已经彻底晕掉了…

  3. 高端~~~

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Post Navigation