前言
本文整理自《大型网站技术架构 核心原理与案例分析》一书,这本书应该算一本很强的内功秘籍,虽然没有实战教学,但是基础理论扎实了是很重要的,书中观点明确,设计的问题域有针对性和全面性,对知识点的广度和深度都进行了拓展,包含了架构设计的方方面面。
概述
模式: 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作。
网站架构模式: 大型互联网公司在实践中提出了许多解决方案,以实现网站高性能、高可用、易伸缩、可扩展、安全等各种技术框架目标。这些解决方案又被更多网站重复使用,从而逐渐形成大型网站架构模式。
分层
概念
- 分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一个完整的系统。
- 实践中,大的分层结构内部还可以继续分层。
目的
- 便于分工合作开发和维护;
- 各层独立,只要维持调用接口不变,各层可根据具体问题独立演化发展而无需其他层必须相应调整;
- 物理部署上,三层结构可部署在同一物理机器上,随着网站业务发展,必然要分离部署,其三层结构分别部署在不同服务器,使网站拥有更多计算资源应对更多用户访问。
举例
在网站的分层架构中,常见的为3层,即应用层、服务层、数据层。
虽然分层架构模式最初的目的是规划软件清晰的逻辑结构以便于开发维护,但在网站的发展过程中,分层结构对网站支持高并发向分布式方向的发展至关重要。
分割
概念
- 从纵向方面对软件进行切分,将不同功能和服务分割开来,包装成高内聚低耦合的模块单元。
- 大型网站分割粒度可能会很小。
目的
- 有助于软件开发和维护;
- 便于不同模块的分布式部署,提供网站的并发处理能力和功能扩展能力。
举例
- 在应用层,按业务分割为购物、论坛、搜索、广告不同的应用,独立团队负责,部署在不同服务器;
- 同一应用内部,如果规模庞大业务复杂,会继续分割,比如购物业务分割为机票酒店业务、3C业务、小商品业务等更细小的粒度。
分布式
概念
对于大型网站,分层和分隔的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。
目的
可使用更多的计算机完成同样的功能,计算机越多,CPU、内存、存储资源也越多,处理并发访问和数据量就越大。
缺点
- 分布式服务调用必须通过网络,可能会影响性能;
- 服务器越多,服务器宕机概率就越大;
- 分布式环境数据一致性非常困难,分布式事务也难以保证;
- 分布式导致网站依赖错综复杂,开发管理维护困难。
举例
- 分布式应用和服务:将分层和分割后的应用和服务模块分布式部署。
- 分布式静态资源:网站的静态资源如JS、CSS、Logo图片等资源独立分布式部署,并采用独立域名,即动静分离。
- 分布式数据和存储:大型网站需处理以P为单位的海量数据,单台计算机无法提供如此大的存储空间,此时需分布式存储。
- 分布式计算:严格来说,应用、服务、实时数据处理都是计算,网站除了要处理这些在线业务,还有很大一部分后台业务,包括搜索引擎的索引构建、数据仓库的数据分析统计等。目前网站普遍使用
Hadoop
和MapReduce
分布式计算框架进行此类批处理计算,其特点是移动计算而不是移动数据,将计算程序分发到数据所在的位置以加速计算和分布式计算。
集群
概念
对于用户访问集中的模块需要将独立部署的服务器集群化,即通过负载均衡技术为一个应用构建一个多台服务器组成的集群,共同对外提供服务。
目的
提高系统可用性。
举例
- 服务器集群能够为相同的服务提供更多的并发支持,因此当有更多的用户访问时,只需要向集群中加入新的机器即可;
- 可以实现当其中的某台服务器发生故障时,可以通过负载均衡的失效转移机制将请求转移至集群中其他的服务器上,因此可以提高系统的可用性。
缓存
概念
将数据存放在距离计算最近的位置。
目的
缓存目的就是减轻服务器的计算,使数据直接返回给用户,加快处理速度。
举例
- CDN
- 反向代理
- 本地缓存
- 分布式缓存
使用缓存有两个条件:
- 访问数据热点不均衡,即某些频繁访问的数据需要放在缓存中;
- 数据在某个时间段内有效,不过很快过期,否在会因为数据过期而脏读,影响数据的正确性。
异步
概念
- 单一服务器内部可通过多线程共享内部队列方式实现异步,业务操作前面的线程将输出写入队列,后面的线程从队列读取数据处理。
- 分布式系统中,多个服务器集群通过分布式消息队列实现异步。
目的
- 提高系统可用性:消费者服务器发生故障,数据会在消息队列服务器存储堆积,生产服务器可以继续处理业务请求,系统整体表现无故障。消费者服务器恢复正常后,继续处理消息队列中的数据。
- 加快网站响应速度:业务处理前端的生产着服务器将数据写入消息队列,无需等待消费者服务器处理就可以返回,响应延迟减少。
- 消除并发访问高峰:用户访问网站是随机的,虽然存在高峰和低谷,但突发事件(促销活动、微博热点事件)会造成网站并发访问突然增大。使用消息队列将突然增加的访问请求数据放入消息队列,等待消费者服务器依次处理,减小网站负载压力。
- 解耦,提升扩展性。
- 缺点:消费者服务器处理(如业务校验、写数据库)失败,以订单提交为例,可在成功提交后Email或短信通知用户订单成功,避免交易纠纷。
使用异步,业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方法异步执行进行协作。
异步架构的典型就是生产者消费者方式,两者不存在直接调用。
冗余
概念
任何服务都必须部署至少两台服务器构成的一个集群。
目的
网站需要7×24小时连续运行,那么就得有相应的冗余机制,以防某台机器宕掉时无法访问,而冗余则可以通过部署至少两台服务器构成一个集群实现服务高可用。
举例
- 冷备份:定期备份,存档保存。
- 热备份:主从分离,实时同步
- 全球范围内部署灾备数据中心
自动化
概念
是指机器设备、系统或过程(生产、管理过程)在没有人或较少人的直接参与下,按照人的要求,经过自动检测、信息处理、分析判断、操纵控制,实现预期的目标的过程。
目的
减少人为干预,减少故障。
举例
- 自动化发布。
- 自动化代码管理:代码版本控制、代码分支创建合并等过程自动化,开发工程师只要提交自己参与开发的产品代号,系统自动为其创建开发分支,后期自动合并代码。
- 自动化测试:代码开发完成,提交测试后,系统自动将代码部署到测试环境,启动自动化测试用例测试,向相关人员发送测试报告,向系统反馈测试结果。
- 自动化安全检测:安全检测工具对代码静态安全扫描及部署到安全测试环境进行安全攻击测试,评估安全性。
- 自动化部署:将工程代码自动部署到线上生产环境。
- 自动化监控。
- 自动化报警:对线上生产环境自动化监控,对服务器心跳检测,及各项性能指标和应用程序的关键数据指标。如果发现异常、超出预设阀值,自动化向相关人员发送报警,警告故障可能发生。
- 自动化失效转移:检测到故障发生后,系统自动化将失效服务器从集群隔离,不再处理请求。
- 自动化失效恢复:待故障消除后,系统自动化重新启动服务,同步数据保证数据一致性。
- 自动化降级:网站遇到访问高峰,超出网站最大处理能力时,为保证整个网站安全可用,会自动化拒绝部分请求及关闭部分不重要服务将系统负载降至安全水平。
- 自动化分配资源:将空闲资源分配给重要服务,扩大部署规模。
安全
举例
- 通过密码和手机验证码身份认证。
- 登录、交易等操作需网络通信加密,网站服务器上存储的敏感数据也加密处理。
- 使用验证码识别,防止机器人程序滥用网络资源攻击网站。
- 对常见的用于攻击网站的XSS攻击、SQL注入进行编码转换等处理。
- 对垃圾信息、敏感信息过滤。
- 对交易转账等重要操作根据交易模式和交易信息进行风险控制。