读《大型网站技术架构-核心原理与案例分析》笔记(一)

大型网站架构演化

大型网站软件系统的特点:

  • 高并发,大流量
  • 高可用
  • 海量数据
  • 用户分布广泛,网络情况复杂
  • 安全环境恶劣
  • 需求快速变更,发布频繁
  • 渐进式发展

大型网站架构演化历程的思维导图:

大型网站架构演化发展历程.png

大型网站架构演化的价值观:

  • 大型网站结构技术的核心价值是随着网站所需灵活应对
  • 驱动大型网站技术发展的主要力量是网站的业务发展
  • 不要一味追随大公司的解决方案
  • 不要为了技术而技术
  • 不要企图用技术解决所有问题

大型网站架构模式

分层

分层是企业应用系统中最常用的一种架构模式,将系统在横向微度上切分成几个部分,每个部分负责一部分相对比较单一的职责,通过上层对下层的依赖和调用组成一个完整的系统。在大型网站中也采用分层结构,将网站软件系统分为应用层、服务层和数据层。这三层可以部署在同一台服务器上,也可以在业务发展后部署在不同的服务器上。

  • 应用层:负责具体业务和视图展示
  • 服务层:为应用层提供服务支持
  • 数据层:提供数据存储访问服务

大的分层内部还可以继续分层,如应用层可以再细分为视图层和业务逻辑层;服务层可以细分为数据接口层(适配各种输入和输出的数据格式)和逻辑处理层。

切割

切割是在纵向方面对软件进行切分。

将这些不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,一方面有利于软件的开发和维护;另一方面,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。

疑问:要先进行分层,再进行分割呢?还是先进行分割,再进行分层呢?

分布式

分布式是将分层和分割后的模块独立部署。

好处:

  • 可以使用更多的计算机资源
  • 能够处理更多的并发和数据

问题:

  • 分布式服务器见通信的网络开销
  • 服务器宕机可能会影响网站可用性
  • 数据一致性和分布式事务比较难处理
  • 开发管理维护困难

常用的分布式方案:

  • 分布式应用和服务
  • 分布式静态资源
  • 分布式数据和存储
  • 分布式计算
  • 分布式配置
  • 分布式锁
  • 分布式文件系统

集群

多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。

缓存

缓存就是将数据存放在距离计算最近的位置以加快处理速度。

大型网站架构设计在很多方面都使用了缓存设计:

  • CDN缓存
  • 反向代理
  • 本地缓存
  • 分布式缓存

使用缓存的两个前提条件:①数据访问热点不均衡,某些数据会被更频繁地访问,这些数据应该存在缓存中。②数据在某个时间段内有效,不会很快过期,否则缓存就会因为时效而产生脏读,影响结果的正确性。

异步

异步的目的之一也是为了解耦。业务之间的消息传递不是同步调用,而是将一个业务操作分布成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作。

异步架构的典型就是生产者消费者模式,两者之间不存在直接调用。

分布式异步消息队列的特性:

  • 提供系统可用性
  • 加快网站响应速度
  • 消除并发访问高峰

冗余

为了7*24小时的服务连续运行,数据不丢失,需要在一定程度的服务器冗余运行,数据冗余备份,这样当某台服务器宕机时,可以将服务和数据转移到其他机器上。

可以通过冷备份、热备份、灾备数据中心冗余数据库。

自动化

大型网站的自动化架构设计主要集中在发布运维方面。自动化发布过程包括:

  • 自动化代码管理:git或svn的分支管理、版本控制等
  • 自动化测试:自动化测试用例测试
  • 自动化安全监测:静态代码检查等
  • 自动化部署:根据不同的环境部署代码
  • 自动化监控:宕机、存储空间、程序bug、突然爆发的访问等
  • 自动化报警:发现异常自动报警
  • 自动化失效转移:将失效的服务从集群中移除
  • 自动化失效恢复:故障消除后,重新启动服务,同步数据等
  • 自动化降级:通过拒绝部分请求及关闭部分不重要的服务将系统负载减低至一个安全水平
  • 自动化分配资源:将空闲资源分配给重要的服务

安全

通过各种手段进行安全保障。

大型网站核心架构要素

软件架构除了关注当前需求外,还要关注性能、可用性、伸缩性、扩展性和安全这5个架构要素。架构设计过程要平衡这5个要素之间的关系以实现需求和架构目标,也可以通过考察这些架构要素来衡量一个软件架构设计的优劣,判断其是否满足期望。

性能

网站架构设计的一个主要方面,任何软件架构设计方案都必须考虑可能会带来的性能问题。(衡量性能的指标、提高性能的方案)。

可用性

高可用的设计目标就是服务器宕机的时候,服务或者应用依然可用。主要的解决手段是冗余。

对于应用服务器:实现的难点在于session共享。本地服务器不保存session,专门的服务器保存session,所有服务器共享session。

对于存储服务器:实时备份数据。事务的一致性是难点。CAP原理:一个提高服务的存储系统无法同时满足以下三个条件,一致性(Consistency) 、数据可用性(Avalibility) 、分区耐受性(Patition Tolerance,系统具有跨网络分区的伸缩性),通常只能同时满足两个条件。

伸缩性

通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储要求。衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添加新的服务器。

对于应用服务器集群:服务器对等设计,使用负载均衡设备。

对于缓存服务器集群:新加入服务器后,可能导致缓存路由失效。通过改进缓存路由算法,可实现加入新的缓存服务器后对原有缓存的影响尽量减少。

对于关系型数据库集群:在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群,也可以考虑分表、分库。

扩展性

网站的扩展性架构直接关注网站的功能需求。衡量标准就是在网站添加新的业务产品时,是否可以实现对向右产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。不同产品之间是否很少耦合,一个产品改动对其他产品无影响,其他产品和功能不需要牵连进行改动。

主要手段:事件驱动架构和分布式服务。

事件驱动架构:通常利用消息队列实现,将用户请求和其他业务事件构造成消息发布到消息队列,消息的处理者作为消费者从消息队列中获取消息进行处理。

分布式服务:将业务和可复用服务分离开来,通过分布式服务框架调用。

安全性

衡量网站安全架构的标准就是针对现存和潜在的各种攻击与窃密手段,是否有可靠的一堆策略。