如今,从事在线业务的企业必须预测和管理用户活动难以预测的高峰。如果企业无法满足高峰需求,则存在服务崩溃的风险,这可能导致停机,并对客户体验产生负面影响。为避免这些影响,企业需要为IT系统提供严格的服务级别协议(SLA)。
传统的IT系统遭遇突发负载和严格SLA的组合的挑战,因为这些系统具有有限的“弹性”。如今的系统架构师必须考虑电力负载波动对处理能力以及存储容量的影响。他们必须设计可以大规模存储(即大数据),大规模计算能力(即零售或游戏)以及存储和计算能力(即云计算信息管理)的IT系统。如今,IT系统正在经历非常根本的变化,以支持突发负载。如今的系统建立在云平台之上,无论是公共云还是私有云。这种变化并不仅限于硬件架构。它深深地影响了软件工程师开发弹性系统的方式。
行业服务商经历了类似的转变,构建了一个扩展到数百万用户和PB级数据的服务。并意识到开发云系统与开发内部部署系统有着根本的不同。云系统的多个方面需要一种全新的思维方式。以下关注本地部署和云计算的操作系统接口之间的区别。
操作系统是抽象的
通常,软件开发人员不会直接用机器语言编程到底层硬件资源。相反,硬件和软件开发人员使用的应用程序编程接口(API)之间有多层次的抽象或虚拟化,可大大简化此过程。
硬件之上的第一个虚拟化层是操作系统(OS)。软件不直接访问硬盘。文件系统(FAT,NTFS,EXT3等)虚拟化硬盘并将存储作为文件和文件夹呈现。数据库在这些文件之上添加了一个虚拟化层,以呈现与关系表相同的存储-MySQL,Oracle和SQL Server是一个很好的例子。每个后续级别的虚拟化提供了一个API,可以被调用来访问相关功能。例如,文件系统提供用于创建,删除,写入和读取文件的API。
如上所述,硬件上的第一级虚拟化是操作系统。用于访问操作系统的API主要基于上世纪70年代定义的UnixAPI。想想过去40年硬件是如何改变和改进的,真是令人难以置信。想想上世纪80年代的IBM系统和如今的Windows机器的对比。如今,一部AppleiPhone5手机的处理能力是1985年Cray-2超级计算机的2.7倍。还记得软盘是什么样的吗?然而,多年来,操作系统API几乎保持不变。
CPU,内存,存储和网络硬件四个方面由操作系统实现虚拟化:CPU和内存结合一起被称为“计算”硬件。Unix风格的虚拟化计算视图是进程和线程。当然,组织可以使用Unix风格的API在云计算服务器上运行程序。但是,如果要充分利用云计算提供的可扩展性和可用性,则需要使用云原生API。
云计算操作系统有何不同?
以下探讨一下云计算操作系统对进程,线程,TCP套接字编程和文件系统的等介物。云计算操作系统用对象存储替换文件系统,实现无限扩展的存储容量和I/O吞吐量。对象存储是云计算操作系统引入的第一个范例转变,从而成为存储虚拟化的常态。对象存储API与Unix文件系统API基本不同。Unix文件系统API将数据作为字节流公开,而对象存储API将数据作为在单个API调用中获取的对象进行公开。对象存储的性能特征也不同于Unix文件系统。通常,对象存储具有更高的延迟和更高的可扩展性。也就是说,一个API调用可能需要更长时间,但可以并行发出多个API调用。由于存储API的变化,软件开发人员在构建云系统时必须采用不同的想法。
在数据库方面,关系数据库没有扩展到充分利用云计算的全部潜力。云计算应用程序是围绕分布式的NoSQL数据库构建的,它们与负载进行扩展或缩小,并提供比传统系统更好的容错能力。顾名思义,分布式NoSQL数据库使用分布式计算和存储资源。因此,这些数据库在存储量和交易速率方面提供了更高的可扩展性。对于软件开发人员来说,分布式数据库提供的可扩展性来自API的变化成本。分布式数据库通常不支持SQL,即事实上的关系数据库API。分布式数据库公开API来存储和检索键值对。API的这种变化会显著影响云系统的架构。
随着云系统的发展,SOA正在让位于事件驱动的无服务器编程。
第一波云计算并没有影响到进程和线程相关的API。虽然云系统倾向于采用具有面向服务的体系结构,而不是采用本地系统中的分层系统架构,面向服务架构(SOA)更适合于云系统,因为单独的服务可以独立部署,扩展和升级。随着云系统的发展,SOA正在让位于事件驱动的无服务器编程。无服务器编程允许组织定义要为某个事件调用的函数,然后函数本身可以生成更多的事件,而这些事件又由其他函数处理。使用此型号,组织不需要始终保持服务器的运行,并且不必担心在负载增加时运行其他服务器。事件处理函数的更多事件和更多实例可以简单地由云计算操作系统产生。无服务器编程也是从软件程序员开发一个内部部署系统的重大转变。