作为“十三五”重点规划产业之一,云计算到底是什么?又会怎样发展?最近兴起的云原生(Cloud Native)和无服务器架构(Serverless)又与云计算有什么关系?本文将以云计算的发展为路线,为大家科普云计算的概念与现状,无论读者是开发、测试、抑或是产品、管理者都能在本文中有所收获。
纵观整个服务器的发展历程,可以分为三阶段,自建服务器时代、服务器托管与租赁时代、云计算时代。
自建服务器时代
早期的计算机主要分为两种使用方式,组织自建机房与租用,自建机房很好理解,就是买一台放在公司自己用,租用一般是制造商提供租赁使用,按时付费,是不是有点今天云服务器的意思?
早期的IBM 650要价50万美金,或可以每月3500 美金的价格出租。
服务器托管与租赁时代
至 Web 时代来临,IT 公司大量采用 B/S(浏览器/服务端) 架构,客户端越来越轻量化,大部分资源存储在服务端,导致服务器需求激增,于是服务器托管业务应运而生,早期多为 ISP 即互联网服务提供商(Internet Service Provider)承接,简单来说就是买一台服务器(也可以直接使用 ISP 的服务器),放到 ISP 机房由 ISP 负责维护,比如分配 IP,网络带宽,免去要申请商业化宽带以及管理服务器的麻烦,节省办公空间。
发展到这时,租用 ISP 的服务器已经有了云计算的雏形了。但还是有很多缺陷:
- 部署笨重,一台服务器只能租赁给一个客户,无法共享资源池
- 无法监控服务,服务器物理独立,很难介入监控系统状态
- 费用很高,服务器要钱、托管也要钱,对中小企业不友好、个人开发者更没可能
- 服务器利用率不高,一台8核16g的服务器,几个程序很难将服务器跑满,即便跑满了也无法保证独立互不影响
- 单点故障问题,如果服务器损坏,很难快速甚至可能无法恢复服务
服务器托管与租赁如今也大规模存在。
云计算时代
办法总比问题多,这些问题伴随着 2000 年左右虚拟化成熟迎刃而解,而 2013 年的容器化技术更是让云计算锦上添花,在了解云计算之前,我们先来了解一下虚拟化技术。
虚拟化技术
虚拟化技术早在60年代就被 IBM 创造出来了,当时是为了并行执行程序(早期计算机单一时间只能执行一个程序,想要运行另外一个就要退出当前程序),后来被多进程多线程技术取代了。
虚拟化技术就是将计算机硬件模拟成多个并且分别提供给多个用户使用,其实现也很简单,就是在硬件与操作系统间增加一层代理,用于欺骗(隔离多个)操作系统,这个代理就是大名鼎鼎的 Hypervisor,Hypervisor 也叫虚拟机监视程序( virtual machine monitor, VMM),并不是指某个具体的软件,而是代表所有能够管理虚拟机的软件。
Hypervisor 按结构划分可以分为两类,一类直接接管硬件(Native 或称 Bare metal)自己就是一个专用操作系统,如 Hyper-V、VMware ESXi、Xen、Kvm 等;另一类需安装在操作系统上(Hosted),这一类普通用户接触的比较多,如 Parallels Desktop for Mac、QEMU、Virtual Box、VMware Workstation 等,下图从左到右分别为 Native 与 Hosted。
Hypervisor 按照技术实现可以分为,全虚拟化(Full virtualization)与半虚拟化(Paravirtualization),全虚拟化致力于完全模拟,虚拟机内运行的操作系统无感知,其优点是兼容性好,操作系统无需修改即可运行在虚拟化环境上,缺点是因为一些历史遗留问题(CPU 设计缺陷,部分敏感指令无法被捕获,一般使用动态劫持,Hypervisor 拦截,动态替换指令,后续的硬件辅助虚拟化解决了这个问题,见下文)导致效率比较低,如 Vmware Workstation/Server, Virtual PC/Server,Parallel Workstation;而半虚拟化则部分模拟指令,很难模拟的指令则通过修改虚拟机内的操作系统内核来实现,其优点是效率较高,缺点是必须修改操作系统内核,如 Xen,Vmware ESX Server,Microsoft Hyper-V R1等,需注意的是二者仅是将部分敏感指令在不同位置处理,全虚拟化在 Hypervisor 中处理,半虚拟化则在虚拟机操作系统中处理。
硬件辅助虚拟化于 1972 年首次出现在 IBM System / 370 上,英特尔与 AMD 意识到虚拟化市场的重要性,于是也想做些贡献(捞一笔),x86 处理器辅助虚拟化(英特尔 VT-x 或 AMD-V)分别在 2005 年和 2006 年推出。硬件辅助虚拟化致力于解决早期的 CPU 设计缺陷,并且增加了虚拟化专用指令来提高效率,目前硬件辅助虚拟化已经成为服务器虚拟化的基石(虚拟化技术还包括内存、存储、网络虚拟化等,此处不再展开)。
Hypervisor 的虚拟化方式被称为硬件虚拟化(早期叫平台虚拟化),硬件虚拟化的出现彻底解决了资源分配的问题,其优点是隔离性好,几乎模拟了真实环境,缺点是每个用户使用独立的操作系统内核、运行时,资源浪费,设想一下场景,如果同一个服务器需要多个隔离环境的 Window Server 2012,采用虚拟化则需要运行多个操作系统,即便版本、环境都一模一样也无法共用资源。是否有一种更轻量化的资源分配方式呢?这就不得不提大名鼎鼎的容器化技术。
容器化技术
容器技术(Containerization)在技术上几乎没有创新,是一种操作系统级别虚拟化技术(OS-level virtualization),通过操作系统的支持模拟出隔离环境、限制资源访问,其本质上仅仅是操作系统中的一个进程,本身足够轻量化。如今容器化技术几乎被 Docker 垄断,Docker 于 2013 年 3 月开源,至今已经成为云计算与微服务乃至云原生架构中至关重要的技术,Docker 相比虚拟化技术具有轻量化,效率高(所有容器使用同一个操作系统内核、运行时)等特点,缺点是隔离不好,服务器压力高,所有 Docker 进程都会受到影响,有趣的是 Docker 与前面的虚拟化技术完美互补。Docker 解决了资源分配问题,而 2014 年 Google 开源的 Kubernetes 则解决了云与容器的结合问题,目前 Kubernetes 已经成为容器管理、编排事实上的标准。
至此云计算在资源调度方面已经集齐了最后一颗龙珠,虚拟化技术的成熟标志着云计算成熟,云计算采用虚拟化技术与容器技术结合规划资源,而 Kubernetes 的横空出世则代表云计算将告别仅仅租赁服务器的时代。
什么是云计算?
我们来看美国国家标准和技术研究院(National Institute of Standards and Technology)的定义:
- 随需应变的自助服务。
- 随时随地用任何网络设备访问。
- 多人共享资源池。
- 快速重新部署的灵活度。
- 可被监控与测量的服务。
一般认为还有如下特征:
- 基于虚拟化技术快速部署资源或获得服务。
- 减少用户终端的处理负担。
- 降低了用户对于 IT 专业知识的依赖。
简单来说就是按需付费,支持按时、按 CPU 核、按内存、按带宽、按硬盘大小来付费。云计算发展到今天,有着更细化的市场,如阿里就将服务分为弹性计算(IaaS),存储服务(PaaS),数据库(PaaS)等,每种设施还有更加细致的分类,如弹性计算中的 ECS,就可以分为通用型、计算型、内存型等,用于满足不同企业需求(本段文字 500 元,去掉括号中内容再发)。
云计算的发展
讲云计算发展必须先了解云计算的概念。云计算由美国国家标准和技术研究院(National Institute of Standards and Technology)定义了三种模型,对应三种服务级别:基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。
- IaaS(Infrastructure as a service)基础设施可以简单理解为虚拟机、服务器、存储、网络等,如亚马逊的EC2、阿里的ECS。
- PaaS(Platform as a service)平台可以理解为一些更具体的基础设施,比如 Web 服务器、数据库等,如阿里的云数据库系列。
- SaaS(Software as a service)软件可以理解为开箱即用的软件,广义上来讲,所有的互联网产品都可以是 SaaS,如钉钉、163 邮箱,都可以被称为 SaaS。
其他扩展
XaaS,面向服务架构(Service-oriented architecture ,SOA )提出的架构理念,即一切皆服务,“X as a service”、“anything as a service”或“everything as a service” ,也有写作 EaaS,具体实现如:IDaaS 身份认证即服务(Identity as a Service)、BaaS 区块链即服务(Blockchain as a service)、PaaS 支付即服务 (Payments as a service)等,这些都可以被归集到上面三种模型。
云计算按照部署版本可以分为私有云、公有云、混合云。私有云为企业私有,并不对外服务;公有云并不代表免费,而是对外提供使用(收费);混合云则同时拥有二者特性。
相信读者到这里已经了解什么是云计算,简单来说就是对外服务器租用,早期的服务器租用在员外看来也可以称之为云计算(IaaS),对比今天的云产品本质上没有区别,只是在资源上更加细化,服务上更加完善而已。我们来看一下云计算的历程:
- 1996年,Compaq公司在其公司的内部文件中,首次使用“云计算”这个词汇。
- 2006年8月,亚马逊创建了子公司Amazon Web Services,并推出了弹性计算云(Elastic Compute Cloud, EC2)。
- 2008年4月,谷歌发布了测试版 Google App Engine。
- 在2008年初,NASA的OpenNebula在欧洲委员会(RESERVOIR)资助的项目中得到了增强,成为第一个用于部署私有云和混合云的开源软件。
- 2010年2月,微软于2008年10月发布了Microsoft Azure。
- 2010年7月,Rackspace Hosting与NASA共同发起了一项开源云软件计划,称为OpenStack。 OpenStack 早期代码来自NASA的Nebula平台以及Rackspace的Cloud Files平台。 OpenStack 是第一个开源的云平台。
- 2011年3月1日,IBM宣布了支持Smarter Planet的IBM SmartCloud框架。
- 2012年5月,Google Compute Engine 发布了预览版本。
- 2012年6月7日,Oracle发布了Oracle Cloud。
- 2013年12月,Google Compute Engine 又推出了 GA(General Availability ) 版本。
国内云计算起步稍晚:
- 2010 年 5 月,阿里云对外公测。
- 2013 年 9 月,腾讯云面向全社会开放、云安全上线
- 2015百度开放云正式对外开放
注:国内部分来自百度百科,不负责准确性,其他国内云厂商查不到准确上线时间。
前文说过,云计算发展本质上就是逐步细化资源与完善服务,我们来看一下云产品发展至今,到底发展了什么:
灰色代表云厂商提供服务,蓝色代表 IT 公司自己管理的部分,云计算越成熟,IT 公司负担越少、成本越低。对比托管服务,我们发现云计算几乎弥补了所有托管服务的缺点,比如亚马逊的 EC2 服务器宣布可以保证 99.99% 的可用性,每个月宕机时间不超过 0.01%,即 4.38 分钟。
云原生与Serverless
如今大规模普及的 PaaS 已经提供了绝大多数的服务,SaaS 并不适合通用场景,云计算若想再进一步只能从两个方向入手:
- 方案一:继续开发通用的 SaaS 平台
- 方案二:尝试从 PaaS 上入手
方案一没有可行性,云提供商不可能开发市面上所有的业务系统,并且云厂商也没有精力做。我们从方案二入手,根据上图我们可以得出结论:PaaS 与 SaaS 区别在于是否管理应用,两者之间是否有折中的方案?进一步考虑,云计算实际上是减少了服务器与运维成本,而 IT 企业更大的成本在于编码(研发成本),能否有一种方案能够简化编码从而降低企业成本呢?运维成本还可以再降吗?云厂商自然不会停滞不前:
- 降低运维成本,现在阶段云厂商提供的服务还需要运维人员来管理服务器数量、内存大小、CPU核心数、所在区域等,无服务器(Serverless)架构就致力于解决以上问题,在无服务器模式下,运维人员只需要关心部署即可。具体产品有AWS Lambda、Google Cloud Functions、IBM Cloud Functions、Azure Functions等,但目前的无服务器(Serverless)架构大多需要针对编程,还不是很完善。
- 降低开发成本则提出了云原生(Cloud Native)的概念,云原生致力于简化整个开发生态,从开发到运维甚至云计算厂商,目前云原生主要依赖微服务、容器化技术、容器编排(Kubernetes)来实现。
云原生与无服务器模式概念较新,且还没有特别好的落地方案,限于篇幅,本篇不再继续展开,如果读者感兴趣可以关注本人公众号,下一篇我们通过讨论架构设计的演进来展开。
总结
云计算即便发展到今天,表象上还是服务器租赁,这也是有人批评云计算是新瓶装旧酒的原因。但云计算经过多年的发展,本质上是集中资源统一高效管理的思想体现,比如员外所在的北方每年冬天都会集中供暖,本质上也是集中资源统一管理的思想。集中管理提高了资源的使用率,进而降低了资源的单位成本,从企业角度来看是一件节省成本的好事,从社会的角度上来讲,降低了单位成本则提高了消费者剩余,减少了福利损失,这样看来,云计算被规划为“十三五”重点项目之一也就不奇怪了,另外随着无服务器(Serverless)、微服务(Micro-Service)、云原生(Cloud Native)、服务化网格(Service Mesh)等技术或理论的成熟,有理由相信,云计算的发展还有很大的上升空间。
以上是个人观点,如果有问题或错误,欢迎留言讨论指正,码字不易,为了写本篇文章员外仅维基词条就阅读大几十篇,着实辛苦,如果觉得写的不错,求关注、求点赞、求转发。
扫码关注公众号,第一时间获得更新
参考
https://en.wikipedia.org/wiki/Cloud_computing
https://docs.aws.amazon.com/lambda/index.html
https://github.com/cncf/toc/blob/master/DEFINITION.md
https://en.wikipedia.org/wiki/Serverless_computing
https://en.wikipedia.org/wiki/Virtualization
https://en.wikipedia.org/wiki/OS-level_virtualization
https://en.wikipedia.org/wiki/Docker_(software)
https://en.wikipedia.org/wiki/Desktop_virtualization
https://en.wikipedia.org/wiki/Hardware-assisted_virtualization
https://en.wikipedia.org/wiki/Paravirtualization
https://en.wikipedia.org/wiki/Full_virtualization
https://en.wikipedia.org/wiki/Hypervisor