Google的技术构架(精⼼整理版)
⽹上看到的⼀篇关于GOOGLE技术架构的详细介绍。
了解云计算标杆Google的技术构架
⼀、前⾔
计算⽆疑是今年IT 技术界最热点的关键词之⼀。从⾕歌趋势分析来看,国际上Cloud
computing 是从2007 年中期开始成为整个业界关注的重点,在中国云计算是从2008 年开始
成为中国IT 界和通信界关注的核⼼。特别是,当中国移动2008 年开始关注 计算,并推动
中国移动相关的业务⽀撑系统、业务软件平台开始向 计算的平台迁移。使得整个中国IT
界、通信界的相关产业⼒量更加关注 计算,同时⼤家也开始意识到了 计算确实可以⼤⼤
的节省海量计算的总体拥有成本。
cloud computing 云计算
当业界谈到 计算的时候,都会第⼀个想到⾕歌 Google。我们⽇常在使⽤的Google
Search,Google Earth,Goolge Map,Google Gmail,Google Doc 等等业务都是Google 基于⾃
鉴真
⼰ 计算平台来提供的。Google 也是通过云计算的⽅式,⼤量的降低计算成本,使之业务死人出殡
更具有竞争⼒。
Google 原先企业初期阶段,获得的投资有限,只能⾃⼰攒机,但是很差的机器不可能
发挥服务器的性能和稳定性,于是只有去想该如何提⾼可靠性,如何利⽤很多"破烂"机器获
得更⾼的性能。这就有了云计算的雏形。
今天我们都知道Google 的规模,⽽如果我们不去认清 计算的强⼤,我们就不知道互
联⽹的未来和规则。Google 在98 年的时候被迫发现了这⼀规则,然后我们看到了聚合的⼒
量,今天微软、IBM、雅虎、百度、亚马逊这些企业看到了规则,于是开始进⼊ 计算领域。
所以我们研究 计算,可以系统剖析⼀下Google 的技术构架,这对于我们搭建⾃⼰⾃⾝的 计算平台有⽐较好的借鉴意义和标杆意义! ⼆、Google 的整体技术构架说明
由于Google 没有官⽅发布⼀个⾃⾝的技术构架说明。本⽂主要的信息都来⾃互联⽹中
对于Google ⽹络技术构架的分析,⼤量信息来⾃ 。
Google 最⼤的IT 优势在于它能建造出既富于性价⽐(并⾮廉价)⼜能承受极⾼负载的⾼
性能系统。因此Google 认为⾃⼰与竞争对⼿,如亚马逊⽹站(Amazon)、电⼦港湾(eBay)、微
软(Microsoft)和雅虎 (Yahoo)等公司相⽐,具有更⼤的成本优势。其IT 系统运营约为其他互
联⽹公司的60%左右。
同时Google 程序员的效率⽐其他Web 公司同⾏们⾼出50%~100%,原因是Google 已
经开发出了⼀整套专⽤于⽀持⼤规模并⾏系统编程的定制软件库。
从整体来看,Google 的 计算平台包括了如下的技术层次。
1)⽹络系统:包括外部⽹络(Exterior Network) ,这个外部⽹络并不是指运营商⾃⼰的
⾻⼲⽹,也是指在Google 计算服务器中⼼以外,由Google ⾃⼰搭建的由于不同地区/ 国
家,不同应⽤之间的负载平衡的数据交换⽹络。内部⽹络(Interior Network),连接各个Google ⾃建的数据中⼼之间的⽹络系统。 2)硬件系统:从层次上来看,包括单个服务器、整合了多服务器机架和存放、连接各
个服务器机架的数据中⼼(IDC)。
3)软件系统:包括每个服务器上⾯的安装的单机的操作系统经过修改过的Redhat Linux。
Google 计算底层软件系统 (⽂件系统GFS、并⾏计算处理算法 Mapreduce、并⾏数据库
Bigtable,并⾏锁服务Chubby Lock, 计算消息队列GWQ )
4)Google 内部使⽤的软件开发⼯具 Python、Java、C++ 等
5)Google ⾃⼰开发的应⽤软件Google Search 、Google Email 、Google Earth
三、Google 各个层次技术介绍
1、Google 外部⽹络系统介绍
当⼀个互联⽹⽤户输⼊ 的时候,这个URL请求就会发到Google DNS 解
析服务器当中去,那么Google 的DNS 服务器就会根据⽤户⾃⾝的IP 地址来判断,这个⽤
户请求是来⾃那个国家、那个地区。根据不同⽤户的IP 地址信息,解析到不同的Google 的
数据中⼼。
进⼊第⼀道防⽕墙,这次防⽕墙主要是根据不同端⼝来判断应⽤,过滤相应的流量。如
果仅仅接受 浏览器应⽤的访问,⼀般只会开放80 端⼝http,和443 端⼝https (通过SSL
加密)。将其他的来⾃互联⽹上的⾮Ipv4 /V6⾮80/443 端⼝的请求都放弃,避免遭受互联
⽹上⼤量的DOS 攻击。
据说Google 使⽤了思杰科技(Citrix Systems)的Netscaler 应⽤交换机来做web 应⽤
的优化。NetScaler 可将Web 应⽤性能加速⾼达5 倍。使⽤⾼级优化技术如动态缓存时,
或者当⽹络延迟或数据包丢失增⼤时,性能增益会更⾼。这⾥提到的http multiplexting 技术
是可以是进⾏ http 的每个ssion 分解开。从不同的后端服务器 (缓存)来获取内容,这
样可以⼤⼤提升web http 性能,同时有效降低后端web应⽤服务器的处理和联接压⼒。
油渍
在⼤量的web 应⽤服务器 (Web Server Farm)前,Google使⽤反向代理(Rever Proxy )
的技术。反向代理(Rever Proxy )⽅式是指以代理服务器来接受internet 上的连接请求,
然后将请求转发给内部⽹络上的服务器,并将从服务器上得到的结果返回给internet 上请求
连接的客户端,此时代理服务器对外就表现为⼀个服务器。
Google 使⽤的是Squid Cache 的软件⽅式来实现反向代理应⽤的,Squid Cache ⼀个流
⾏的⾃由软件(GNU 通⽤公共许可证)的代理服务器和Web 缓存服务器。Squid 有⼴泛的
⽤途,从作为⽹页服务器的前置cache 服务器缓存相关请求来提⾼Web 服务器的速度。
在Google web 应⽤服务器需要调⽤Google 内部存储的信息和资源的时候,在通过⼀个
防⽕墙进⼊内部的⽹络,来访问其他的基于⾃⾝GFS II 系统的应⽤服务和数据库。
2、Google 内部⽹络架构介绍
Google ⾃⼰已经建设了跨国的光纤⽹络,连接跨地区、跨国家的⾼速光纤⽹络。内部
⽹络已经都是 Ipv6 的协议在运⾏。⽹络中的路由交换设备主要还是来⾃Juniper,Cisco,
Foundry, HP 这四家公司。内部⽹关协议 (IRP)是基于OSPF(开放式最短路径优先)进⾏修改
的。在每个服务器机架内部连接每台服务器之间⽹络是100M 以太⽹,在服务器机架之间连
接的⽹络是1000M 以太⽹。
在每个服务器机架内,通过IP 虚拟服务器(IP Virtual Server)的⽅式实现传输层负载Linux
内核内的平衡,这个就是所谓四层LAN 交换。IPVS 使⼀个服务器机架中的众多服务成为基
于 Linux 内核虚拟服务器。这就像在⼀堆服务器前安装⼀个负载均衡的服务器⼀样。当
TCP/UDP 的请求过来后,使⼀ 服务器可以使⽤⼀个单⼀的IP 地址来对外提供相关的服务 ⽀撑。
3、Google 的⼤规模IDC 部署战略
Google 应该是⽬前世界上存储信息最多的企业了。⽽且还在⼀直不断的致⼒于将传统
信息仅可能的数字化。将这样海量的信息进⾏存储、进⾏处理。就需要⼤量的计算机服务器。
为了满⾜不断增长的计算需求。Google 很早就进⾏了全球的数据中⼼的布局。由于数据中
⼼运⾏后,⾯临的⼏个关键问题的就是充⾜电⼒供应、⼤量服务器运⾏后的降温排热和⾜够
的⽹络带宽⽀持。所以Google 在进⾏数据中⼼布局的时候,就是根据互联⽹⾻⼲带宽和电
⼒⽹的核⼼节点进⾏部署的,尽快考虑在河边和海边,想办法通过引⼊⾃然⽔流的⽅式来降
低降温排热的成本。
达拉斯(Dalles)是美国俄勒冈州北部哥伦⽐亚河 (Columbia river)岸上的⼀个城市,
Google 在Dalles 的边上拥有的30 英亩⼟地,他们在这⾥建⽴了⼏乎是世界上最⼤,性能最
好的数据中⼼。四个装备有 ⼤空调设施的仓库内,放置着数万台Internet 服务器,这些服
务器每天处理着数⼗亿条Google ⽹站传递给世界各个⾓落的⽤户的数据。
Google 达拉斯这个数据中⼼占⽤了附近⼀个180 万千⽡(1.8GW)⽔⼒发电站的⼤部分
电⼒输出。对⽐来看⽬前中国长江三峡⽔电站的额定功率是1820 万千⽡。
⽬前Google 已经在全球运⾏了38 个⼤型的IDC 中⼼,超过300 多个GFSII 服务器集
,超过 80 万台计算机。从服务器集 部署的数量来看美国本地的数量第⼀,欧洲地区第
⼆,亚洲地区第三,在南美地区和俄罗斯各有⼀个IDC 数据中⼼。
⽬前Google 在中国的北京和⾹港建设了⾃⼰的IDC 中⼼,并部署了⾃⼰的服务器农场。 其中⽬前还在进⾏建设的第38 个IDC是在奥地利的林茨市(Linz)附近的Kronstorf 村。未来,Google 还准备在中国台湾地区、 来西亚、⽴陶宛等地区来进⾏部署。从⽬前
的Google 数据中⼼部署的情况来看,中东和⾮洲地区⽬前Google 还没有建设计划。
下图是Google 的IDC 中⼼/服务器农场 (Google Server Farm)的全球分布图。
Google ⾃⼰设计了创新的集装箱服务器,数据中⼼以货柜为单位,
标准⾕歌模块化集装箱装有30 个的机架,1160 台服务器,每台服务器的功耗是250KW。
(Google2009 年公布的信息)。下图是Google 模块化集装箱的设计⽰意图。这种标准的
集装箱式的服务器部署和安装策略可以是Google ⾮常快速的部署⼀个超⼤型的数据中⼼。
⼤⼤降低了对于机房基建的需求。
4、Google ⾃⼰设计的服务器机架构架
Google 的服务器机架有两种规格40U/80U 的。这主要是因为原来每个服务器⼑⽚是1U
⾼,新的服务器⼑⽚都是2U ⾼的。据说Google 后期使⽤的服务器主板是台湾技嘉,服务器
主板可以直接插⼊到服务器机架中。
5、Google ⾃⼰设计的PC 服务器⼑⽚
绝⼤部分企业都会跟诸如戴尔、惠普、IBM 或Sun 购买服务器。不过Google 所拥有的
⼋⼗万台服务器都是⾃⼰设计打造来的,Google 认为这是公司的核⼼技术之⼀。Google 的
硬件设计⼈员都是直接和芯⽚⼚商和主板⼚商协作⼯作的。
2009 年,Google 开始⼤量使⽤2U ⾼的低成本解决⽅案。标准配置是双核双通道CPU,
据说有Intel 的,也有AMD 的在使⽤。8 个2GB 的DDR3,⽀持ECC 容错的⾼速内存,采⽤
RAID 1 的磁盘镜像,来提升I/O 效率。磁盘采⽤SATA,单机存储容量可以达到1-2TB 。每个
服务器⼑⽚⾃带 12V的电池来保证在短期没有外部电源的时候可以保持服务器⼑⽚正常运
⾏。Google 的硬件设计⼈员认为,这个⾃带电池的⽅式,要⽐传统的使⽤UPS 的⽅式效率更⾼。
⼀般数据中⼼多倚赖称为不间断电源系统(UPS)的⼤型中控机型,这基本上算是⼤电池,
会在主电⼒失效⽽发电机还来不及启动时,暂时协助供电。Google 的硬件设计⼈员表⽰,
直接把电⼒内建到服务器⽐较便宜,⽽且成本能直接跟服务器数量相符合。“这种作法⽐使
⽤⼤型UPS 节省得多,如此也不会浪费多余的容量。”
效率也是另⼀个财务考量因素。⼤型UPS 可达92-95%的效率,这意味着许多电⼒还是
被浪费掉了。但Google 采⽤的内建电池作法却好很多,Google 相关⼈员表⽰,“我们测量的
结果是效率超过99.9% 。
年份 Google 服务器⼑⽚硬件配置
1999/2000 PII/PIII 128MB+
2003/2004 Celeron 533, PIII 1.4 SMP, 2-4GB DRAM, Dual XEON 2.0/1-4GB/40-160GB IDE - SATA Disks via Silicon Images SATA 3114/SATA 3124
2006 Dual Opteron/Working Set DRAM(4GB+)/2x400GB IDE (RAID0?)
2009 2-Way/Dual Core/16GB/1-2TB SATA
6、Google 服务器使⽤的操作系统
Google 服务器使⽤的操作系统是基于Redhat Linux2.6 的内核,并做了⼤量修改。修改 了GNU C 函数库(glibc),远程过程调⽤ (RPC),开发了⾃⼰的Ipvs,⾃⼰修改了⽂件系统,形 成了⾃⼰的GFSII,修改了linux 内核和相关的⼦系统,是其⽀持IPV6。采⽤了Python 来作为主要
的脚本语⾔。
下表是⼀些⼤型互联⽹公司使⽤的操作系统对⽐。
⽹站 操作系统 Web 应⽤服务器
Google Linux Google Web Server
微软 Windows rver IIS
ebay Windows rver IIS
阿⾥巴巴 Linux Apache
新浪 Free BSD Apache
百度 Linux Apache
163 Linux Apache
搜狐 Sco Unix Apache
7、Google 计算⽂件系统GFS/GFSII
GFSII cell 是Google ⽂件系统中最基础的模块。任何⽂件和数据都可以利⽤这种底层模
块。GFSII 通过基于 Linux 分布存储的⽅式,对于服务器来说,分成了主服务器 (Master
Servers)和块存储服务器(Chunk Servers),GFS 上的块存储服务器上的存储空间以64MB 为
单位,分成很多的存储块,由主服务器来进⾏存储内容的调度和分配。每⼀份数据都是⼀式
三份的⽅式,将同样的数据分布存储在不同的服务器集 中,以保证数据的安全性和吞吐的
效率提⾼。当需要对于⽂件、数据进⾏存储的时候,应⽤程序之间将需求发给主服务器,主
服务器根据所管理的块存储服务器的情况,将需要存储的内容进⾏分配,并将可以存储的消
息(使⽤那些块存储服务器,那些地址空间),有应⽤程序下⾯的GFS 接⼝在对⽂件和数据 直接存储到相应的块存储服务器当中。
块存储服务器要定时通过⼼跳信号的⽅式告知主服务器,⽬前⾃⼰的状况,⼀旦⼼跳信
号出了问题,主服务器会⾃动将有问题的块存储服务器的相关内容进⾏复制。以保证数据的
安全性。
数据被存储时是经过压缩的。采⽤的BMDiff 和Zippy 算法。BMDiff 使⽤最长公共⼦序
列进⾏压缩, 压缩 100MB/s, 解压缩约 1000MB/s.类似的有 IBM Hash Suffix Array Delta Compression.Zippy 是 LZW 的改进版本, 压缩⽐不如 LZW, 但是速度更快.
8、Google 并⾏计算构架 Mapreduce
有了强⼤的分布式⽂件系统,Google 遇到的问题就是怎么才能让公司所有的程序员都
学会些分布式计算的程序呢?于是,那些Google ⼯程师们从lisp 和其他函数式编程语⾔中
的映射和化简操作中得到灵感,搞出了Map/Reduce 这⼀套并⾏计算的框架。Map/Reduce
被Google 拿来重新了Google Search Engine 的整个索引系统。⽽Doug Cutting 同样⽤Java 将牵动我的情思
这⼀套实现和HDFS 合在⼀起成为Hadoop 的Core。
MapReduce 是Google 提出的⼀个软件架构,⽤于⼤规模数据集(⼤于1TB)的并⾏运
算。概念“Map (映射)”和“Reduce (化简)”,和他们的主要思想,都是从函数式编程语
⾔借来的,还有从⽮量编程语⾔借来的特性。
映射和化简
简单说来,⼀个映射函数就是对⼀些独⽴元素组成的概念上的列表(例如,⼀个测试成
绩的列表)的每⼀个元素进⾏指定的操作(⽐如前⾯的例⼦⾥,有⼈发现所有学⽣的成绩都
被⾼估了⼀分,他可以定义⼀个“减⼀”的映射函数,⽤来修正这个错误。)。事实上,每个
元素都是被独⽴操作的,⽽原始列表没有被更改,因为这⾥创建了⼀个新的列表来保存新的
答案。这就是说,Map 操作是可以⾼度并⾏的,这对⾼性能要求的应⽤以 并⾏计算领域
的需求⾮常有⽤。
⽽化简操作指的是对⼀个列表的元素进⾏适当的合并(继续看前⾯的例⼦,如果有⼈想
知道班级的平均分该怎么做?他可以定义⼀个化简函数,通过让列表中的元素 跟⾃⼰的相
邻的元素相加的⽅式把列表减半,如此递归运算直到列表只剩下⼀个元素,然后⽤这个元素
除以⼈数,就得到了平均分。)。虽然他不如映射函数那么并 ⾏,但是因为化简总是有⼀个
简单的答案,⼤规模的运算相对独⽴,所以化简函数在⾼度并⾏环境下也很有⽤。
分布和可靠性
MapReduce 通过把对数据集的⼤规模操作分发给⽹络上的每个节点实现可靠性;每个
节点会周期性的把完成的⼯作和状态的更新报告回来。如果⼀个节点保 持沉默超过⼀个预
设的时间间 ,主节点 (类同Google File System 中的主服务器)记录下这个节点状态为死
亡,并把分配给这个节点的数据发到别的节点。每个操作使⽤命名⽂件的原⼦操作以确保不
会发⽣并⾏线程间 的冲突;当⽂件被改名的时候,系统可能会把他们复制到任务名以外的
另⼀个名字上去。(避免副作⽤)。
化简操作⼯作⽅式很类似,但是由于化简操作在并⾏能⼒较差,主节点会尽量把化简操
作调度在⼀个节点上,或者离需要操作的数据尽可能进的节点上了;这个特性可以满⾜
铺面租赁合同书Google 的需求,因为他们有⾜够的带宽,他们的内部⽹络没有那么多的机器。
在Google,MapReduce ⽤在⾮常⼴泛的应⽤程序中,包括“分布grep,分布排序,web
抗日战争电视剧大全
连接图反转,每台机器的词⽮量,web 访问⽇志分析,反向索引构建,⽂档聚类,机器学习,
基于统计的机器翻译...”值得注意的是,MapReduce 实现以后,它被⽤来重新⽣成Google 的整个索 引,并取代⽼的ad hoc 程序去更新索引。MapReduce 会⽣成⼤量的临时⽂件,为
了提⾼效率,它利⽤Google ⽂件系统来管理和访问这些⽂件。
9、Google 并⾏计算数据库 Bigtable
有了强⼤的存储,有了强⼤的计算能⼒,剩下的Google 要⾯对的是:它的应⽤中有很
多结构化、半结构化的数据,如何⾼效地管理这些结构化、半结构化的数据呢?Google 需
吕雉是谁要的是⼀个分布式的类DBMS 的系统,于是催⽣了BigTable 这个东西
Google 的BigTable 从 2004 年初就开始研发了,BigTable 让Google 在提供新服务时的
运⾏成本降低,最⼤限度地利⽤了计算能⼒。BigTable 是建⽴在 GFS ,Scheduler ,Lock Service 和 MapReduce 之上的。
每个Table 都是⼀个多维的稀疏图spar map。Table 由⾏和列组成,并且每个存储单
元 cell 都有⼀个时间戳。在不同的时间对同⼀个存储单元cell 有多份拷贝,这样就可以记
录数据的变动情况。数据存储的结构是(row:string, column:string, time:int64) --> string
⾏:
表中的⾏键 (⽬前任意字符串⾄64KB 的⼤⼩)。每⼀个读取或写⼊的数据下单⾏的关键是
原⼦ (不论数⽬不同的列被读取或⾏中写的),更容易为客户的原因关于系统中的⾏为同时存
在对同⼀⾏的更新。
列:
列项分为集合称为列的家族,它们形成了访问控制的基本单位。所有数据在⼀列中存储
的家族通常是同⼀类型。当数据以这个列键值被存储之前,列的家族必须被创建。家族内的
任何列键值可以使⽤。因为,重叠的列键值⽐较少,与此相反,⼀个表可能有⽆限的列数。
时间戳:
Bigtable 的每⼀个细胞中可以包含多个版本同样的数据,这些版本的时间戳索引。Bigtable
的时间戳64 位整数。它们可以被分配由Bigtable 的,在这种情况下,他们真正代表联聪以微秒
的时间,或明确指定的客户端应⽤程序。应⽤程序需要避免冲突必须创造⾃⼰独特的时间戳。
不同⼀个单元格的版本都存储在时间戳顺序递减,因此,最近的版本可以⾸先阅读。
为了管理 ⼤的Table,把Table 根据⾏分割,这些分割后的数据统称为:Tablets 。每个
Tablets ⼤概有 100-200 MB,每个机器存储100 个左右的Tablets 。底层的架构是:GFS。由
于GFS 是⼀种分布式的⽂件系统,采⽤Tablets 的机制后,可以获得很好的负载均衡。⽐如:
可以把经常响应的表移动到其他空闲机器上,然后快速重建。Tablets在系统中的存储⽅式
是不可修改的immutable 的SSTables,⼀台机器⼀个⽇志⽂件。
BigTable 中最重要的选择是将数据存储分为两部分,主体部分是不可变的,以SSTable
的格式存储在GFS 中,最近的更新则存储在内存(称为memtable)中。读操作需要根据SSTable
和memtable 还综合决定要读取的数据的值。
Google 的Bigtable 是不⽀持事务,只保证对单条记录的原⼦性。事务是好东西,但事
务也是导致数据库实现复杂化、性能下降最主要的根源。BigTable 的开发者通过调研后发现
其实⼤家对事务都没什么需求,只要保证对单条记录的更新是原⼦的就可以了。这样,为了
⽀持事务所要考虑的串⾏化、事务的回滚等、死锁检测(⼀般认为,分布式环境中的死锁检
测是不可能的,⼀般都⽤超时解决)等等复杂问题都不见了。系统实现进⼀步简化。
10、Google 并⾏锁服务Chubby lock身边的风景