作者 | 吕昭波

2006年,第一个云计算(Cloud Computing)产品诞生,云计算的概念也被提出,现在云计算几乎已经渗入所有的行业和应用场景中。我们不一定能直接感受到云计算对日常生活、工作、学习的影响,但作为IT基础设施,它却悄然支撑着我们正在使用的各个应用。

我们可以从另一个角度去认识云计算的整体架构和服务能力,也就是云计算架构体系,如图1-2所示,其中概括了云计算从下到上的组成结构,包括基础设施、云计算操作系统、产品体系(包含安全与合规、监控与管理)、解决方案体系、服务体系。

完整的技术架构设计也是有步骤可循的,先是收集需求分析,根据需求分析进行架构设计,再进行评估改进及交付实施,然后持续运营,如图1-6所示。在架构设计的各个阶段中,每个阶段均导入前一个阶段的结果,经过当前阶段处理后输出设计方案或搭建环境,渐进式地推进完整解决方案的设计。

(1)需求分析阶段由用户输入需求痛点,经过分析后输出需求分析表。

(2)在架构设计阶段中,根据需求分析表来匹配合适的设计模式,形成完整的架构设计方案。

(3)在评估改进阶段,对已完成的架构设计方案进行评估,输出经过评估和参考良好架构设计原则改进过的架构设计方案。

(4)在交付实施阶段,根据经过评估改进的架构设计方案在云平台中搭建环境、部署业务,提供符合架构设计的云端环境。

(5)在架构的持续运营中,输入解决方案和当前业务运行状况,持续巡检、分析、评估,输出改进措施,进行重构改进,并周而复始地根据新需求提供方案。

基于云计算进行架构设计,所有的技术解决方案都应遵循一定的原则,这也是架构设计中要追求的目标。图1-7所示为架构设计的6大原则,包括合理部署、业务持续、弹性扩展、性能效率、安全合规、持续运营。

这6大原则代表了架构设计中需要考虑的不同角度,只有同时遵循这些原则才能设计出完善的架构方案,但在实际情况中,并不需要在所有架构设计中把所有设计模式都融入进去,构建繁杂的架构方案。后面会对这6大原则逐一展开介绍,从各个原则的子项中进行设计。

合理部署

业务系统在公有云上的部署包括使用虚拟机形式的云主机,还包括性能更强的物理云主机形式,托管服务包括托管应用、托管物理服务器。

基于IT历史资源状况、合规性要求等,很多企业还没有上云,针对这种情况,将云计算操作系统抽取出来打包为独立的软件和服务,在用户的私有化环境中进行部署。区别于公有云面向“任何”用户开放使用,私有化部署仅面向少数指定的用户使用。

混合架构能够对公有云和私有化部署的平台、传统的VMware、OpenStack虚拟化平台或物理服务器等资源进行统一管理和调度,混合架构既享受了不变更本地环境、满足合规要求的好处,又享受了云平台资源丰富、服务能力充足等优势。混合架构也是当前企业转型上云的一种中间状态,会长期存在。

在跨境电商、游戏出海等场景下会使用到全球范围内的多个地域,将业务和数据靠近用户来部署可以减少网络延迟、提升访问体验。因此,纳入了全球部署,来重点解决如何在全球范围内尽可能靠近用户部署的问题,也能实现数据同步存储和处理的方案。

不能相信任何一块硬盘、任何一台云主机、任何一个可用区、任何一个地域,也不能完全相信任何一个云服务商,进行业务部署时应选择多个公有云平台,提升业务持续性,弥补单个云服务商在资源和服务上的短板,屏蔽云服务商的一些技术锁定和商业绑定。

业务持续

业务持续性主要是指高可用、高可靠、灾难恢复三方面,在设计模式中也是按照这个逻辑展开的。

  • 高可用(High Availability),是指当业务运行的资源出现故障时,通过冗余等设计来避免业务中断。

  • 高可靠(Continuous Operations),是指业务运行的资源无故障,业务可持续提供服务。

  • 灾难恢复(Disaster Recovery),是指当业务运行环境遭到破坏时,在不同环境中恢复应用和数据的能力。

在架构设计的每一层中都应实现冗余和业务持续性,没有冗余就意味着会出现单点,而单点一旦出现故障,就会造成局部服务终止。

  • 存储产品:块存储通过三个副本实现冗余,当一个副本出现错误时,通过其他副本来校验和恢复数据;对象存储中通过纠删码来实现数据冗余校验,提供可恢复能力;对象存储提供跨区域复制功能,避免单个地域成为对象存储的单点。

  • 备份方案:在云端通过跨可用区、跨地域的数据备份提升可靠性,避免只存储一份数据;在混合架构中将数据备份到云端,在本地环境数据损坏时,可通过云端备份文件进行恢复。

  • 容灾方案:对业务系统实现容灾,避免当前业务环境成为单点,提升整体业务的可用性和抗风险能力。

  • 高可用:通过跨可用区的负载均衡部署实现云主机和可用区的冗余;通过全局负载均衡实现跨地域、跨云平台的高可用。

弹性扩展

紧耦合的系统不容易扩展,在出现软件Bug和系统故障时难以排查问题,调用每个系统组件的压力各不相同,小问题逐级放大,容易造成整个业务中断。要保持系统弹性扩展,首先要进行系统组件的解耦,包含动态数据和静态数据解耦,解耦后的组件可实现功能单元化,各司其职。

解耦之后再对组件和服务进行扩展,即计算资源的纵向扩展、横向扩展和自动伸缩,包括数据库层的扩展,还有通过混合架构延展本地环境的计算、存储备份、安全防护、产品服务能力。对应用和数据的迁移也算作整个系统的扩展,从一个环境迁移到另外一个环境,系统应保持弹性扩展,在需要迁移时能够快速实施迁移。最后还要进行均衡,组件解耦、资源和服务扩展之后需要统一的接入入口,以屏蔽底层解耦与扩展带来的接口不统一等问题,将这些都纳入均衡和全局负载均衡中来介绍。

在各个层面实现解耦,通过消息队列来解耦组件之间的通信,并解耦事件;通过Redis等共享存储实现状态数据与计算资源的解耦;采用云主机部署业务应该面向服务而非资源,将资源与业务解耦;存储实现弹性可挂载和可卸载的云硬盘,采用可绑定和解绑定的EIP;通过DDoS防护、WAF防护等解耦安全防护与计算资源;使用原生的计算能力、存储能力将业务与云平台的特性解耦,实现业务在多个云平台中的可扩展。

组件解耦是实现可扩展的前提,可通过以下方式进行解耦。

  • 保持无状态,将状态数据存储到Redis中。

  • 放到负载均衡中,扩容、缩容不影响整体业务。

  • 通过消息队列、API Gateway解耦,生产者、消费者可扩展且互不影响。

  • 实现业务的全局负载均衡,后端业务能够在混合架构、多云环境中进行扩展

性能效率

非常多的解决方案和案例中都涉及高并发、流量激增带来的对性能的挑战,在性能效率中,主要目标是发现和提升应用的性能,提高资源和组件的效率。

首先是计算性能,通过采用高配置的云主机或物理云主机来提升单机性能,通过集群形式扩展整体服务性能。

其次是存储和缓存,通过Redis来缓存热点数据、存储临时状态数据,在内存中进行计算能够提升业务性能。在每一层使用缓存,通过CDN缓存静态文件,对没有命中的文件进行回源;通过Redis缓存数据库,加速数据库的访问;通过Redis缓存热点配置文件、热点数据,提前加载,减少访问时间。

再次是对网络性能的优化,在业务实现全球部署时选择最优数据中心,并且基于全球基础网络、CDN及全球应用加速来提升网络性能,获得请求加速效果。

最后介绍应用性能监测和压力测试,从应用的角度上来评测当前的性能状况、发现问题瓶颈,并针对性地解决问题。

安全合规

安全合规一方面是为了满足业务安全防护的自身需求,另一方面是满足安全监管的合规要求,在具体实施时会将这两方面交叉在一起。

首先,从用户账号和权限管理切入,为合适的人员分配恰当的账号、角色,授予最低权限,对于通过API或CLI来访问的程序或人员分配恰当的公钥、私钥和权限,对于临时访问的对象存储文件Token等也进行严格管理。其次,还有在整个安全体系中的终端安全、数据安全、网络安全、应用安全,以及对日志、行为、数据库操作的审计。最后,还有等保2.0的要求、网站备案要求、满足GDPR等各地区对业务和数据隐私要求的制度等。

  • 在账号体系中设置主账号、子账号,并对公钥、密钥进行管理;设置合适的角色,为账号、角色分配所需要的最低权限。

  • 通过ACL控制网络访问;通过安全组限制云主机开放的端口等;通过子网和路由控制跨子网的通信。将数据库及只需要内部访问的云主机配置到内网VPC中,设置允许访问的VPC,设置为不连通外网。

  • 防止DDoS、cc、SQL注入、XSS等攻击。

  • 安全审计,保留访问日志、操作日志,逐步实现低频存储、归档存储等。

持续运营

云平台提供的资源与服务均有SLA,云主机的SLA通常为99.95%,用户构建的业务系统都是基于云资源和云服务的SLA,在此之上构建可用性、可靠性更高的业务系统。对于自身业务系统,也需要制定SLA来表明服务可用性或其他指标,制定了用户业务的SLA后,就可以按照SLA阈值来设置高可用限流值,综合评估整体业务的服务可用性和数据可靠性,并指定故障应急措施。

在持续运营中会对云资源、云服务、事件及用户的应用进行监控,并设置告警,在达到告警条件时,通过电话、短信、邮件、钉钉、微信等方式通知相关人员,将告警交给回调函数,可实现自动化故障处理或相应的应急预案,减少人工介入。

应该在架构设计的每一层进行监控与告警,包括对云资源、事件、应用运行状况的全方位监控。对于用户自定义的需要监测的资源与服务,需要配置合理有效的告警策略来及时发现异常情况。通过Advisor实现云平台巡检,持续监测资源的变化,持续定期评估业务架构,及时发现业务架构是否还匹配业务需求。

此外,还需要具备自动化响应及处理功能,自动伸缩能够通过监控CPU等指标自动扩容或缩容云主机数量;通过定时器固定周期扩容或缩容云主机数量。实现事件驱动响应,由事件消息触发执行脚本、回调函数等操作,实现智能运维,根据事件和告警自动触发运维操作,编排运维脚本,通过智能运维的方式来减少人工运维。

及时发现消费及业务成本的变化,并对成本进行优化。设置账户余额告警值,避免快速消费,实现成本控制。评估资源使用时长,将按时计费的资源转变为按月、按年计费,优化资源的使用。通过Advisor中建议的成本优化释放没有使用的EIP,根据CPU等指标来减少云主机数量或降低云主机配置,云主机处理对象存储时通过内网进行访问,减少外网访问的流量费用。通过多云部署实现成本优化,综合多个云平台的资源价格选择资源,选用较优的组合方案,通过其他云平台更低单价的竞价实例云主机来处理OLAP的业务。

云计算架构设计6大原则,你遵循了吗?| 赠书相关推荐

  1. 云计算架构设计6大原则,你遵循了吗?

    2006年,第一个云计算(Cloud Computing)产品诞生,云计算的概念也被提出,现在云计算几乎已经渗入所有的行业和应用场景中.我们不一定能直接感受到云计算对日常生活.工作.学习的影响,但作为 ...

  2. 【设计模式系列24】GoF23种设计模式总结及软件设计7大原则

    设计模式总结及软件设计七大原则 设计模式系列总览 前言 软件设计7大原则 开闭原则(Open-Closed Principle,OCP) 里氏替换原则(Liskov Substitution Prin ...

  3. 面象对象设计6大原则之六:迪米特原则

    转载自 面象对象设计6大原则之六:迪米特原则 迪米特原则(LOD),The Law Of Demeter,也称为最少知识原则 定义 一个对象应该对其他对象有最少的了解. 也就是说一个类耦合和调用一个类 ...

  4. 面象对象设计6大原则之五:依赖倒置原则

    转载自 面象对象设计6大原则之五:依赖倒置原则 依赖倒置原则(DIP),The Dependency Inversion Principle 定义 1.高层模块不应该依赖低层模块,两都应该依赖于抽象. ...

  5. 面象对象设计6大原则之四:接口隔离原则

    转载自 面象对象设计6大原则之四:接口隔离原则 接口隔离原则(ISP),The Interface Segregation Principle 定义 客户端不需要强迫依赖那些它们不需要的接口. 类与接 ...

  6. 面象对象设计6大原则之三:里氏替换原则

    转载自 面象对象设计6大原则之三:里氏替换原则 里氏替换原则(LSP),The Liskov Substitution Principle 定义 所有引用基类的地方必须能透明地引用其子类的对象,即子类 ...

  7. 面象对象设计6大原则之二:开放封闭原则

    转载自 面象对象设计6大原则之二:开放封闭原则 开放封闭原则(OCP),The Open Closed Principle 定义 一个软件的实体,包括类.方法.模块.应该对扩展开放,对修改关闭. 也就 ...

  8. 面象对象设计6大原则之一:单一职责原则

    转载自 面象对象设计6大原则之一:单一职责原则 单一职责原则(SRP),The Single Responsibility Principle 定义 一个类的修改只能有一个被修改的原因. 通俗地讲,就 ...

  9. 软件系统架构设计的六大原则

    软件系统架构设计的六大原则 1.单一职责原则(SRP) 2.开放封闭原则(OCP) 3.里氏替换原则(LSP) 4.最少知识原则(LKP) 5.接口隔离原则(ISP) 6.依赖倒置原则(DIP) 1. ...

最新文章

  1. private关键字和构造方法
  2. nginx反向代理监听非80端口造成的端口丢失解决方案
  3. RRDTool学习资料备忘
  4. linux 使用paho C库实现mqtt客户端
  5. 阿里云图数据库GDB V3引擎发布,加速开启“图智”未来
  6. mocha 测试 mysql_node项目mocha自动化测试的疑问
  7. mongodb多条件查询
  8. JavaScript的组成
  9. 使用 Selenium开展Web测试
  10. python简单代码示例-python3简单代码示例
  11. win7 java修复工具哪个好_DLL修复工具哪个好
  12. 第二章 SQL命令参考-BEGIN
  13. qt+mysql开发提示driver not loaded driver not loaded
  14. 斑马打印机ZPL语言和EPL语言的区别是什么
  15. python数据处理方法
  16. 陈平,温铁军视频思想笔记
  17. Java网课基础笔记(4)19-07-16
  18. num2str(matlab自定义函数)
  19. 268. Missing Number(缺失数字)
  20. Python串口操作纸币器1

热门文章

  1. 【LeetCode笔记】剑指 Offer 06. 从尾到头打印链表(Java、翻转链表)
  2. 【LeetCode笔记】62. 不同路径(Java、动态规划)
  3. java打印已经被加载的类_使用URLClassLoader加载类,不会报错,但被加载类中的内容也没有打印出来...
  4. python列表的表示形式_python 列表推导式
  5. dos虚拟机如何全屏显示_实用工具 | 虚拟机软件VirtualBox详细使用介绍
  6. oracle 几个字段中某个字段大于0其他字段不再进行统计?_如何深入理解MySQL 8.0直方图?...
  7. 戴琼海:人工智能的几点思考
  8. 华为为什么要“囤”700名数学家,中科院院士告诉你
  9. 你不是不擅长数学,你只是打开方式不对
  10. 当你拼命挣死工资时,他们已抢占2018年最火爆高科技赚钱项目......