一个周末掌握IT前沿技术之node.js篇<七>:Node.js与HBase

这时,陆地上升起了山一般的云,海岸成了一长条绿色的线,背后映衬着几座灰蓝色的小山。此时,海水已经变成了深蓝色,深得几乎发紫。
——《老人与海》


前面我们围绕着Node.js学习了新兴IT公司快速构建高性能的web应用服务产品会用到一些前沿技术元素(JavaScript、redis、Nginx、HTML5、JQuery、Ajax)。文中提供的每一个例程都希望你能亲手实现,每一个例程的设计都是为了帮助我们深入地理解这些前沿技术。如果这些都是你以前没有深入接触过的概念,现在你只花了两天的时间,通过实现例程理解并掌握了这些技术,那么你就是一个高效学习者,是网络时代最稀缺的人才。你的稀缺性并不是来自于你所掌握的前沿技术,而是来自于你下定决心出发时那坚实而又轻盈的步伐。在这个(xbtech.hr#gmail.com)邮箱中收到你的简历,是一件多么令人兴奋的事情!

这是本篇的最后一章,我们讨论云计算。在这一章里,我们将不去实现复杂的例程,更多的是介绍一些概念。我们会收集一些理解这些概念需要的资料,本章链接中都是很新或者很经典的相关学习材料,希望大家都点过去看一看。云计算是在互联网高速发展的技术需求驱动中一些服务端网络服务技术的进步。人类的进步,除了思想、体制、流程以外,最有推动力量的是工具的进步。云计算就是一些工具进步的合集。这些进步是系统性的,我们可以列出其中主要的一部分:
(1).硬件虚拟化可以更高效地利用硬件(VMware)。
(2).分布式文件系统可以存储海量信息(GFS/HDFS)。
(3).协同计算机制可以处理海量信息(MapReduce)。
(4).分布式数据库可以让海量结构化半结构化信息持久化(BigTable/Hbase)。
(5).分布式锁机制可以更高效地保证分布式异步逻辑的一致性(Chubby/ZooKeeper)。
云计算进步的实质是马克思提出的“按需供应”,是对一些稀缺资源“按需供应”高效利用,降低这些资源的边际成本。这些资源包括:存储资源,计算资源,结构化存储资源,流量带宽资源,信息流资源。


七. Node.js与 云计算


当使用Noed.js构建的高性能web应用服务器需要存储大量的文件或半结构化的信息时,我们应该使用云计算。Node.js连接和使用它们并不复杂。


7.1 Node.js与 云存储


在第二章我们曾说过,如果要快速搭建一个十万级用户的应用,以极低的成本制作一个能展示产品最主要特色的最简化可实行产品(Minimum Viable Product)的话,采用Nginx-RESTful-Node.js架构,只需要把文件直接存在服务器硬盘上,半结构化的数据放在redis里就行了。redis提供数据的高速响应和持久化,Nginx提供静态文件和负载均衡,Node.js服务器响应RESTful-API为web客户端提供服务。可以把这样的架构部署到一台普通PC机上,甚至于是windows操作系统。这么做的代价就是不能使用epoll这种强大的多路复用IO接口,因为微软往往滞后于技术发展的脚步。一个产品的成功不是因为其功能多么强大,而是能够牢牢抓住了用户的需求,把用户体验做到近乎完美,产品无懈可击。如果我们的这个最简化可实行产品满足前面这个条件,它将榨干这台PC机的所有硬件资源。当PC机的CPU温度高达90摄氏度,硬盘发出割草机一样的声音时,我们有必要看看下面收集的一些资料。

(1).分布式文件系统
Facebook发展的初期就遇到过这样的情况。那时Facebook只有一台服务器,并且放置在创始人马克·扎克伯格(MarkZuckerberg)位于大学的宿舍里,却一度导致哈佛校园网的瘫痪。这些年由于高速的发展和强大的技术需求,Facebook成为了web技术发展最强大的推动力。今天在俄勒冈州普利恩维尔市Facebook将建成号称是全球能效最高的数据中心。数据中心4.5亿美元,虽然耗资巨大,但和它的市值800亿美元比起来,Facebook仍然是轻资产公司。下面这篇文章可以让我们了解Facebook的数据中心。
《Facebook数据中心方案展示》
在Facebook的数据中心有大约10万服务器服务器为全球接近10亿的用户提供服务。facebook为用户存储了超过150亿张照片和大量的数据,为了这种巨大的技术需求,facebook建立了一些最先进的技术架构,比如说Haystack、HipHop、BigPipe、Cassandra、Thrift等等。阅读下面两篇文章。
《Facebook 架构学习》
《Facebook图片存储架构的学习》
巨大的需求和自由的思想是推动技术创新的根源,正因为如此facebook代表着现代IT技术进步的方向。从facebook技术孕育出的新兴社交问答网站Quora,更多地吸收了facebook技术的精华。下面这篇文章提到的技术,对于新兴web应用很有价值。
《Quora用了哪些技术?》
在facebook之前,IT技术的发展主要是由Google推动的。下面文章中提到的技术值得我们消化吸收。
《Google的十个核心技术》
当时的Google为了支持全世界用户的访问,完成对全世界互联网信息的处理,对超大规模分布式服务器集群产生了强大的技术需求。这可不是十台八台装了IIS6.0服务器所能完成的任务,而Google的天才工程师们完美地完成了这些任务,也为全世界贡献了强大的技术思想。下面3篇来自Google的论文,奠定了现代云计算技术发展的基础,也是学习云计算的必读材料。

微盘下载地址:2003年《Google File System》,2004年《MapReduce》,2006年《BigTable》,感谢@alex的中文翻译《Google_三大论文中文版》

这些云基础设施,开源世界也有它们相应的实现。它是Apache的顶级项目《Hadoop》,Tom White为它写了一部很好的教程。

微盘下载地址:《Hadoop权威指南(第2版)英文版》《Hadoop权威指南(第2版)中文版》

Hadoop的HDFS是现在被广泛应用的分布式文件系统,它可以提供低成本、高性能、可扩展的海量文件存储能力。这种能力,被人们称为云存储。亚马逊的简单存储服务Amazon Simple Storage Service (Amazon S3)简称S3,推动了云存储技术的实用化。基于S3开发的文件同步应用DropboxY Combinator孵化出的最成功的产品。

很多NoSQL数据库也是构建在分布式文件系统之上,利用分布式文件做数据的持久化。

(2).NoSQL数据库
facebook需要每个月存储1350亿条信息。其中,大约1200亿条即时消息,信息容量11TB;150亿篇文章,信息容量14TB。如何高效低存储和处理这些信息,facebook的答案是HBase。下面是一篇来自facebook的PPT分享了这些信息。
《Facebook-Messages-and-HBase.pdf》
在2.1节我们讨论过五大数据库模型。在五大数据库模型中,除了关系模型数据库,其他的都被称为NoSQL。我们可以列出一些常见的NoSQL数据库,面向键值对的(Voldemort,Dynomite等),面向Column Family的(BigTable,HBase,Hypertable等),面向文档的(Couch DB,MongoDB等),面向图的(Neo4j, Infogrid等)。其中HBase,Hypertable,MongoDB等,满足一致性和可用性的数据分布模型;而facebook的Cassandra则满足可用性和可分区性。下面这篇比较偏理论性的文章介绍了它们的生态系统。
《NoSQL生态系统》
如果想体验一下NoSQL数据库,可以利用Hadoop4Win在Windos系统下一键安装单机版的HBase。

下载地址:{官网} {微盘}

Lars George为HBase写了一部很好的教程,还没有中文版。

微盘下载地址:《HBase权威指南(第2版)英文版》

与RDBMS不同,NoSQL需要通过数据冗余的方式实现在RDBMS中的不同表格之间的关系表达。关于HBase数据模型和schema设计,下面的这篇文章讲的比较详细。
《Bigtable/HBase类NoSQL数据库系统选型策略和schema设计原则》
与HBase类似,但是是由C++实现的Hypertable,也可以在Windos系统下一键安装。它的安装程序只有7MB。

下载地址:{官网} {微盘}

NoSQL数据库常见的接口有:
<1>.RESTful API(HBase,CouchDB,Riak等);
<2>.MapReduce(HBase,CouchDB,MongoDB,Hypertable等);
<3>.文本接口Get/Put(redis,Scalaris等);
<4>.Thrift(HBase,Hypertable,Cassandra等)。

Node.js既可以通过Thrift接口访问HBase,也可以通过RESTful API接口。通过RESTful API接口有现成的模块node-hbase访问HBase非常方便。
项目主页:《node-hbase》

题外讨论:《复杂与简单》

我们前面多次提到Thrift,Thrift是由Facebook开源的一个RPC框架,用来进行可扩展且跨语言的服务的开发,使得各种编程语言间无缝结合的、高效的服务。我们依据Thrift的规范简单定义访问接口,通过Thrift编译器编译生成各种编程语言代码,实现各种语言模块之间的高效互访问,速度比Google的Protocol Buffers还要快。Thrift可以说它是现在最优秀的分布式通信机制,实现了在大型分布式集群中各独立模块之间的高效协同。

掌握如此强大的Thrift却是一件轻松愉悦的事。在它的{官网}阅读相应的例程和文档,以你的学习能力,几个小时就可以熟悉掌握,并相应的设计和编程。如果你继续钻研,一两天之内就可以达到专家水平。在20世纪90年代出现的CORBA,也是一个RPC框架。在当时它也是最优秀的分布式通信机制之一,比起微软的DCOM有很多优势。即使这样,CORBA却过于复杂,要熟悉CORBA,并进行相应的设计和编程,需要许多个月来掌握,而要达到专家水平,则需要好几年。

回过头我们来看,从CORBA到Thrift的发展过程,是一个从复杂到简单的演进过程。这个过程是普遍性的。由于技术需求的驱动,首先,人们将简单的东西组合、拼接、堆砌和改良,实现更丰富的功能,满足发展中的需求;接下来随着进一步需求的出现,人们会发现用这些东西来满足需求变得越来越复杂,人们就会把以前的各种组合、拼接、堆砌和改良系统性地整合起来,形成一个内部复杂而表面简单的东西。人们再拿这些简单的东西去组合、拼接、堆砌和改良一个更加丰富的世界。

随着数据量和访问量的增长,每一个以(PHP+MySQL+Memcached)为构架的神奇的网站,都会从单台DB,发展到主从复制,再到垂直分区,最后到水平分区。原理貌似很简单,但是真正做起来,却是一个极其痛苦的过程。

1: PHP + MySQL
2: PHP + MySQL (Master + Slaves)
3: PHP + MySQL (Master + Slaves) + Memcached (Middleware)
4: PHP + MySQL (Sharding + Master + Slaves) + Memcached (Middleware)
5: PHP + MySQL (Sharding + Master + Slaves) + Memcached (Middleware) + NoSQL

我们在第一章中讨论了《Web开发的复杂性》。其实每一个技术领域都是如此,都可以套用下面这段描述。“如果你知道XXXX的话,根本没那么简单。你只是XX,所有这些都是通过XX,都经过X1,X2,X3,X4……的处理。实际上背后的技术异常复杂,以至于任何工程师多想一点的话都会眼花缭乱,以至于没有任何一家公司可以单独应对整个问题的复杂性。”

没有任何方法能够阻止复杂性的增长,但我们可以实践下面两条规则减缓复杂性的发生:

正交性:每一个动作(无论是API调用,宏调用或者语言运算)只改变一件事情,不会影响其他。正交性教给我们:做,并且只做好一件事情。
组合性:要编写复杂软件又不至于一败涂地的唯一方法,就是用定义清晰的接口把若干简单的模块组合起来。要追求代码的透明,最有效的方法很简单,不要在具体操作的代码上叠放太多的抽象层。

借用尼采的一句话,一切美好的事物都是曲折地接近自己的目标,一切笔直都是骗人的,所有真理都是弯曲的,时间本身就是一个圆圈。我们只能在细节中追求复杂的精致,在系统中追求简单的完整。

我们的应用服务可能没有每个月存储1350亿条信息的需求,但是一个低成本、高性能、扩展性良好的服务器体系,可以让我们更轻松地应对网络时代快速变化的挑战。在上一章中,我们曾提出一个简单的高性能服务器架构。我们使用Nginx做前端负载均衡,将动态的RESTful API请求交给Node.js服务器处理,而静态文件直接从文件系统中提供。当需要为用户提供更大量的静态数据和流式数据时,我们可能会用到云存储。我们可以先将服务器动态数据持久化到redis中,当数据量持续增大时,我们可能会需要NoSQL数据库的辅助。这样的服务器架构是可扩展的。


7.2 Node.js与 未来

在这里,我们所有围绕Node.js的讨论就完成了。我们可以使用JavaScript控制浏览器端,操作服务器端,连接数据库,连接云服务等等。JavaScript除了这些能力,还可以通过PhoneGap这样的平台访问移动设备的硬件资源,例如GPS、加速计、摄像头、触摸屏交互、触摸手势、振动等等。就像JavaScript的各种特性饱受争议一样,我们不敢肯定JavaScript会颠覆什么,但是JavaScript的运用范围会越来越广,这就是趋势。

应用程序web化,是这个趋势中重要的一部分。国外的Web服务开发商Sencha Inc,不仅提供了Sebcha Touch这样的移动应用开发框架,还提供了基于HTML5的云服务应用Sencha.io。这个云服务应用包括4部分,Sencha.io Data、Sencha.io Messages、Sencha.io Login和Sencha.io Development,有了这个服务,应用开发者只需几行Javascript代码就可以实现云储存数据、发送消息、统一登录和部署应用程序等功能。

其实世界并不需要什么技术的技术,只是需要更多能给人们带来愉悦感的产品。技术研发需要围绕提升产品愉悦感这个核心进行。任他风起云涌,我自波澜不惊。Sencha很好地做到了这一点。它没有同质化地推出“云盘”、“同步盘”这样的云服务产品,而是为Web应用提供云存储服务,致力于建立新一代Web云应用的基础设施。系统性地建立基础设施的工程是艰苦卓绝的,但正如亚马逊的CEO贝索斯说的那样,如果你的经营规划只有3年,那么你就要同很多人竞争,如果你有未来7年的发展规划,那么你的竞争对手就会少很多,因为很少有人会立足于长远的发展。

现在在国内,开放平台是各大互联网公司的标准配置,而云计算式各大开放平台的标准配置。我们听说的阿里云、腾讯云、百度云、新浪云……开放平台的核心在于开放、包容、共赢。Facebook的成功已经充分地证明了它的价值。亚马逊是世界上最好的云服务提供商,除了技术外,它的一些思想理念更值得我们汲取借鉴。亚马逊目光长远,它使用望远镜观察5到10年的技术发展趋势,系统性布局,形成了今天亚马逊在很多领域不可动摇的地位。亚马逊注重细节,它使用显微镜优化每一个流程和技术细节,扎扎实实推进,形成了今天亚马逊深受赞誉的用户见证。

国内的各个开发平台对于国内互联网生态环境的健康发展起到了积极的贡献。更加地开发包容,推动基础设施的建设,必将推进各方面的共同成长。我们希望将更加欣喜地看到Node.js、Neo4j、Riak、Heroku、Cloud9等等这样一些新兴的技术元素被各个开放平台陆续支持。我们更加愿意看到一些新兴的技术和动人的产品,是由中国人创造。

中国在这方面是有独特的优势的。中国将是世界上最大的市场,也将产生最大的需求。我们一直都以为需求是推动技术创新最大的动力。为什么Google和Facebook相继成为技术创新最主要的推动力量,那是因为它的产品和服务需要满足全世界人们对它的需求。在Facebook当有些事需要被执行时,大家才会去完成。人们在自由思想的驱使下,不断地去追求技术的进步和产品的成功。我们不像印度人那样固步自封、安贫乐道,虽然生活简朴却不思进取。在我们的观念中,自由开放和包容越来越多地被认可,再加上我们自强不息的民族精神,形成了强大的改变现状的动力。在互联网领域的自由和机会均等是world wide的,如果你要改变世界,那么现在就出发吧!

本文目录:《一个周末掌握IT前沿技术之node.js篇》
1.《Node.js与javascript》
2.《Node.js与redis》
3.《Node.js与服务端模板引擎》
4.《Node.js与Restful API》
5.《Node.js与Nginx》
6.《Node.js与客户端模板引擎》
7.《Node.js与HBase》
文本粗陋,欢迎斧正!欢迎投稿!原创文章,转载请链接。
联系邮箱:(it.Web.technical#gmail.com)
IT技术精研院
原文地址:https://www.cnblogs.com/joe1545134/p/node-js-and-hbase.html