本节书摘来自异步社区《数据中心设计与运营实战》一书中的第2章,第2.1节,作者: 【美】Luiz André Barroso , 【美】Jimmy Clidaras , 【瑞士】Urs Hölzle 更多章节内容可以访问云栖社区“异步社区”公众号查看。
第2章 工作负载和软件基础架构
仓储式数据中心(WSC)中运行的应用主导了众多系统设计的决策权衡。本章概述了大型互联网服务中软件的显著特征以及一个构建完整计算平台所需要的系统软件和工具。以下是典型WSC部署中不同的软件层的相关术语。
- 平台层软件:和所有独立服务器都一样的固件、内核、分布式操作系统和函数库,屏蔽掉单一设备的具体硬件,提供基本的服务器级服务。
- 集群层基础架构:在群集层提供资源管理和服务,并最终成为数据中心级操作系统。比如分布式文件系统、调度器、远程过程调用(RPC)库,以及可以简化数据中心资源调用的编程模型等,如MapReduce 【35】、Dryad 【86】、Hadoop 【77】、Sawzall 【122】、BigTable 【26】、Dynamo 【36】、Dremel 【104】、Spanner 【32】和Chubby 【22】。
- 应用层软件:用于实现特定服务。常用于进一步将应用级软件分解为在线服务和离线计算服务,原因是这些两种服务的需求往往不同。例如在线服务有Google搜索、Gmail、Google地图。离线计算通常用于大型数据分析或者为在线服务生产数据,例如,创建Web索引或处理卫星图像用来创建地图图像块,以供在线服务使用。
2.1 数据中心VS. 台式机
互联网服务的软件开发在许多方面有别于传统的台式机/服务器模式。
- 大并发:典型的互联网服务表现出大量并发,其主要根源在于数据级和请求级的并发。但问题往往并不在于发现并发性,而是如何管理和有效处理应用内在的显式并发。数据并行起源于需要处理的关联大数据集,比如以十亿计的网页或日志。这些非常大的数据集需要大量计算来处理每个并行(子)的任务,这反而有助于掩盖或容忍通信和同步的开销。同样的,请求级并发来自于公众互联网服务每秒接收到的成百上千的请求。这些请求很少涉及数据读写冲突或者请求间同步。例如,搜索请求基本是独立的,处理主要涉及只读的数据库,因此,计算很容易在请求内或跨越不同请求间分段进行。类似的情况还有,Web邮件系统处理的用户数据,来自不同用户的请求也各不相关,从而生成了数据分区和并发的自然单元。只要更新速率低,即便是高度关联的数据系统(比如社交网络后台端)也能从高并发性中获益良多。
- 工作负载波动:互联网用户通过定义相对良好、稳定的高级API(比如简单的URL)而和服务的实现细节脱离,从而更容易快速部署新软件。与桌面软件产品相比,Google关键的服务的发布周期,已经从几个月甚至几年缩短至大约几周。例如,Google前端Web服务器二进制文件(由数以百计的开发人员完成的近千个独立的代码变更)每周都有新版本更新,Google核心搜索服务的代码每两到三年几乎从零开始重新构建一次。这样的环境极大地刺激了产品快速创新,却使系统设计师无法从一个已经完成的应用中提取出有用的基准点。此外,由于互联网服务仍然是一个相对较新的领域,新产品和服务频繁出现,这些产品和服务的成功又直接影响到数据中心的工作负载。例如,YouTube等视频服务在短时间内快速崛起,与数据中心现有主要任务的计算调度相比,这可能产生一组有极大不同的调度需求,从而在对WSC的优化设计中产生意想不到的潜在影响。这种激进的软件部署情境有益的一面是,硬件架构师不再纠结于无法通过修改代码片断,而仅优化硬件来获得良好的性能;相反,架构师可以考虑通过软件重写以利用新的硬件功能或设备的可能性。
- 平台同质性:相比台式机,数据中心的软硬件开发环境通常更同构化。在任何给定的时间,大型互联网服务通常使用相对固定的硬件和系统软件配置。显著异质性的一个主要原因来自于随时间变化部署的更多低成本组件。平台同质的出现简化了集群级的调度和负载均衡,也减轻了平台软件(内核、驱动等)的维护负担。同样,同质性还可以认供应链效率更高,使修复过程更加高效,这是因为自动和手动修复可以得益于更少的系统种类,同时可以积累更多的经验。相比之下,运行在桌面系统上的软件、硬件和系统平台种类繁多,需要面对成千上万种硬件及系统软件配置所带来的困难。
- 无故障运行:由于互联网服务应用运行在由成千上万台机器组成的集群上,这些机器单体的可靠性并不比PC高,个体失败率的乘法效应意味着某种类型的故障可能每几小时或者在更短时间内就会发生(第6章将提供更多细节)。因此,桌面级软件对几个月或几年硬件无故障运行的假设看上去合理,但对于数据中心级别的服务却不现实。也就是说,常常出错是互联网服务日常状态的一部分。理想情况下,集群级系统软件应能提供一个层,以对应用级软件隔离大部分的复杂性,虽然这个目标对于所有类型的应用程序来说很难实现。
相比桌面系统,尽管大量线程级别的并行性和更同质化的计算平台有助于减少互联网服务软件开发的复杂性,但其规模、在硬件故障下运行的需求,以及工作负载变化的速度都会产生相反的效果。