云基础架构设计模式简单易懂
首先
这篇文章是关于《Amazon Web Services云设计模式设计指南》这本书的阅读笔记。
由于我更多地涉及GCP,所以我希望能总结出适用于AWS或GCP的常见云基础架构用例,即使它们具有抽象性。
基本 – ji ben
快照
只需一个按钮或命令,便可对服务器内容进行备份。
邮票
可以将创建实例时的设置(如服务器规格、操作系统、安全规则等)模板化,以便可以大量生产相同的实例。
扩大规模
可以调整CPU、内存等规格。甚至在创建后也可以进行更改。
按需磁盘
AWS:EBS(一种虚拟磁盘服务)和GCP:Google Compute Engine 的磁盘都可以扩容或缩减容量。
构建能承受负载的基础设施
多服务器,多数据中心
创建多个实例,并使用负载均衡器来分配处理。负载均衡器定期对每个实例进行健康检查。因此,即使有一个实例出现故障,只有活跃的服务器才会分配处理,以确保用户端不受影响。系统可以持续运行。
可以选择世界各地的数据中心来构建实例的物理服务器。
即使在新加坡地区发生灾难使数据中心无法正常运作,只要在台湾地区也放置了实例,服务仍可以继续运行。
浮动 IP
当有障碍或维护需停止服务器时,有时会将备用服务器投入运行。在这种情况下,需要重新配置以将主服务器的IP分配给备用服务器,或者通过DNS等方式更改指向。云服务还提供IP地址配置服务,因此可以更轻松地进行更换,仅需几秒钟的时间即可完成。
AWS:弹性IP地址
GCP:VPC网络 > 外部IP地址
深度健康检查
LVS的健康检查方法有很多种,但是在传统方法中,LVS只能监测自身关联的Web服务器的活动状态,无法了解Proxy服务器和数据库服务器的状态。
云端的LVS服务功能可以进行程序检查,例如PHP和Java Servlet等,因此可以检查整个系统的运行情况。
扩展规模
如果对LVS进行管理的服务出现超过预设阈值的负载,可以自动设置增加或减少服务器的配置。
克隆服务器
将不预先考虑扩展的现有服务转化为能够进行类似于扩展的负载均衡的系统。
预先从主服务器创建克隆,并根据负载启动克隆实例。通过与主服务器同步磁盘来使服务可用。
(关于扩展和克隆服务器等负载均衡相关的注意事项实在太多,用两三行无法完全表述。)
NFS共享
在负载均衡时,关于类似于scaleout和clone server的内容同步方法。需要准备一个管理共享内容的NFS服务器,并让每个实例都以参考NFS服务器的方式进行操作。
NFS复制
当进行对负载进行分散的时候,可以让承载在LVS上的每个Web服务器定期地使用rsync等工具复制类似于挂载并复制NFS服务器的内容并拥有它。当需要参考时,从自己拥有的副本中进行参考。
国家共享
当在构建lvs时,假设一个服务器出现故障。为了防止该服务器独自拥有的信息(例如,用户访问信息)丢失,我们想要采取措施。
我们希望在耐用性高的服务器中共享所需管理的状态信息。每个web服务器将从该位置引用状态信息。
aws:Elastic Cache(内存缓存),DynamoDB(键值存储)
gcp:cloud Datastore(键值存储)
* 在撰写本文时,gcp还没有内存缓存服务。app engine可以使用memcache。
URL重写
大部分的网页服务访问是请求静态内容,比如HTML和图像之类的。如果能够成功分散静态内容的访问,就可以减少可扩展实例的数量,从而节省费用。
在这种情况下,可以利用云服务提供的互联网存储。将目标内容上传到存储中,并将引用指向存储的URL,从而减少对Web服务器的访问次数。
AWS:S3
GCP:Google Cloud Storage
这种方法还可以避免全球内容分发时由于位置造成的延迟。(因为可以让用户从最近的服务器引用内容)
重写代理
在将原本存储在web服务器上的静态内容转移到存储服务时,需要修改现有系统,例如替换URL。为了无需修改现有系统而更改引用的目标,可以在现有系统之前设置代理服务器。代理服务器会应用内容内URL的重写规则。此外,为了防止代理服务器成为单点故障,还需要实现冗余功能。
缓存代理
在普通的Web服务器前部署安装了类似Varnish的缓存服务器软件。通过在具备高性能的服务器上进行内容分发,直到分发期限过期,可以实施高负载处理。此举还可以确保缓存服务器不会成为SPoF(单点故障),从而实现冗余化。
安排扩容时间表
如果了解高负荷时段,就只需针对该时段进行横向扩展。
提供静态内容的分发
网络存储
當想要傳送容量較大的影片等檔案時,應該放置在像是S3的儲存空間中,而非從web伺服器進行傳送。這樣一來可以解決web伺服器網路負載和儲存空間的問題。
直接托管
使用类似上述的存储作为服务器,托管HTML、CSS、JS等等。
私人分发
当想要将信息仅限制发送给特定用户时,
通过发放带有限制的URL的功能,为每个用户生成并允许访问相应的URL。该功能由存储服务提供。可以通过设定有效期限和IP地址来加以限制。(云存储服务同样如此。)
缓存分发
在多个地点建立内容分发缓存服务器。通过确保服务器尽可能靠近用户以便分发内容,从而提高用户体验。可能出现更改反映延迟的情况。
更改发行名称
解决问题:缓存更新时间长的对策。
通过更改所需更新内容的文件名,使得URL本身也发生变化。这样,由于获取源已经更改,不再返回缓存,而是立即前往源服务器进行获取,从而实现内容的快速更新。
私人快取分发
如果在全球范围的服务中,只想向特定用户提供内容时,可以利用CDN提供的“带签名的URL认证功能”,来生成基于详细条件(如访问来源IP和地区)的URL。
用户认证将在我们的系统中进行,而不是在存储上进行,但内容的分发将在CDN上进行。
上传数据
写代理
网络存储在读取数据的容量和数据耐久性方面很高,但由于备份存在于多个服务器上,因此对大数据的写入较弱。
为了解决大数据写入问题,可以在客户端和存储之间插入虚拟服务器。虚拟服务器和存储之间可以使用除了http/https之外的高速协议,也可以通过专用线路进行通信。
存储指数
互联网存储可能没有提供高级搜索功能。因此,在想要获取特定用户或日期的数据时,需要准备KVS服务器,并在存储数据时插入元信息。
当需要搜索和获取存储的数据时,在KVS服务器上进行搜索,并确保可以访问到获取的URL。
直接上传目标对象
如果是一个接收许多用户上传照片和视频的照片/图像共享网站的情况,那么很难应对网页服务器的上传负载。在这种情况下,与写代理模式相反,最好将上传处理交给存储。上传到存储后,通过向网页服务器发送完成通知,可以使图像在实例之间共享更容易。
使用关系型数据库
数据库复制
在云端,可以轻松设置跨地理位置的数据库复制。
阅读 复制
在读取较多的服务中,会要求使用专门的副本进行读取操作。
通过分散读取操作,可以减轻承担写入和更新任务的主服务器的负担,从而提高整个系统的性能。
内存中的数据库缓存
如果您想提高数据库的读取性能,有一种方法是将经常被读取的数据缓存在内存中。
亚马逊云:弹性缓存
谷歌云平台:虽然在”状态共享”的章节中也提到过,但可能只有在应用引擎上才能在谷歌云平台上实现。
经常被缓存的数据的常见示例包括查询结果或复杂计算结果等需要花费时间的数据。
数据库分片写入
在希望提高多个数据库的写入性能时,可以采用分片(sharding)的方法。这意味着准备多个具有相同结构的数据库,并根据适当的表列作为键来进行分割和写入。
通过使用云服务,还可以实现更高可用性和更高的运营效率的分片操作。
AWS:在EC2上安装包含Spider存储引擎的MySQL服务器等分片软件。
GCP:使用Cloud Spanner进行分片。
进行批量处理
排队链
在中文中,连锁处理应该采用松散耦合。例如,像“图片上传->保存->编码->生成缩略图”这样的处理。在各个实例间进行处理,并使用消息队列服务来传递数据。
通过异步处理,可以立即返回响应。
AWS:SQS
GCP:Cloud Pub/Sub
优先级队列
对于具有多个优先级的批处理作业(例如,付费会员可以更快地观看视频等),将根据优先级数量准备相应数量的队列。处理性能将按照优先级进行设置。
工作观察者
当负载均衡批处理服务器时,需监控请求量,并据此增减虚拟服务器数量。
自动调度自适应扩展功能
由于批处理作业执行的时间通常很短,因此可以利用云计算的调度机制,在那个时间段内启动或调整服务器的数量。
遵循保守的做法
引导
在应用Stamp模式时,如何以多大的频率获取机器镜像是一个问题。当中间件到应用程序的所有设置都已经完成时,只需获取并启动镜像,系统就可以立即运行。但如果中间件升级了一个版本,可能会导致需要重新创建机器镜像。
云计算中的机器可以在启动时传递参数。如果在启动时服务器自行获取设置,然后进行安装、配置和启动,就可以避免重新创建镜像的情况发生。
云数据集成
在构建大量服务器时,例如在扩容或自动扩展模式下,引导模式很有效,但如果存在许多外部信息(如连接到数据库的IP和服务器名称等),则可以使用cloudDI模式更灵活地初始化服务器。
可以针对通用的引导模式进行特定的配置。
堆栈部署
不只是单个实例,而是可以将构成系统的服务器群的启动也进行模板化。
在想要构建的环境中,将所需的云组件记录在模板中,并根据此进行环境构建。
aws:云形成。通过使用云形成工具,甚至还可以从现有系统创建模板。
gcp:computeEngine > 实例模板。
服务器更换
在发生故障时,通过将虚拟服务器的磁盘更换到另一台服务器来进行处理。
监控整合
通过云监控工具来监视虚拟服务器,并通过自有机制来监视超过操作系统层。通过利用云监控工具的API来实现监视的集中化,从而解决监视的复杂性。
网络存储档案
大量的日志、备份等数据的存储最适合使用云存储。由于无需进行磁盘扩展的维护和前期的容量规划,更加经济实惠。
体重转变
当系统需要无停机迁移时,可以利用云端DNS服务的加权轮询功能。在域名解析时,将10%的访问流量从现有系统转移到新系统,如果没有问题,逐渐增加比例,以最小程度的DNS运维来完成系统的迁移。
建立网络
按需网络地址转换
在需要进行操作系统更新等不常连接互联网的服务器临时开启NAT功能时,可以通过在虚拟服务器上实现NAT,并在需要时启动它,并将其他目标服务器的子网指向NAT服务器进行配置。只在NAT服务器运行期间会进行NAT的计费,因此性价比也很高。
背网
为了增强web服务的安全性,管理系统等,设置了公开的web服务并配置了普通用户和管理员两个网络接口,使得SSH和日志只能在私有网络中进行。
功能防火墙
云防火墙可以将规则进行分组,使得可以按照功能单元(例如Web服务器或数据库服务器)进行设置并应用到服务器上。
操作性防火墙
云防火墙可以通过规则分组,以便在开发、基础架构等组织单位中进行设置,从而实现对组织相关的访问限制的统一管理。
多重负载均衡器
当希望使Web应用程序在多种设备上兼容时,需要为每个设备设置配置的LVS(Linux Virtual Server)来实现这一目标。
WAF 代理
WAF(网站应用防火墙)- 可在Web服务前引入并进行通信分析和检查,保护免受试图利用漏洞进行非法登录的访问。用于处理信用卡等敏感信息的网站可以引入WAF来提高安全性。
但在云环境下,由于扩展性等原因,往往难以实施。将代理服务器置于上游并安装WAF可以实现高效运营。
云中枢
关于VPN连接方式。如果使用全网状连接,随着基地增加,维护工作将变得非常复杂。
相比之下,星型连接可以简化维护工作,但一旦中心枢纽出现问题,前面的基地将无法使用VPN,可用性就成为了问题。
借助云端VPN的枢纽,建立起来也方便,并且由于按使用量计费,成本效益也很好,从而解决了以往的问题。