NodeStack:另类的开源云计算组合
NodeStack是另类的开源云计算组合,从内到外实现了应用PaaS。其架构主要包括SmartOS、Node.js和MongoDB三部分。本文将重点介绍NodeStack的底层平台SmartOS。
最近谈到开源云计算,大家可能第一想到的是OpenStack、Cloud Foundry这种金光闪耀的组合。但NodeStack的发布,使大家眼前一亮——原来可以这么玩。简单地说,NodeStack使用了一套完全不同的 开源架构,从内到外实现应用PaaS。其架构主要包括SmartOS、Node.js和MongoDB。由于这几种技术的东家都参与了这个项目,我们就来 看看NodeStack到底有什么神奇的地方。
先来简单介绍一下出场的各位玩家。
- Joyent,Node.js的东家。有趣的是这个公司的主营业务是IaaS,其核心技术在于SmartOS——一种与时俱进的Solaris。
- Nodejitsu,Node.js社区的核心玩家。公司的目标是做一个基于Node.js的PaaS平台。
- 10gen,MongoDB的东家。
- MongoLab,MongoDB云服务的提供商。
Joyent 在这个体系当中提供最为基础的计算和存储资源,很多人可能认为这和其他提供IaaS的公司没什么两样。其实不然,Joyent的云从某种角度上来说并不完 备。但依我看,这个云真的就是为做PaaS而裁剪的,特别合体。SmartOS的种种特性,真的令人赞叹:原来PaaS的底层应该是这样的。
Nodejitsu所做的工作就是用Joyent提供的计算和存储资源,做一个专门针对Node.js应用的PaaS。这个开源PaaS的源代 码可以从GitHub上获取。应用肯定是少不了数据的,一个时髦的数据库服务也是必不可少的,甚至有人将数据库服务称为DBaaS。MongoLab就是 将10gen的MongoDB 做成了云服务,按量收钱,因此成为PaaS中强有力的组件。
本文将重点介绍底层平台SmartOS。后面我会陆续写文章介绍开源PaaS平台和MongoDB云服务。
SmartOS
为什么Joyent要使用Solaris?Solaris开源吗?不是挂掉了吗?
要是大家知道谁为Joyent工作或许就不会有这样的疑问了。Bryan Cantrill是Joyent现在的工程副总裁。作为原来Sun的杰出工程师,他设计并实现了DTrace,被MIT的《技术评论》评为“35才俊”(TR35)。
Brendan Gregg现在是Joyent的首席性能工程师。他是《DTrace》那本巨著的主要作者。此外,他还参与了《Solaris Performance and Tools》一书的撰写。作为DTrace工具包的开发者,他在Sun工作时曾参与了大量的Solaris性能优化项目,是这个星球上最懂性能优化的工程 师之一。
Sun开放了OpenSolaris,本以为Solaris那些闪耀的技术会对社区产生深远的影响。不曾想好景不长,在被Oracle收购之 后,Sun改变了对待社区的态度,不再支持OpenSolaris项目了。然而,很多Solaris的团队成员并不接受这种安排,继续维护了一个叫做 Illumos的项目,使得开源的Solaris内核得以继续维护。
好在Sun当时已开放了好多代码,基础已相当不错。我认为有点可惜的是,Sun当时的编译器体系并没有开放出来,其中的编译器、优化器、性能分析器和调试器都是业界一流水准的作品。但做人要厚道,不能贪求太多,让我们着眼于已开放的那一部分吧。
Sun这家公司,你说它有先见之明也好,说它过于超前也好。以当今云计算大潮的视角来看,能看准这些方向的公司实在是太有眼光了,主要体现为 ZFS彪悍的文件系统(其实说它是文件系统本身就是对ZFS的一种侮辱,它还有卷管理)、Zone操作系统层的虚拟化技术、Crossbow网络虚拟化组 件以及DTrace超级调试工具。甚至有Solaris忠粉说,Linux的Btrfs、LXC、Open vSwitch、SystemTap就是对Solaris上述技术的山寨。山寨与否可能无从考证,看来大家对技术趋势看法比较一致。我认为,这些技术也是 云计算技术拆解的一个缩影。
Joyent认为,Solaris这些特性简直就是为其IaaS而打造的,因此坚定地将方向锁定在这个看似不怎么闪耀的系统上。它不但招聘了大 量原来Sun公司的工程师,还积极投身到Illumos这个项目上。但仅有Illumos远远不够,它只维护了一个非常核心的内核,距离发行版还有一段距 离。Joyent并没有采用已有的基于Illumos的发行版,比如OpenIndian,而是根据自己的需要做了一个, 这就是SmartOS。要说SmartOS和别的发行版最明显的不同,那一定是KVM了。对,你看得没错。SmartOS将Linux的KVM移植到了 Solaris上。我不知道Joyent这些天才工程师是如何做到的,但他们的确做到了。
综合来看,SmartOS是一个非常有特点的发行版。SmartOS的定位就是做Hypervisor,甚至这个发行版不提供安装功能,只提供一个LiveCD镜像。开始时,我对此也非常不理解,后来慢慢发现这也是一个非常不错的想法。
这样无论使用网络启动,还是USB引导,只要使用的LiveCD是一样的,起来的系统就是完全一样的。这个看上去没什么,但如果大家管理的机器 数目众多,很少有人能保证系统是完全一样的。作为Hypervisor的所有软件都在SmartOS内部提供了,结果给各种软件版本依赖性造成了冲突,也 就是说升级新版本失败了,大不了换回老的镜像,不会出现“升级崩溃”现象。当然,这种LiveCD的设计相对来讲只能算雕虫小技,远不能与其最核心的四大 亮点相比,即 KVM、Zones、DTrace和ZFS。
KVM(Kernel-based Virtual Machine)
KVM是开源虚拟化的一面旗帜。但提到KVM,就不得不提到它的对手——Xen。似乎在相当长的一段时间, 选择Xen还是KVM引起了很大的争议。Xen的势力非常强大,现在比较彪悍的虚拟化系统都有Xen的身影,比如Amazon Web Services、Rackspace、Linode都是基于Xen的。
Xen无疑曾经是一个非常成功的平台虚拟化方案。其实Sun的Solaris本来就是支持Xen的,可是Joyent的这些爱好技术的工程师认 为KVM更有前途(我也这么认为),于是把KVM移植到了Solaris上。毫无疑问,KVM会在Linux下前途无量,因为它已进入了Linux内核主 线。Xen虽然提交了一些东西给内核,但远不是内核的一部分。
很多人都不看好这个把KVM移植到Solaris上的做法。因为大家都知道KVM和Xen最大的不同就在于两点:第一,要求使用硬件的虚拟化支 持;第二,尽可能地使用Linux内核已有的特性,而不是另起炉灶。不知道是Joyent的工程师水平太高,还是KVM设计得足够精良很容易移植,反正大 家看到Joyent对自己的移植成果还是非常满意的。
KVM并不是Joyent的重头戏,但的确是个非常重要的部分。因为有了KVM,就可以兼容以前的各种既有系统,用户可以不用迁移到 SmartOS上,仍然使用原来的系统。这大大降低了用户迁移的顾虑。但说白了,Joyent 要做的IaaS不是类似于AWS的那种,而是一种更容易构建PaaS或者其他服务的IaaS,所以说KVM很精彩,但不是重点。那么重点是什么呢?
Zones
PaaS也好,IaaS也好,肯定是要为很多用户服务的,比较学术的说法叫多租户系统。由于各租户之间的数据和资源是完全隔离的,所以就需要系统提供各个层面的隔离。
举个例子来说,我们要提供一个为很多人服务的数据库,用户之间是绝对不能泄露数据的,这是数据的隔离。但这只是用户看到的一个表面。试想,如果一个用户缺乏数据库的使用经验,写了一条不恰当的查询语句,导致CPU的占用率非常高,可能会影响其他用户的正常使用。
如果这种情况发生在没有CPU限制的系统内,一般的解决方案需要修改数据库的源码,增加监视或者评估模块,来限制对于某种资源的消耗。但这种方 案的成本很高,需要对应用场景非常了解,不具有普遍性。要是临时换了一种数据库,原来做的工作就要付诸东流了。另外,这种技术还需要对可能发生问题的原因 有定论。但提供云计算就像提供电能一样,几乎不太可能知道用户最终如何使用电能。因此,用总结规律的方式来处理这类资源消耗问题并不是一个好方法。这不仅 要求考虑到 所有可能发生的情况,而且实现起来也非常复杂,违背了KISS原则。
能否只在资源层面做出一些限制,比如分配给一个用户固定的CPU占用,无论用户以何种方式操作,都不能逾越这个限制,用户好像被限制在一台资源有限的机器中一样?
Zones是Solaris下操作系统层面的虚拟化方案,也称作容器技术。平台虚拟化的方案对很多场景并不 经济,如前面所说的提供数据库服务的方案。但为每个用户提供一个操作系统,然后在里面安装一个数据库,显然又有点太浪费了。容器有效地将由单个操作系统管 理的资源划分到孤立的组中,以更好地在孤立的组间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(Paravirtualization)和系统调用替换过程中的复杂性。
这里也体现出了多租户和多用户的一个非常不同的地方,多个租户使用不同的实例,也就是说kill了这个租户的数据库进程,别的租户是完全感觉不到的。本质上说,依赖修改应用源码的方式还是属于多用户的套路。这样会有很多问题,后续将讨论这个问题。
这里多说两句,用Linux的同学也不用羡慕,可以尝试LXC。LXC在Cgroup基础上又向前发展了一步,成为比较系统的容器。很多国内大的互联网公司最近都纷纷拥抱了容器技术,而不是IaaS,究其原因还是容器技术非常适合其应用场景,更加经济高效。
互联网企业中拥有大量的服务器集群,但一般来讲,系统管理非常规范,不会有太多不同的系统,因此不太需要KVM这种非常重型的虚拟化方案。他们 要解决的问题是如何能最经济地减少CPU的空闲。这也是Joyent虚拟化方案的主要应用场景,它希望的是客户在它的IaaS上构建某种服务。客户在意的 是弹性和隔 离,Joyent在意的是成本。
这与大部分互联网企业的内部需求非常相似。在这种场景下真的没有必要使用KVM等重型方案。给大家提个醒,OpenStack也是支持LXC作为Hypervisor的,不过支持得还不是很好。
要强调的一点是,这几种技术都有个美中不足之处,那就是不支持热迁移。当然,既然提到了这一点肯定就是有人实现了热迁移,那就是OpenVZ。 OpenVZ 也算是老牌的容器项目了,说句比较公道的话,目前OpenVZ还是要比LXC成熟、好用些,但它的命运有点儿像Xen,终究不是嫡系。虽然目前在欧美 VPS市场占据绝对主导地位,但最终被LXC取代也是可以预见的。其他各路人马也正在加班加点实现热迁移这一非常重要的特性,且看谁能夺冠就是了。
DTrace
对PaaS平台来说,一个超级调试工具是不可或缺的。DTrace可以实现动态跟踪服务,解决开发者所关心的各种问题。我们其实可以用标签来描 述DTrace:可在生产环境下跟踪系统的方方面面(功能和性能)——能跟踪用户的服务、开销十分小、支持容器模型。目前,操作系统和软件已经非常复杂, 尤其是虚拟化以后就更加复杂了。系统内部究竟发生了什么,对于用户来讲似乎根本是无从知道的。而摆在PaaS开发者面前的问题则是,不但要清楚地知道自己 的服务瓶颈在哪里,还要知道使用PaaS的应用有哪些问题,以便对用户提供良好的支持。
DTrace这种工具,让系统再一次透明地展现在我们面前,让我们能够清楚地知道整个系统各个层面的所有信息。这些信息对于调试那种原来我们最 为头痛的瞬态,以及几乎无法复现的线上Bug起着至关重要的作 用。DTrace非常彻底地解决了一个核心问题:系统到底在什么时刻做了什么。这对于解决有些不确定因素的系统是特别有帮助的,比如不可人工干预的垃圾收 集调度器。
相应的,Linux也有其超级调试工具——SystemTap。这种工具目前得到了非常多开源项目的大力支持。10月SystemTap迎来了 它的2.0版本,也算是标志性事件。不过SystemTap真的是晚了好几年啊。DTrace为Sun的各种系统的成熟与稳定都立下了汗马功劳,包括最著 名的ZFS和JVM。ZFS也不是一诞生就天下无敌的,它也遇到过类似今天EXT4这些焦头烂额的问题。关键是这些问题解决得早。要是SystemTap 再早3年,没准Linux的文件系统能成熟不少呢。
我这里也建议很多与Linux系统打交道比较多的同行,尽快投入SystemTap的怀抱,早早放弃落后腐朽的调试方式。SystemTap前 途光明,毕竟它是Red Hat的亲儿子,Linux阵营中只要是Red Hat亲儿子的一般都能成为高富帅,何况还有IBM的支持,也算是有个白富美的妈。
ZFS
说ZFS是目前最彪悍的文件系统恐怕不会有多少人反对。它不但将传统的文件系统和卷管理合二为一,还提供了诸多对云计算特别有帮助的特性,比如快照和克隆、数据校验、数据压缩、数据去重。
快照可以快速且一致地保存数据的状态,可以随时回滚数据,也可以使服务回滚到任何想要的时刻。快照开销非常小,这使得用快照来做常规备份成为一 种可能。克隆则可以在短时间内生成大量服务实例,对那些使用PaaS的用户,有什么比等待应用启动更让人着急的呢。因此必须一个瞬间就为用户提供所需要的 租户空间。
将PaaS提供给用户后,其上会有海量的应用,这些应用会引用很多第三方库,而这其中有很多库是被重复使用的。比如很多展示类的网站都使用了同 一个缩放图片的库。这时要是文件系统能将这些重复自动合并,则可以大大降低存储的成本。包括上面的大量克隆也是需要强有力的数据去重的。至于数据的压缩和 校验,也不失为一种降低数据存储成本的途径。云时代存储价格低廉才有竞争力嘛!
来自:原文链接