云上架构
传统服务器的架构与弊端
在互联网发展的早期,云原生还未兴起的时候,企业需要对外服务,通常是自行购买搭建或者租用服务器,独立组建运维团队维护各类的基础设施。从机型选择到场景性能需求选型,这些前期工作投入成本大,且学习和维护成本较高,对于绝大多数的公司来说,是一笔不小的开支。在这些前期工作完成之后,就需要运维人员进行部署。
接下来我们用一个常见的 Web 应用程序模型来说明传统网络部署,这个模型实现了最小的一个三层网络架构。
在这个模型中,我们可以看到,架构被分为前端网页层、后端应用层和数据库层,是一个典型的三层网络。
图中最上面的一层,是外部的防火墙,通常是由硬件或软件配置的,开放 80 端口(HTTP)和 443(HTTPS)端口。异常的访问被 Firewall 防火墙阻挡之后,正常的流量请求就会进入到负载均衡中。负载均衡通常由硬件或者软件构成,如著名的 F5 硬件负载均衡,或者你也可以配置 Nginx 等软件负载均衡。
在经过负载均衡后,流量才真正打到 Web Server 层,处理用户的请求。在 Web Server 层中,会存在大量与后端交互的服务请求、各种逻辑请求及交互访问,这些都需要后端服务器处理。所以,接下来我们需要部署后端 App Server 服务器。
但在这之前,我们同样也要对其后端进行负载,均衡其流量。在这一层面的负载均衡,我们称之为“应用层负载均衡”,它是对内部的请求进行转发,通过一系列的逻辑,将流量分发到不同的 App Server 中。而无论是前端 Web Server 层,还是后端 App Server 层,都需要根据业务和流量的需求去设计和部署一定的机器。
最后,就是我们非常熟悉的 DB 数据库层了。数据库可以说是最重要的一个环节,所有用户的数据都应落盘在数据库中,并进行持久化保存和备份。通常我们的方案是至少一主一备的数据库,主、备分别部署在不同的服务器中,防止出现单点故障。
到现在,我们已经简单地部署好了一个相对安全的最小系统的 Web 架构。从一开始的设计到最后的落地,从物理机器购买,到安装配置、部署等,每一件都是费时费力的事。所以,传统架构的第一个弊端就是,前期投入成本极高,系统弹性却极低。
如果说上述的第一个弊端企业还能通过时间和人员的投入来解决,那么第二个弊端则给企业带来更大挑战。
通过上述设置,我们会发现,企业往往会部署不止一台服务器,通过这种方式来防止单点故障。但如果是这个地区中的整个机房都发生了故障,比如说断电或者外力原因导致宕机,那么同一个数据中心的所有服务器都将无法访问。所以线下部署的另一个弊端就显现出来了——无法满足地区级别的高可用需求,故障转移难度大。
总结一下云端的优势,这里我梳理出了几个关键词:弹性、高可用、易扩展、成本低、“免”运维。
云端服务器的架构与资源
在我提到这些优势之后,我想你已经迫不及待的想知道,在云原生时代,怎样将刚刚的三层网络架构迁移部署到云端。下面我们就以云行业佼佼者 AWS 云为例,对照着刚刚那张三层网络模型图,讲一讲对应的云服务及其之间的联系。
这是一张 AWS 云上架构图,从总体结构上来看,你会发现,云上架构模式其实和线下架构的非常相似,也是由 Web Server 层,App Server 层及 DB 层组成。从某种程度上看,线上架构与线下架构在设计思路上是没有太大区别的,都是从外到内、由表及里的结构。
现在,我们来具体说一说,每个服务对应的不同云资源。
首先,在云服务器中最核心的就是计算资源了。在云端,我们将其称为 EC2(Elastic Compute Cloud),它是一种弹性的计算资源。我们可以直接在控制台中,或者用 API 的方式,经过简单的 CPU、内存、磁盘等选型,在几分钟内开通一台或多台服务器,通过这种方式就可以组建 Server 服务了。并且这些服务器是按使用时长计费的,当我们不使用时,就可以释放资源,这就避免了服务器的浪费。
其次是我们的数据库,它也可以直接从云端购买。在 AWS 中,数据库被称作 RDS(Relational Database Service),它不是某个数据库的名称,而是一系列关系型数据库的统称。在选择数据库时,我们也可以根据需要选择不同的类型,如 MySQL、PostgreSQL 等。
由于云上数据库属于 PaaS 级别的服务,因此我们不需要过多地关注其底层搭建,AWS 会自动的在他的后台中以“黑箱”的形式给你开出一个数据库。这个数据库,不仅可以通过多 AZ(Availability Zones)可用区的形式来实现高可用,还可根据你存储的数据量大小,在存储空间即将满容量的时候,按照设置自动地进行扩容,来保证我们的业务正常运行。
如果说你对服务器和数据库还较为熟悉的话,那么对于 ALB、IGW 及 NAT GW 可能会较为陌生,不用担心,接下来,我会逐一介绍这几个服务,顺序则是由浅入深。
ALB 就是负载均衡器(Load Balancer),在亚马逊云中,负载均衡分为面向四层的负载均衡器(NLB)、面向七层的负载均衡器(ALB)及网关负载均衡器(GLB)。由于我们部署的是对外的 HTTP/HTTPS 端口,因此我们选择七层的负载均衡器来帮助我们对后端的两个不同区域的 EC2 进行负载均衡,将流量打到不同的服务器上。
当配置好了负载均衡器和服务器后,我们就要考虑流量的出入了。其实,网络这一层,在实际的架构设计时应当是最先规划的,而这节课为了便于你理解,故放在了此处进行说明。
所有的云服务,都逃不开网络。在云端的网络,我们称之为 VPC,虚拟私有云。如果把云中的各种云服务比作器官,一个架构比作一个机体,那么 VPC 就是它的血液,它贯穿于整个机体中,为云上服务提供连接的作用。
在该架构中,我们部署了两类子网,公有子网与私有子网。后端的服务器部署在私有子网中,确保环境的安全;前端的 ALB 部署在公有子网中与外网互联,起到承上启下的作用。
在流量导向图中,外网的流量都要经过一个叫 IGW 的组件,这个组件能够让 VPC 内的服务器与外网双向互通。
但有时我们又会有这样的需求:私有子网不具备被公网访问的能力,但又要求有主动访问公网的能力,如进行 yum 的安装、更新等,这时我们就需要加上一个 NAT Gateway。NAT Gateway 可以实现 EC2 能主动访问公网资源,而公网不允许直接访问 EC2,这在 EC2 需要链接外网进行资源的下载升级,却又不允许有公网 IP 时,极其方便。
最后,我们在公有子网中部署一个堡垒机。一方面,它可以作为跳板用于运维人员的登录管理;另一方面,通过对堡垒机的一些设置,可以实现等保审计等一系列安全需求。
至此,一套高可用、最小云上网络架构就部署好了。然而,这并没有万事大吉,实际操作中还有更多的问题需要解决,比如,如何做路由管理,如何保证 Web 的安全,如何做更好的弹性伸缩,这些都是我们需要考虑的。