探索GAE背后的奥秘之Google的核心技术

本系列文章基于公开资料对Google App Engine的实现机制这个话题进行深度探究。在切入Google App Engine之前,首先会对Google的核心技巧和其整体架构进行阐发,以赞助大年夜家之后更好地舆解Google App Engine的实现。

本篇将主要先容Google的十个核心技巧,而且可以分为四大年夜类:

散播式根基举措措施:GFS、Chubby 和 Protocol Buffer。

散播式大年夜规模数据处置惩罚:MapReduce 和 Sawzall。

散播式数据库技巧:BigTable 和数据库 Sharding。

数据中间优化技巧:数据中间高温化、12V电池和办事器整合。

散播式根基举措措施

GFS

因为搜索引擎必要处置惩罚海量的数据,以是Google的两位开创人Larry Page和Sergey Brin在创业初期设计一套名为”BigFiles”的文件系统,而GFS(全称为”Google File System”)这套散播式文件系统则是”BigFiles”的延续。

首先,先容它的架构,GFS主要分为两类节点:

Master节点:主要存储与数据文件相关的元数据,而不是Chunk(数据块)。元数据包括一个能将64位标签映射到数据块的位置及其组成文件的表格,数据块副本位置和哪个进程正在读写特定的数据块等。还有Master节点会周期性地接管从每个Chunk节点来的更新(”Heart-beat”)来让元数据维持最新状态。

Chunk节点:顾名思义,肯定用来存储Chunk,数据文件经由过程被瓜分为每个默认大年夜小为64MB的Chunk的要领存储,而且每个Chunk有独逐一个64位标签,并且每个Chunk都邑在全部散播式系统被复制多次,默觉得3次。

下图便是GFS的架构图:

图1. GFS的架构图(参片[15])

接着,在设计上,GFS主要有八个特征:

大年夜文件和大年夜数据块:数据文件的大年夜小普遍在GB级别,而且其每个数据块默认大年夜小为64MB,这样做的好处是削减了元数据的大年夜小,能使Master节点能够异常方便地将元数据放置在内存中以提升造访效率。

操作以添加为主:由于文件很少被删减或者覆盖,平日只是进行添加或者读取操作,这样能充分斟酌到硬盘线性吞吐量大年夜和随机读写慢的特征。

支持容错:首先,虽然当时为了设计方便,采纳了单Master的规划,然则全部系统会包管每个Master都邑有其相对应的复制品,以便于在Master节点呈现问题时进行切换。其次,在Chunk层,GFS已经在设计上将节点掉败视为常态,以是能异常好地处置惩罚Chunk节点掉效的问题。

高吞吐量:虽然其单个节点的机能无论是从吞吐量照样延迟都很通俗,但由于其支持上千的节点,以是总的数据吞吐量是异常惊人的。

保护数据:首先,文件被瓜分成固定尺寸的数据块以便于保存,而且每个数据块都邑被系统复制三份。

扩展能力强:由于元数据偏小,使得一个Master节点能节制上千个存数据的Chunk节点。

支持压缩:对付那些稍旧的文件,可以经由过程对它进行压缩,来节省硬盘空间,并且压缩率异常惊人,无意偶尔以致靠近90%。

用户空间:虽然在用户空间运行在运行效率方面稍差,然则更便于开拓和测试,还有能更好使用Linux的自带的一些POSIX API。

现在Google内部至少运行着200多个GFS集群,最大年夜的集群有几千台办事器,并且办事于多个Google办事,比如Google搜索。但因为GFS主要为搜索而设计,以是不是很得当新的一些Google产品,比YouTube、Gmail和更强调大年夜规模索引和实时性的Caffeine搜索引擎等,以是Google已经在开拓下一代GFS,代号为”Colossus”,并且在设计方面有许多不合,比如:支持散播式Master节点来提升高可用性并能支撑更多文件,Chunk节点能支持1MB大年夜小的chunk以支撑低延迟利用的必要。

Chubby

简单的来说,Chubby 属于散播式锁办事,经由过程 Chubby,一个散播式系统中的上千个client都能够对付某项资本进行”加锁”或者”解锁”,常用于BigTable的协作事情,在实现方面是经由过程对文件的创建操作来实现”加锁”,并基于闻名科学家Leslie Lamport的Paxos算法。

Protocol Buffer

Protocol Buffer,是Google内部应用一种说话中立、平台中立和可扩展的序列化布局化数据的要领,并供给 Java、C++ 和 Python 这三种说话的实现,每一种实现都包孕了响应说话的编译器以及库文件,而且它是一种二进制的款式,以是其速率是应用 Thrift ,而且 Facebook 号称Thrift在速率上还有必然的上风。

散播式大年夜规模数据处置惩罚

MapReduce

首先,在Google数据中间会有大年夜规模数据必要处置惩罚,比如被收集爬虫(Web Crawler)抓取的大年夜量网页等。因为这些数据很多都是PB级别,导致处置惩罚事情不得不尽可能的并行化,而Google为了办理这个问题,引入了MapReduce这个编程模型,MapReduce是源自函数式说话,主要经由过程”Map(映射)”和”Reduce(化简)”这两个步骤来并行处置惩罚大年夜规模的数据集。Map会先对由很多自力元素组成的逻辑列表中的每一个元素进行指定的操作,且原始列表不会被变动,会创建多个新的列表来保存Map的处置惩罚结果。也就意味着,Map操作是高度并行的。当Map事情完成之后,系统会先对新天生的多个列表进行清理(Shuffle)和排序,之后会这些新创建的列表进行Reduce操作,也便是对一个列表中的元素根据Key值进行适当的合并。

下图为MapReduce的运行机制:

图2. MapReduce的运行机制(参[19])

接下来,将根据上图来举一个MapReduce的例子:比如,经由过程搜索Spider将海量的Web页面抓取到本地的GFS集群中,然后Index系统将会对这个GFS集群中多个数据Chunk进行平行的Map处置惩罚,天生多个Key为URL,value为html页面的键值对(Key-Value Map),接着系统会对这些刚天生的键值对进行Shuffle(清理),之后系统会经由过程Reduce操作来根据相同的key值(也便是URL)合并这些键值对。

着末,经由过程MapReduce这么简单的编程模型,不仅能用于处置惩罚大年夜规模数据,而且能将很多繁琐的细节暗藏起来,比如自动并行化,负载均衡和机械宕机处置惩罚等,这样将极大年夜地简化法度榜样员的开拓事情。MapReduce可用于包括”散播grep,散播排序,web造访日志阐发,反向索引构建,文档聚类,机械进修,基于统计的机械翻译,天生Google的全部搜索的索引”等大年夜规模数据处置惩罚事情。Yahoo也推出MapReduce的开源版本Hadoop,而且Hadoop在业界也已经被大年夜规模应用。

Sawzall

Sawzall可以被觉得是构建在MapReduce之上的采纳类似Java语法的DSL(Domain-Specific Language),也可以觉得它是散播式的AWK。它主要用于对大年夜规模散播式数据进行筛选和聚合等高档数据处置惩罚操作,在实现方面,是经由过程说冥器将其转化为相对应的MapReduce义务。除了Google的Sawzall之外,yahoo推出了相似的Pig说话,但其语法类似于SQL。

散播式数据库技巧

BigTable

因为在Google的数据中间存储PB级以上的非关系型数据时刻,比如网页和地舆数据等,为了更好地存储和使用这些数据,Google开拓了一套数据库系统,名为”BigTable”。BigTable不是一个关系型的数据库,它也不支持关联(Join)等高档SQL操作,取而代之的是多级映射的数据布局,并是一种面向大年夜规模处置惩罚、容错性强的自我治理系统,拥有TB级的内存和PB级的存储能力,应用布局化的文件来存储数据,并每秒可以处置惩罚数百万的读写操作。

什么是多级映射的数据布局呢?便是一个稀疏的,多维的,排序的Map,每个Cell由行关键字,列关键字和光阴戳三维定位.Cell的内容是一个不解释的字符串,比如下表存储每个网站的内容与被其他网站的反向连接的文本。 反向的URL com.cnn.www是这行的关键字;contents列存储网页内容,每个内容有一个光阴戳,由于有两个反向连接,以是archor的Column Family有两列:anchor: cnnsi.com和anchhor:my.look.ca。Column Family这个观点,使得表可以轻松地横向扩展。

下面是它详细的数据模型图:

图3. BigTable数据模型图(参[4])

在布局上,首先,BigTable基于GFS散播式文件系统和Chubby散播式锁办事。其次BigTable也分为两部分:其一是Master节点,用来处置惩罚元数据相关的操作并支持负载均衡。其二是tablet节点,主要用于存储数据库的分片tablet,并供给响应的数据造访,同时Tablet是基于名为SSTable的款式,对压缩有很好的支持。

图4. BigTable架构图(参[15])

BigTable正在为Google六十多种产品和项目供给存储和获取布局化数据的支撑平台,此中包括有Google Print、 Orkut、Google Maps、Google Earth和Blogger等,而且Google至少运行着500个BigTable集群。

跟着Google内部办事对需求的赓续前进和技巧的赓续地成长,导致本来的BigTable已经无法满意用户的需求,而Google也正在开拓下一代BigTable,名为”Spanner(扳手)”,它主要有下面这些BigTable所无法支持的特点:

支持多种数据布局,比如table,familie,group和coprocessor等。

基于分层目录和行的细粒度的复制和权限治理。

支持跨数据中间的强同等性和弱同等性节制。

基于Paxos算法的强同等性副本同步,并支持散播式事务。

供给许多自动化操作。

强大年夜的扩展能力,能支持百万台办事器级其余集群。

用户可以自定义诸如延迟和复制次数等紧张参数以适应不合的需求。

数据库Sharding

Sharding便是分片的意思,虽然非关系型数据库比如BigTable在Google的天下中占领异常紧张的职位地方,然则面对传统OLTP利用,比如广告系统,Google照样采纳传统的关系型数据库技巧,也便是MySQL,同时因为Google所必要面对流量异常伟大年夜,以是Google在数据库层采纳了分片(Sharding)的水平扩展(Scale Out)办理规划,分片是在传统垂直扩展(Scale Up)的分区模式上的一种提升,主要经由过程光阴,范围和面向办事等要领来将一个大年夜型的数据库分成多片,并且这些数据片可以超过多个数据库和办事器来实现水平扩展。

Google整套数据库分片技巧主要有下面这些优点:

扩展性强:在Google临盆情况中,已经有支持上千台办事器的MySQL分片集群。

吞吐量惊人:经由过程伟大年夜的MySQL分片集群能满意巨量的查询哀求。

举世备份:不仅在一个数据中间照样在举世的范围,Google都邑对MySQL的分片数据进行备份,这样不仅能保护数据,而且方便扩展。

在实现方面,主要可分为两块:其一是在MySQL InnoDB根基上添加了数据库分片的技巧。其二是在ORM层的Hibernate的根基上也添加了相关的分片技巧,并支持虚拟分片(Virtual Shard)来便于开拓和治理。同时Google也已经将这两方面的代码提交给相关组织。

数据中间优化技巧

数据中间高温化

大年夜中型数据中间的PUE(Power Usage Effectiveness)普遍在2阁下,也便是在办事器等谋略设备上耗1度电,在空调等帮助设备上也要耗损一度电。对一些异常出色的数据中间,最多也就能达到1.7,然则Google经由过程一些有效的设计使部分数据中间到达了业界领先的1.2,在这些设计傍边,此中最有特色的莫过于数据中间高温化,也便是让数据中间内的谋略设备运行在偏高的温度下,Google的能源方面的总监Erik Teetzel在谈到这点的时刻说:”通俗的数据中间在70华氏度(21摄氏度)下面事情,而我们则保举80华氏度(27摄氏度)”。然则在前进数据中间的温度方面会有两个常见的限定前提:其一是办事器设备的崩溃点,其二是正确的温度节制。假如做好这两点,数据中间就能够在高温下事情,由于假设数据中间的治理员能对数据中间的温度进行正负1/2度的调节,这将使办事器设备能在崩溃点5度之内事情,而不是常见的20度之内,这样既经济,又安然。还有,业界传言Intel为Google供给抗高温设计的定制芯片,但云谋略界的顶级专家James Hamilton觉得不太可能,由于虽然处置惩罚器也异常畏惧热量,然则与内存和硬盘比拟照样强很多,以是处置惩罚器在抗高温设计中并不是一个核心身分。同时他也异常支持使数据中间高温化这个设法主见,而且期望将来数据中间以致能运行在40摄氏度下,这样不仅能节省空调方面的资源,而且对情况也很有利。

12V电池

因为传统的UPS在资本方面对照挥霍,以是Google在这方面另辟途径,采纳了给每台办事器配一个专用的12V电池的做法来调换了常用的UPS,假如主电源系统呈现故障,将由该电池认真对办事器供电。虽然大年夜型UPS可以达到92%到95%的效率,然则比起内置电池的99.99%而言是异常捉襟见肘的,而且因为能量守恒的缘故原由,导致那么未被UPS充分使用的电力会被转化成热能,这将导致用于空调的能耗响应地攀升,从而走入一个恶性轮回。同时在电源方面也有类似的”神来之笔”,通俗的办事器电源会同时供给5V和12V的直流电。然则Google设计的办事器电源只输出12V直流电,需要的转换在主板长进行,虽然这种设计会使主板的资源增添1美元到2美元,然则它不仅能使电源能在靠近其峰值容量的环境下运行,而且在铜线上传输电流时效率更高。

办事器整合

谈到虚拟化的杀手锏时,第一个让人想到肯定是办事器整合,而且普遍能实现1:8的整合率来低落各方面的资源。有趣的是,Google在硬件方面也引入类似办事器整合的设法主见,它的做法是在一个机箱大年夜小的空间内放置两台办事器,这些做的好处有很多,首先,减小了占地面积。其次,经由过程让两台办事器共享诸如电源等设备,来低落设备和能源等方面的投入。

文章滥觞:http://www.dbanotes.net/arch/google_app_engine_arch.html

您可能还会对下面的文章感兴趣: