Google 的云计算产品
从云计算角度而言,几乎Google 的所有产品都可以被认为是典型的云计算产品。因为
Google 本身就是世界上最大的云,在全球有30 多个数据中心,服务器的总数超过100 万台,
而且在运营效率和自动化管理程度这两个非常重要的云指标上也是独领风骚的,并且这些产品
大都以Web 的形式发布。
SaaS 层
在SaaS 层,Google 的云服务主要可分为两大部分:其一是主要面向个人用户的普通SaaS
服务,其二是面对公司和机构的企业级SaaS 服务。
1. 普通SaaS服务
大多数Google 服务(包括最重要的搜索)都可以归为这类。
2. 企业级SaaS服务
超过200 万家企业已经购买了Google Apps 服务,而且每天新注册
的企业达数千个。Google Apps 主要包括6 大组件,下面将介绍这6 大组件所支持的特性和功
能。
企业版Gmail。每位用户都可获得容量达25GB 的存储空间,并提供强大的垃圾邮件过
滤,与黑莓和Outlook 之间的交互,以及99.9% 的正常运行时间可靠性保证。
Google 日历。基于网络的日历应用程序使员工可以有效地协作,并帮助降低成本和IT
负担,支持轻松简单的预约,共享项目日历,进行日历的同步,与电子邮件系统集成和
通过移动设备进行访问等功能。
Google 文档。可在线编辑和创建Word 文档、电子表格和演示文稿,并且支持多人之间
的协作编辑和强大的安全访问机制。
Google 网上论坛。用户可创建群组,提供邮件列表,轻松共享内容和搜索存档。
Google 协作平台。它是一种快速创建网页的工具,比较适合Intranet(内联网)和小
型团队项目,只需单击几下鼠标即可创建网页,无需编写任何代码,而且支持企业级
的安全控制
Google 视频。可以安全地托管和流化企业的视频,因此员工可随意地分享视频,也无
需因复杂的本地视频解决方案而加重企业IT 部门的负担。
PaaS 层
Google App Engine 提供一整套开发组件让用户轻松地在本地构建和调试网络应用,之后能
让用户在Google 强大的基础设施上部署和运行网络应用程序,并自动根据应用所承受的负载对
应用进行扩展,免去用户对应用和服务器等的维护工作。同时提供大量的免费额度和灵活的资
费标准。在开发语言方面,现支持Java 和Python 两种语言,并为这两种语言提供基本相同的
功能和API
IaaS 层
Google 只推出类似Amazon S3 的名为Google Storage 的云存储服务。
Google Storage 是一次构建在Google 基础设施之上的云服务,开发者可以非常容易地使
用其基于REST 模式的API,将他们的应用程序和Google Storage 连接起来。这些数据将保
存在若干机房内,所以将非常可靠。Google Storage 支持数据的强一致性,同时每个请求都可
以调用数百GB 的对象。开发者可以通过Web 管理界面或者 gsulti 这个开源的命令行工具来
管理他们的存储内容,比如新建存储库(Bucket)、新建文件夹、批量上传、批量删除和共享
文件等。
云客户端
Google 投入了大量的人力和物力在云客户端方面,并推出了Android、Chrome 和Chrome OS
这3 个产品。
在架构方面,Android 总体来说和传统PC 架构比较类似,但也有创新的地方,共可分为4
个层次。
应用程序层。以Java 为编程语言,Android 从接口到功能都有层出不穷的变化,其中
Activity 等同于J2ME 的MIDlet,一个Activity 类负责创建Window,一个活动中的
Activity 就是在前台(Foreground)模式,后台运行的程序叫作服务(Service)。两者之
间通过ServiceConnection 机制进行通信,从而实现多个程序同时运行的效果。如果运行
中的Activity 的全部画面都被其他Activity 所取代,该Activity 便被停止,甚至系统会
清除其所占用的资源。
中间件。它是操作系统与应用程序之间沟通的桥梁,分为两部分:函数库(Library)和
虚拟机(Virtual Machine)。在函数库方面,有作为改良libc 的Bionic,名为OpenCORE
的基础多媒体框架,名为skia 的内核图形引擎(它支持OpenGL/ES 规范)和SQLite 数
据库系统等。在虚拟机方面,采用了定制的Dalvik 虚拟机。Dalvik 虚拟机是一种“寄存
器型(Register Based)”的Java 虚拟机,变量皆存放于寄存器中,这使得虚拟机的指令
得到了一定程度的消减,对手机这种移动设备非常有帮助。Dalvik 虚拟机可以有多个实
例同时运行,每个Android 应用程序都用一个其专属的Dalvik 虚拟机来运行,让系统在
运行程序时达到优化。Dalvik 虚拟机不是运行Java 二进制代码,而是运行一种称为.dex
格式的文件。
硬件抽象层。Android 的硬件抽象层的作用是将Android 本身的框架与 Linux 的内核隔
开,从而降低对Linux 内核的依赖,以实现内核独立。Android 硬件抽象层目前以存根
(stub)的形式存在,本身是“.so”库,是一种类似代理的概念。Android 的运行时会向
硬件抽象层取得存根的动作,再以回调的方式执行这个动作。
操作系统。Android 是运行于Linux 内核之上的,但并不是传统的GNU/Linux。一般在
GNU/Linux 里支持的功能,Android 大都不支持。比如Cairo、X11、Alsa、FFmpeg、
GTK、Pango 及Glibc 等都被移除掉了,因为Android 为了达到商业应用的目的,必须
移除被严格的GNU GPL 所约束的部分。目前,Android 的Linux 内核中包括了安全、存
储器管理、进程管理、网络栈和驱动程序的模型等模块。
Google 的核心技术
a,分布式基础设施
一个健壮的分布式基础设施肯定离不开3 样东西:分布式文件系统、分布式锁机制和分布
式通信机制。Google 的分布式环境也不会例外,而GFS、Chubby 和Protocol Buffer 正好对应
着前面这3 样东西。
1. GFS
为了存储大量用于搜索引擎相关的海量数据,Google 的两位创始人Larry Page 和Sergey
Brin 在创业初期设计了一套名为BigFiles 的文件系统,而GFS 这套分布式文件系统则是BigFiles
的延续。
2. Chubby
简单地说,Chubby 属于分布式锁服务。通过Chubby,一个分布式系统中的上千个客户端
都能够对某项资源进行“加锁”或者“解锁”。它常用于BigTable 和MapReduce 等系统内部的
协作工作。在实现方面,它是通过对文件的创建操作来实现“加锁”,并在其内部采用了著名科
学家Leslie Lamport 的Paxos 算法。
在实现机制方面,Chubby 本身是一个分布式文件系统,提供了一些机制使得客户端可以在
Chubby 服务上创建文件并执行一些文件的基本操作。那么,Chubby 是怎样实现这样的“锁”
功能的呢?就是通过文件。Chubby 中的“锁”就是文件。创建文件其实就是进行“加锁”操作,
创建文件成功的那个服务器其实就是抢占到了“锁”。用户通过打开、关闭和读取文件,获取共
享锁或者独占锁,并且通过通信机制,向用户发送更新信息。
3. Protocol Buffer
Protocol Buffer 是Google 内部使用的一种语言中立、平台中立、可扩展的序列化结构数据
的方式,并提供基于Java、C++ 和Python 这3 种语言的实现(每一种实现都包含了相应语言的
编译器以及库文件),而且它是一种二进制的格式,所以其速度是使用XML 进行数据交换的10
倍左右。它主要用于两方面:其一是RPC(Remote Procedure Call,远程过程调用)通信,它
可用于分布式应用之间或者异构环境下的通信;其二是数据存储方面,因为它是自描述的,而
且压缩很方便,所以可用于对数据进行持久化(比如存储日志信息等),并可被MapReduce 程
序处理。与Protocol Buffer 比较类似的产品还有Facebook 的Thrift,Facebook 号称Thrift 在速
度上比Protocol Buffer 还有一定的优势。
b,分布式大规模数据处理
1. MapReduce
首先,在Google 数据中心中会有大规模数据需要处理,比如被网页爬虫(Web Crawler)
抓取的大量网页等。由于这些数据很多都是PB 级别的,所以处理工作不得不尽可能并行化。
而Google 为了解决这个问题,引入了MapReduce 这个编程模型。MapReduce 本身源自于函数
式语言,主要通过“Map”(映射)和“Reduce”(化简)这两个步骤来并行处理大规模的数据
集。首先,Map 会先对由很多独立元素组成的逻辑列表中的每个元素进行指定的操作,而原始
列表不会被更改,并且会创建多个新的列表来保存Map 的处理结果。也就意味着,Map 操作是
高度并行的。当Map 工作完成之后,系统会接着对新生成的多个列表进行清理(Shuffle)和排
序。之后会对这些新创建的列表进行Reduce 操作,也就是根据Key 值对一个列表中的元素进
行适当合并。
通过搜索引擎的
爬虫(Crawler)将海量的Web 页面从互联网中抓取到本地的分布式文件系统中,然后索引系
统将会对存储在这个分布式文件系统中海量的Web 页面进行平行的Map 处理,生成多个键为
URL、值为html 页面的键/值对(Key-Value Pair)。接着,系统会对这些刚生成的键/值对进行
清理。之后系统会通过Reduce 操作,根据相同的键值(也就是上面提到的URL)来合并这些
键/值对。
最后,通过MapReduce 这个简单的编程模型,不仅能处理大规模数据,而且能将很多烦琐
的细节隐藏起来,比如自动并行化、负载均衡和机器宕机处理等,这将极大地简化程序员的开
发工作。MapReduce 可用于处理分布grep、分布排序、Web 访问日志分析、反向索引构建、文
档聚类、机器学习、基于统计的机器翻译和生成Google 的整个搜索的索引等大规模数据。Yahoo
也推出了MapReduce 的开源版本Hadoop,而且Hadoop 在业界也已经被大规模使用。
2. Sawzall
Sawzall可以被认为是构建在MapReduce之上的采用类似Java语法的DSL(Domain-Specific
Language,领域特定语言),也可以被认为是分布式的AWK。它主要用于对大规模分布式数据
进行筛选和聚合等高级数据处理操作。在实现方面,它是通过解释器转化为相对应的Map-
Reduce 任务。除了Google 的Sawzall 之外,Yahoo 也推出了相似的Pig 语言,但其语法类似于
SQL。
c,分布式数据库技术
在数据存储方面,Google 的多种服务会有各自不同的需求,比如有些服务需要能存储海量
的数据,但在数据模型上则比较简单,所以有了BigTable 这个分布式数据库技术。同时有些服
务则需要使用SQL 语言,但在数据规模上也不小,所以有了MySQL Sharding 技术。