NoSQL数据库原理(第2版·微课版)
上QQ阅读APP看书,第一时间看更新

1.3 云计算与NoSQL

云计算(Cloud Computing)是一种IT资源的使用、运营和提供方式。简单地说,云计算是指将IT资源(如计算、存储、网络或软件功能等)部署在远程的数据中心当中,用户通过网络对资源进行申请和使用,而无须在本地进行部署和维护。用户在使用IT资源时,可以不再关心自身和资源所在的具体位置和实际状态,宛如资源在虚无缥缈的“云”上,但可以随时随地地使用。

2006年8月,谷歌公司提出了“云计算”的概念,其含义既涵盖现在的云的概念,如亚马逊、阿里云等提供的服务,也包含现在大数据的内容,如Hadoop系统、MapReduce架构等。大约在2011年以后,大数据的概念逐渐“升温”,大数据和云计算成为两个截然不同的名词,它们的内涵也逐渐固定下来——云计算强调通过网络和租用方式使用IT资源,大数据则强调对数据内容进行价值挖掘。

美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)对云计算的定义为:云计算是一种模型。基于该模型,用户可以通过网络实现对可配置共享资源(包括网络、服务器、存储、应用和服务等)的访问,这种对资源的访问方式是无处不在的、便利的和按需而定的。这些资源可以被迅速地提供和发布,而用户只需要进行少量的管理配置或(界面)交互工作即可。

NIST强调云计算本身是一个不断发展的范式(Paradigm),即云计算本身也处在不断地发展当中。例如:当前云计算的概念中又衍生出了边缘计算(Edge Computing)、算力网络(Computing Network)等新的IT资源模型。

1.3.1 云计算的特征和模式

云计算包含5个基本特征、3种服务模式和4种部署模式。

云计算的基本特征如下。

(1)按需自助服务(On-demand Self-service):用户可以根据自身需求,自行配置资源的类型、数量和使用时间,而无须和云服务商进行过多交互。例如:用户可以在云服务商提供的页面中选择使用一台虚拟服务器,该虚拟服务器有两个虚拟中央处理器(Central Processing Unit,CPU)核心、4 GB内存、40 GB存储和1 Gbit/s的网络带宽。用户还可以在页面上选择这台虚拟服务器的使用时长,并进行一些基本配置,例如配置虚拟机中的防火墙规则等。

一般情况下,云计算服务商可以在用户完成需求描述后的几分钟内交付资源,用户即可通过远程访问等方式对资源进行使用,并根据实际使用时长、资源种类和数量等要素进行计费,类似移动通信中的话费或流量费。

(2)广泛的网络访问(Broad Network Access):一般情况下,用户可在任何时间、地点,利用多种终端(如手机或计算机)通过网络和标准的网络协议[例如超文本传送协议(Hypertext Transfer Protocol,HTTP)、安全外壳(Secure Shell,SSH)协议等]访问资源。但在实际情况中,还需要考虑用户和云之间是否存在通畅的网络通路,以及是否存在网络安全机制的限制等。

(3)资源池化(Resource Pooling):一般情况下,主流的云服务商会集中大量的IT资源(例如构建大型数据中心),进行统一管理和使用,即构建资源池,并同时为多个用户提供服务。资源的提供是动态的、可重新分配的。例如:当前某个用户将其租用的虚拟机退租之后,该资源(虚拟机)会被收回,并重新为其他用户提供服务,而用户无须关心资源提供的具体细节。

资源池化强调了资源的集中化和多租户模型。资源的集中化的好处在于,资源越集中,单位资源的管理和使用成本就越低。例如:将大型数据中心建立在寒冷且人烟稀少的地方,可以节省地价和降低制冷成本;通过技术创新,可以让少量人员管理上万台服务器,从而使得单台服务器的管理成本更低,这样用户有可能以更低的价格使用资源。而只拥有少量服务器的机构可能无法获得这种成本优势。

多租户模型则能进一步提升IT资源的利用率,并且提供更快速、灵活的服务。例如:如果一名租户独占一台服务器,则需要承担较高的单价;如果多名租户共享一台服务器,则费用可以平摊,且资源利用率更高。在很多业务场景中,用户对IT资源的使用是少量且间歇性的。例如:一些大型集团公司的办公系统,可能由很多个子服务构成,这种子服务一般对资源需求不高,且一般不会同时出现较大的并发访问。如果将这些子服务部署在独立的服务器上,则会产生较大的资源浪费和更高的管理成本;如果以多租户模型将子服务部署到云上,只需要少量服务器即可支撑,且用户体验不会明显下降。

(4)快速和弹性(Rapid and Elasticity):是指用户的资源能够快速交付,且进行弹性扩展。即用户申请完IT资源之后,可以根据需求的变化以手动或自动的方式调整资源,例如:将申请的云存储资源从40 GB扩展到60 GB等,而这种资源调整一般也可以在几分钟内交付。

(5)可度量的服务(Measured Service):即云服务的使用和计费是透明、精确且细粒度的。用户可以根据资源单价和资源的使用日志计算或核对账单。例如:用户租用云存储服务时,单价和存储类型、存储容量有关,总价则为单价与使用时长的乘积。用户申请、使用和释放资源的实际情况都能被监控和汇报。此外,一些主流的云服务商也会对资源故障情况进行监控。当出现注入资源无法访问,或存储数据丢失等故障情况时,云服务商会根据服务条款对用户给予折扣或赔偿,这也可以看作可度量的服务的一个方面。

云计算的3种服务模式如下。

(1)软件即服务(Software as a Service,SaaS):即以云方式提供的软件,多指企业软件。服务商一般为软件开发商,是用户通过网络和浏览器等即可使用软件。SaaS具有在线购买、在线使用和弹性扩展功能与用户数量等能力。SaaS显著提高了供需双方的效率,降低了成本:用户即买即用,开发商也无须到用户办公场地进行部署和维护。

(2)平台即服务(Platform as a Service,PaaS):即云上的(通用软件)平台,其用户主要是网站、App后台或其他在线应用的开发人员和运维人员。PaaS提供了在线开发工具、通用功能(例如在线地图、数据库等)和业务系统的承载运行环境。用户可以基于PaaS构建自己的应用系统,再将其运行在PaaS之上,PaaS具有简化开发、简化部署、简化维护等效果。

(3)基础设施即服务(Infrastructure as a Service,IaaS):即云上的基础IT资源,其用户可能是各类型的开发人员、科研人员等。IaaS提供计算、存储和网络等通用的、基础的IT资源,用户则可以基于这些资源满足各种类型的业务需求。

IaaS不一定能简化业务开发,因为其服务内容不涉及通用软件。但IaaS解决了基础资源的交付和运维问题。例如:如果用户将服务器部署在自己的办公环境中,需要考虑场地、供电、制冷、网络和可靠性等一系列问题,但用户使用IaaS时,这些问题就由云服务商解决,且用户的使用成本可能更低。云计算的3种服务模式如图1-3所示。

图1-3 云计算的3种服务模式

用户在使用某种类型的云服务时,并不会关心其底层是如何实现和维护的,即服务的实现细节是被屏蔽的。此外,SaaS、PaaS和IaaS之间可以具有层次化的支撑关系,也可能是相互独立的。例如:知名的PaaS Heroku,是运营在亚马逊的IaaS(AWS)之上的。而知名厂商Salesforce,其服务内容主要为企业级的SaaS和PaaS,这些服务是独立开发和运营的,不借助外部的IaaS,其自身也没有提供IaaS。

云计算的4种部署模式为:公有云、私有云、社区云和混合云。一般来说,公有云面向社会公众提供服务;私有云一般面向某个组织机构提供服务;社区云一般面向多个组织机构组成的“联盟”或“社区”提供服务;混合云则是多个或多种云的资源结合起来提供服务。

知名的公有云服务商如阿里云、华为云、AWS等,他们通常以提供PaaS与IaaS为主。但云服务商一般不会基于这3种服务模式分类产品,而是按照计算、存储、数据库、大数据等应用类型进行分类,这样更便于用户选择,如图1-4所示,从左到右依次为阿里云、华为云、AWS。

图1-4 阿里云、华为云和AWS的云服务产品

1.3.2 容器化与微服务

在云计算中,为了提升资源利用率,以及实现多租户模型和快速交付等特性,通常会大量使用虚拟化技术,例如计算虚拟化、存储虚拟化和网络虚拟化等。其中典型的就是计算虚拟化,即通过相关技术将物理主机划分为多台相互隔离的虚拟机(Virtual Machine,VM)。这些虚拟机具有虚拟的硬件资源和独立的操作系统,用户可以像使用真实主机一样使用它们。用户在云中申请的计算资源,一般就是通过虚拟机交付的。

虚拟机可以通过模板(Image)方式快速创建。模板是指将虚拟机的配置内容和虚拟硬盘(已安装虚拟机的操作系统和软件、用户数据等)以文件方式进行打包存储。将模板复制到其他主机并基于虚拟化引擎运行,即可得到一个新的虚拟机。由于模板中包含操作系统等内容,其容量可能达到数GB甚至更大。

近些年来,一种新的轻量级虚拟化技术逐渐兴起,即容器化技术。容器化可以看作一种应用虚拟化技术或沙盒(Sandbox)技术,可以将应用及其所需的组件进行打包。打包后的容器可以在和打包环境相同的任何位置进行部署和运行(基于相同的容器引擎),部署过程可以看作简单的下载和解压缩。由于容器中只含有必要的软件组件,不含操作系统,因此其打包容量较小,一般只有几十到几百MB。虚拟机模型和容器模型的结构对比如图1-5所示。

图1-5 虚拟机模型和容器模型的结构对比

和虚拟机相比,容器具有轻量级、易于部署等优势,如果借助编排管理工具(如Kubernetes、Mesos和Docker Swarm等)和集群监控工具,还可以实现更多高级特性。例如:可以将容器化打包的Web服务、后台业务服务和NoSQL数据库下载到合适位置,再通过预先写好脚本等方式对其网络连接情况进行配置,从而实现自动部署。当数据量激增时,用户可以下载、部署新的NoSQL容器,从而实现自动横向扩展。当发现某个容器出现故障时,用户可以通过重新部署一个相同容器的方式实现自动故障恢复。

当前较为流行的容器化工具为Docker。Docker是由 dotCloud 公司在2013年推出的基于Linux容器(Linux Container,LXC)的开源容器引擎。和类似技术相比,Docker具有更好的易用性和更高的资源利用率等优势,因此自其诞生以来,就获得了业界的广泛关注。

包括NoSQL系统在内的诸多软件系统,均支持以Docker方式部署,这在一定程度上可以降低软件的部署和维护难度,并由此产生了“容器云”的服务模式。当前很多公有云都提供了容器云,且容器化趋势又催生了微服务、云原生(Cloud Native)等新概念。

微服务是一种分布式应用的架构模式,通常会以容器为载体。微服务将整个应用拆分为一组小的服务,每个服务独立构建,之间没有公共组件;每个服务独立运行,服务之间松散耦合,相互只能通过应用层网络接口进行通信;每个服务均被独立维护,包括修改、升级和横向扩展等,调用服务的实体不会关心服务内部是如何实现的。

云原生可以理解为充分发挥云计算优势的应用开发模式。云原生集成了容器化、微服务、自动化管理、持续集成和持续交付等概念。在云原生的理念下,用户可以实现更快速的开发、更灵活的调整和更频繁的版本迭代等,在互联网等行业中,这些特性意味着更强的创新能力和竞争能力。NoSQL具有灵活的数据组织方式和良好的横向扩展能力,其很容易以容器化方式封装,以微服务方式部署,并在云原生体系中充分发挥价值。

1.3.3 基于云的NoSQL服务

在经历多年发展之后,云计算目前已经获得社会各界的广泛认可,在互联网和物联网等领域得到了广泛应用。如今云计算已经成为一个发展迅速、规模巨大的产业。以公有云为例,一些调研机构的数据显示,2020年全球公共云服务市场收入总计3120亿美元,同比增长24.1%,而2021年上半年中国公有云服务整体市场规模达到123.1亿美元。

云计算对NoSQL的发展起到了很大的促进作用。例如:AWS是世界上较早出现的公有云服务,其早期的数据库服务中没有关系型数据库,只有一种NoSQL服务,即DynamoDB。

首先,云计算简化了NoSQL的部署和维护,提升了其扩展能力。

NoSQL具有出色的横向扩展能力,大多可以支持集群化部署,即由多个节点构成的分布式系统。但分布式系统通常也具有较高的部署和维护难度。而云计算借助虚拟化技术,可以实现基于模板进行批量部署和快速配置,大大降低了部署难度。此外,使用云计算还可以免去对底层硬件资源的准备和维护。

其次,NoSQL在云中更容易发挥横向扩展优势。

由于云计算采用了虚拟化和容器化方式提供资源,其提供的单位计算资源一般只有实际服务器的几分之一,且在扩展时不能超过实际服务器的能力上限,因此传统关系型数据库在进行横向扩展时可能会遇到瓶颈。而NoSQL大多具有良好的横向扩展能力,云计算由于其资源的集中化和池化特点,其横向扩展能力对单个用户近乎无限,更容易帮助NoSQL进行横向扩展。

此外,如果手动对NoSQL系统进行扩展或故障替换,若操作不当,可能造成数据库停机或数据丢失等问题。当前,几乎所有的知名公有云服务商和一些知名的NoSQL厂商,都提供了PaaS层的NoSQL数据库服务,或基于容器化部署的NoSQL服务,例如阿里云、华为云、腾讯云和AWS等,如图1-6所示。他们的很多产品还能够支持自动部署、自动扩展、自动优化,并具有良好的可靠性。用户可以快速便捷地使用这些NoSQL服务,仿佛在使用一个无限容量、无须维护且永远状态良好的数据库。

图1-6 阿里云(左)和华为云(右)提供的NoSQL数据库服务

当然,在构建非互联网应用时,可能需要在私有云(通常是IaaS)或非云环境下自主部署和维护NoSQL集群,甚至自主开发新的NoSQL系统。此时,基于Docker进行部署和维护成为一种可行的选择。

长期以来,NoSQL的部署和维护一直是难点,维护不当的NoSQL,可能存在性能低下、可靠性差和缺乏安全性等问题,并不能充分发挥优势。而对NoSQL进行部署维护,要求运维人员掌握一定的计算机网络、操作系统(特别是Linux)和分布式计算等知识,以及需要一定时间的经验积累。

云计算和容器化的兴起,使NoSQL的使用门槛大大降低,也使NoSQL在互联网等领域得到越来越广泛的应用。推荐读者在学习NoSQL开发的同时,尝试在公有云计算环境中使用NoSQL,以及学习一些Docker的基本知识,尝试以容器化方式部署和维护NoSQL。