每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你能一次又一次地使用该方案而不必做重复工作
常用模式有:
1. 分层
将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成一个完整系统。
大型网站将网站系统分为:
分层好处:
挑战:
分层结构内部还可以继续分层,如应用层可以分为视图层和业务逻辑层。在物理部署上,三层结构可以部署在同一个物理机器上,但随着业务发展必须对分层的模块隔离部署。
2. 分割
分割按纵向方向对软件进行切分,将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,这些单元或模块可以独立部署。存在的好处有:
3. 分布式
对于大型网站来说,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协调工作。
分布式在解决网站高并发问题的同时也带来其他问题:
分布式方案有几种:
4. 集群
集群即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。一个应用由多台服务器提供,当某台服务器发生故障时,负载均衡设备或系统的失效转移机制会将请求转发到集群中其他服务器上,使服务器故障不影响用户使用。
5. 缓存
缓存是将数据存放在距离计算最近的位置以加快处理速度、同时减轻后端应用和数据存储的负载压力。数据缓存有两个前提:
一般缓存包含多个方面:
6. 异步
计算机开发的一个重要目标和驱动力是降低软件耦合性。 系统解耦的手段除了分层、分割、分布等还有一个重要手段是异步。
单一服务通过多线程共享内存队列的方式实现异步。在分布式系统中,多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看作内存队列的分布式部署(如消息队列kafka)。
异步消息队列有以下特性:
7. 冗余
想要保证在服务器宕机的情况下网站依然可以继续服务,不丢失数据,就需要一定程度的服务器冗余运行,数据冗余备份,这样当某台服务器宕机时,可以将其上的服务和数据访问转移到其他机器上。
数据库除了定期备份、存档保存,实现冷备份外,为了保证在线业务高可用,还需要对数据库进行主从分离,实现同步热备份。
8. 自动化
在无人值守的情况下网站可以正常运行,一切都可以自动化是网站的理想状态。包含:发布过程自动化、自动化代码管理、自动化测试、自动化安全检查、自动化部署、自动化监控、自动化抱紧、自动化失效转移、自动化失效恢复、自动化降级、自动化分配资源。
9. 安全
可以从以下几个方面考虑:密码、手机校验码、通讯加密、敏感信息过滤、风险控制。
架构是最高层次的规划,难以改变的决定。这个规划和决定奠定了事物未来发展的方向和最终的蓝图。
软件架构是有关软件整体结构和组件的抽象描述,用于指导大型软件系统各个方面的设计。系统的各个重要组成部分及其关系构成了系统的架构,这些组成部分可以是具体的功能模块,也可以是非功能模块的设计与决策,他们相互关联组成一个整体,共同构成了软件系统的架构。
一般除了当前系统功能需求外, 软件架构还需要关注性能、可用性、伸缩性、扩展性和安全性5个要素。
性能是网站的处理效率、通过一系列指标去衡量,重要的有响应时间、TPS、并发数、吞吐量等。
优化可以从以下几个方面进行:
可用性:当服务器宕机的时候,服务或应用依然可用。主要衡量标准一个系统设计是否满足高可用的目标,就是假设系统中任何一台或多台服务器宕机时,已经出现各种不可预期的问题时,系统整体是否依然可用。
高可用的主要手段是冗余。
伸缩性是指通过不断向集群加入服务器的手段来环节不断上升的用户并发访问压力和不断增长的数据存储需求。主要衡量标准是:
主要策略有:
不同于其他架构要素主要关注非功能性需求,网站的扩展性架构直接关注网站的功能需求。网站扩展性的目的是如何设计网站架构使得其能够快速响应需求变化。主要衡量标准是:
扩展性架构的主要手段是事件驱动和分布式服务:
网络安全主要是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。衡量标准是针对现存和潜在的各种攻击和窃密手段,是否有可能的应对策略。
性能测试反应系统在实际生产环境中使用时,随着用户并发访问数量的增加,系统的处理能力。与性能对应的是用户访问的等待时间(系统响应时间)。
应用服务器是处理网站业务的服务器,其主要优化手段有缓存、集群、异步等。
1. 分布式缓存
缓存指将数据存储在相对较高访问速度的存储介质中,以供系统处理,缓存的本质是一个内存Hash表,读写时间复杂度为O(1)。缓存有以下优点:
缓存主要用来存储那些读写比很高、很少变化的数据。应当合理使用缓存:
缓存雪崩本质是一些访问请求不经过Redis而突然全部请求到数据库,导致数据库压力陡增,造成压力太大而宕机。 一般有两种原因导致:
- 缓存服务崩溃或不存在备库,某台缓存服务器挂了。----解决方案是冗余、热备服务器。
- 很多缓存数据都设置了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。 -----解决方案:将缓存失效时间分散开(因过期时间)
分布式缓存架构分为两种:
远程通信设计需要考虑两个元素:
Memcached采用TCP协议,其序列化协议则是一套基于文本的自定义协议,以命令关键字开头,后面是一组命令字操作数。
2. 异步操作
使用消息队列调用异步化,可改善网站的扩展性,还可以改善网站的性能。
3. 使用集群
使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓慢,使用户请求具有更好的响应延迟特性。
4. 代码优化
合理优化业务代码,可以很好地改善网站性能。
5. 存储优化
机械键盘: 通过马达驱动头臂带动磁头到指定的磁盘位置访问数据。数据连续访问和随机访问移动次数相差巨大,性能表现也比较差。
固态硬盘: 没有机械装置,存储在在可记忆的硅晶体上,可以像内存一样快速随机访问。
B+树: 为了改善数据访问特性,加快速度检索速度,需要保证数据在不断更新、插入、删除后依然有序,传统的做法采用+树。
LSM: 可以看作是一个N阶合并树。数据写操作(包括插入、修改、删除)都在内存进行,并且创建一个新记录。(修改会记录新的数据值,删除会记录一个删除标志),这些数据在内存中仍然是一颗排序树,当数据量超过设定的内存阈值后,会将这棵排序树和磁盘最新的排序树合并。当这棵排序树的数据量超过设定阈值后和磁盘上的下一级排序树合并。合并过程中会使用最新更新的数据覆盖旧的数据。在需要进行读操作时,总是从内存中的排序树开始搜索。如果没有找到,就从磁盘上的排序树顺序查找。
RAID
HDFS: 按块(block)为基本单位存储,一个块数据三个备份。
可用性度量:4个9
网站不可用时间(故障时间)= 故障修复时间点 - 故障发现(报告)时间点 网站年度可用指标 = (1 - 网站不可用时间/年度总时间) * 100%
高可用架构设计的目的就是抱着服务器硬件故障时服务器依然可用、数据依然保存并能够被访问。主要的手段是数据和服务的冗余备份及失效转移。
1 高可用应用
集群中的session管理方式:
2 高可用服务
也是基于服务的无状态,还有几点高可用服务策略:
3 高可用数据
高可用数据有以下几个层面的含义:
保证数据存储的高可用手段主要有数据备份和失效转移机制。
CAP原理:系统无法同时满足数据一致性(Consistency)、数据可用性(Availability)和分区耐受性(Partition Tolerance,系统具有跨网络分区的伸缩性)
数据一致性分为如下几点:
网站发布
运行监控
所谓的伸缩性是指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或缩小网站的服务处理能力。
网站伸缩性设计可分为两类:
应用服务器应该设置为无状态,任何一台服务器的处理结果都是相同的。这样用户请求按照某种规则分发到集群的不同服务器上,可构成一个应用服务器集群。常用的负载均衡设备有:
负载均衡算法:
和应用服务器集群不同,分布式缓存服务器集群中不同服务器缓存的数据各不相同,是不对等的,缓存访问请求不可以在缓存服务器集群中的任意一台处理,必须找到缓存有需要数据的服务器,才能访问。这个特点严重制约了分布式缓存集群的伸缩性设计。
分布式缓存集群伸缩性设计的最主要目标:新上线的缓存服务器对真个分布式缓存集群影响最小,即新加入缓存服务器后应使得整个服务器集群已经缓存的数据尽可能被访问到。
关系数据库可以使用伸缩性主要有两种:
Cobar伸缩性:
NoSql集群放弃了关系数据库以关系代数为基础的结构化查询语言(SQL)和事务一致性保证(ACID),强化了高可用性和可伸缩性。
扩展性是一种开发封闭的设计原则,指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。
构造可扩展的网站架构有两种方式:
很多功能集中在一个模块中的问题:
分布式服务框架还需支持如下特性:
常见攻击手段:
防御手段: