《大型网站技术架构》读书笔记

一、架构的演化

1、与传统企业应用系统相比,大型互联网应用系统的特点

  • 高并发,大流量:需要面对高并发用户,大流量访问。
  • 高可用:系统7x24小时不间断服务。
  • 海量数据:需要存储、管理海量数据,需要使用大量服务器。
  • 用户分布广泛,网络情况复杂。
  • 安全环境恶劣:互联网的开放性,使得互联网网站更容易受到攻击。
  • 需求快速变更,发布频繁。
  • 渐进式发展,几乎所有大型互联网网站都是从一个小网站开始,逐渐地发展起来。

2、大型网站演化过程

  1. 初始阶段,只需要一台服务器,应用程序、数据库、文件等所有资源都在一台服务器上。
  2. 应用服务和数据服务分离,网站使用三台服务器:应用服务器、文件服务器、数据库服务器。应用服务器需要处理大量的业务逻辑,因此需要更快更强大的cpu;数据库服务器需要快速磁盘检索和数据缓存,因此需要更快的硬盘和更大的内存;文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘。
  3. 使用缓存改善网站性能,网站80%的业务访问集中在20%的数据上。把这一小部分的数据缓存在内存中,可以减少数据库的访问压力。缓存分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。
  4. 使用应用服务器集群改善网站的并发处理能力。通过负载均衡调度服务器,可将访问请求分发到应用服务器集群中的任何一台服务器上。
  5. 数据库读写分离,目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。
  6. 使用反向代理和CDN加速网站响应,CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存者用户请求的资源,就将其直接返回给用户。
  7. 使用分布式文件系统和分布式数据库系统。分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。常用的数据库拆分手段是业务分库,将不同业务的数据库部署在不同的物理服务器上。
  8. 使用NoSQL和搜索引擎
  9. 业务拆分,将一个网站拆分成许多不同的应用,每个应用独立部署维护。
  10. 分布式服务,每一个应用系统都需要执行许多相同的业务操作,那么可以将这些共用的业务提取出来,独立部署。可复用的业务连接数据库,提供共用业务服务。

3、大型网站架演化的价值观
大型网站都是从小型网站发展而来,在网站还很小的时候就去追求网站的架构是舍本逐末,得不偿失。驱动网站技术发展的主要力量是网站的业务发展。

4、网站架构设计误区

  1. 一味追随大公司的解决方案
  2. 一味追求时髦的新技术
  3. 企图用技术解决所有问题,技术是用来解决业务问题的,而业务的问题,也可以通过业务的手段去解决。
二、架构模式

1、分层
网站分层架构:

  1. 应用层:负责具体业务和视图展示,如网站首页及搜索输入和结果展示。
  2. 服务层:为应用层提供服务支持,如用户管理服务,购物车服务等。
  3. 数据层:提供数据存储访问服务,如数据库、缓存、文件、搜索引擎等。

2、分割
如果说分层是将软件在横向方面进行切分,那么分割就是在纵向方面对软件进行切分。将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,一方面有助于软件的开发和维护;另一方面,便于不同模块的分布式部署。

3、分布式
分层和分割的主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。分布式解决高并发的同时带来了一些问题。
常用的分布式方案:

  1. 分布式应用和服务:将分层和分割后的应用和服务模块分布式部署。
  2. 分布式静态资源:网站的静态资源如JS,CSS,Logo图片等资源独立分布式部署,并采用独立的域名,可以减轻应用服务器的负载压力。
  3. 分布式数据和存储:大型网站的数据需要分布式存储。
  4. 分布式计算:严格说,应用、服务、实时数据计算处理都是计算。将计算程序分发到数据所在的位置以加速计算和分布式计算。
  5. 分布式配置:服务器配置实时更新。
  6. 分布式锁:分布式环境下实现并发和协同。
  7. 分布式文件系统

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

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

  • CDN:即内容分发网络,部署在距离终端用户最近的网络服务商。
  • 反向代理:部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到反向代理服务器,这里缓存网站的静态资源。
  • 本地缓存:在应用服务器本地缓存热点数据,应用程序可以在本机内存中直接访问数据,而无需访问数据库。
  • 分布式缓存:分布式缓存集群

使用缓存前提条件:

  1. 数据访问热点不均衡,某些数据会被频繁访问。
  2. 数据在某个时间段有效,不会很快过期。

6、异步
系统解耦合的一个重要手段是异步,业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段。

7、冗余
要保证高可用,就需要一定程度的服务器冗余的运行,数据冗余备份,这样当某台服务器宕机时,可以将其上的服务和数据访问转移到其他机器上。
数据库除了定期备份,存档保存,实现冷备份,为了保证业务高可用,还需要对数据库进行主从分离,实时同步实现热备份。

8、自动化

  1. 自动化代理管理
  2. 自动化测试
  3. 自动化安全检测
  4. 自动化部署
  5. 自动化监控
  6. 自动化报警
  7. 自动化失效转移
  8. 自动化失效转移
  9. 自动化降级
  10. 自动化分配资源

9、安全

三、核心架构要素

性能、可用性、伸缩性、扩展性和安全性是网站架构最核心的几个要素。

四、高性能架构

1、性能测试
网站性能测试的主要指标有响应时间、并发数、吞吐量、性能计数器等。
测试程序并不是启动多线程然后不停的发送请求,而是在两次请求之间加入一个随机等待时间,这个时间被称作思考时间。
测试方法具体可细分为性能测试、负载测试、压力测试、稳定性测试。
2、Web前端性能优化

  1. 浏览器访问优化

    1. 减少http请求,主要手段是合并CSS、合并JavaScript、合并图片。浏览器一次访问需要的JavaScript、CSS合并成一个文件,这样浏览器只需要一次请求。
    2. 使用浏览器缓存,静态资源文件缓存在浏览器中,可以改善性能。
    3. 在服务器端对文件进行压缩,在浏览器端对文件解压缩,可以有效减少通信传输的数据量。
    4. CSS放在页面最上面、JavaScript放在页面最下面
    5. 减少Cookie传输
  2. CDN加速
    CDN能够缓存一般是静态资源,如图片、文件、CSS、Script脚本、静态网页。

  3. 反向代理
    反向代理服务器也具有保护网站安全的作用,来自互联网的访问请求必须经过代理服务器。当用户第一次访问静态内容的时候,静态内容就被缓存在反向代理服务器上,这样其他用户访问该静态内容时,就可以直接从反向代理服务器返回。

3、应用服务器性能优化

  1. 分布式缓存
    1. 缓存是将数据存储在相对较高访问速度的存储介质中,以供系统处理。缓存主要用来存放那些读写比很高、很少变化的数据。
    2. 合理使用缓存,如果缓存中保存的是频繁修改的数据,会增系统负担。内存资源宝贵,将小部分常用数据缓存。
    3. 当缓存服务崩溃时,数据库会因为完全不能承受压力而宕机,进而导致整个网站不可用。这种情况称作缓存雪崩。
    4. 缓存预热,最好在缓存系统启动时就把热点数据加载好,这个缓存与加载手段叫缓存预热。
    5. 缓存穿透,如果不恰当的业务、或者恶意攻击持续高并发地请求某个不存在的数据,由于缓存没有保存该数据,所有的请求都会落在数据库上,会对数据库造成很大压力,甚至崩溃。
  2. 异步操作
    1. 消息队列具体很好的削峰作用-通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。
  3. 使用集群
  4. 代码优化
    1. 多线程
    2. 资源复用,单例模式和对象池。
    3. 数据结构
    4. 垃圾回收,合理设置Young Generation和Old Generation大小,尽量减少Full GC。

4、存储性能优化

  1. 机械硬盘 vs 固态硬盘
  2. B+树 vs LSM树
    1. 在LSM树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+树。
  3. RAID vs HDFS
    RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。通过使用RAID技术,实现数据在多块磁盘上并发读写和数据备份。
    HDFS以块为单位管理文件内容,一个文件被分割成若干个Block,当应用程序写文件时,每写完一个Block,HDFS就将其自动复制到另外两台机器上,保证每个Block有三个副本,即使有两台服务器宕机,数据依然可以访问,相当于实现了RAID1的数据复制功能。
五、高可用架构

网站的可用性描述网站可有效访问的特性。
1、可用性的度量
业界通常用多少个9来衡量网站的可用性。

2、高可用的架构
既然硬件故障是常态,网站的高可用架构设计的主要目的就是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。
还有考虑网站升级发布引起的宕机。

3、高可用的应用
无状态的应用是指应用服务器不保存业务的上下文信息,而仅根据每次请求提交的数据进行相应的业务逻辑处理,多个服务实例(服务器)之间完全对等,请求提交到任意服务器,处理结果都是完全一样的。

  1. 负载均衡提供失效转移功能。
  2. 应用服务器集群的Session管理
    1. Session复制,服务器之间同步Session对象,使得每台服务器上都保存所有用户的Session信息,只能使用在集群规模比较小的情况下。集群规模较大时,会占用服务器和网络的大量资源。
    2. Session绑定,Session绑定可以利用负载均衡的源地址Hash算法实现,负载均衡服务器总是将来源于同一IP的请求分发到同一台服务器,即Session绑定在某台指定特定服务器上,保证Session总能在这台服务器上获取。这种方法又被称为会话黏滞。一旦某台服务器宕机,那么该机器上的Session也就不存在。
    3. 利用Cookie记录Session
    4. Session服务器,独立部署Session服务器统一管理Session。

4、高可用的服务
高可用的服务策略:

  1. 分级管理,运维上将服务器进行分级管理,核心应用和服务优先使用更好的硬件,在运维响应速度上也格外迅速。
  2. 超时设置,一旦超时,通信框架就抛出异常,应用程序根据服务调度策略,可选择继续重试或将请求转移到提供相同服务的其他服务器上。
  3. 异步调用,通过消息队列异步完成。
  4. 服务降级,两种方式:拒绝服务及关闭服务。拒绝服务:拒绝低优先级应用的调用,减少服务调用并发数,确保核心应用正常使用。关闭功能:关闭部分不重要的服务,或者服务内部关闭部分不重要的功能,节约系统开销。
  5. 幂等性设计,保证服务重复调用和调用一次产生的结果相同。

5、高可用的数据
保证数据存储高可用的手段主要是数据备份和失效转移机制。数据备份是保证数据有多个副本,任意副本的失效都不会导致数据的永久丢失,从而实现数据完全的持久化。失效转移机制保证当一个数据副本不可访问时,可以快速切换访问数据的其他副本,保证系统可用。

  1. CAP原理,一个提供数据服务的存储系统无法同时满足数据一致性(Consistency)、数据可用性(Availibility)、分区耐受性(Patition Tolerancem,跨网络分区的伸缩性)这三个条件。大型网站通常会选择强化分布式存储系统的可用性(A)和伸缩性(P),在某种程度上放弃一致性(C)。
    数据强一致:各个副本的数据在物理存储中总是一致的。
    数据用户一致:即数据在物理存储中的各个副本的数据可能不一致,但是终端用户访问时,通过纠错和校验机制,可以确定一个一致的且正确的数据返回给用户。
    数据最终一致:这是数据一致性中较弱的一种,即物理存储的数据可能不一致,终端用户访问到的数据可能也是不一致的。但是系统经过一段时间(通常是一个比较短的时间段)的自我恢复和修正,数据最终会达到一致。

  2. 数据备份

    1. 冷备的优点是简单和廉价,成本和技术难度都很低,缺点:不能保证数据最终一致性。
    2. 异步热备,多份数据副本的写入操作异步完成。
    3. 同步方式,多份数据副本的写入操作同步完成。
  3. 失效转移
    1. 失效确认,
      系统确认一台服务器是否宕机的手段有两种:心跳检测和应用程序访问失败报告。
    2. 访问转移,
      确认某台数据存储服务器宕机后,就需要将数据读写访问重新路由到其他服务器上。
    3. 数据恢复,

6、高可用的质量保证

  1. 网站发布
  2. 自动化测试
  3. 预发布验证,一个处理错误的理念:快速失败,即如果系统在启动时发现问题就立即抛出异常,停止启动,介入排查错误,而不是启动后执行错误的操作。
  4. 代码控制,两种:A、主干开发、分支发布B、分支开发、主干发布(目前主要使用)
  5. 自动化发布
  6. 灰度发布,将集群服务器分成若干部分,每天只发布一部分服务器,观察运行稳定没有故障,后续继续发布,发现问题,回滚已发布的一部分服务器即可。灰度发布也常用于用户测试,在部分服务器上发布新颁布。

7、运行监控

  1. 用户行为日志手机
  2. 服务器性能监控
六、伸缩性架构

1、架构伸缩性设计

  1. 根据功能进行物理分离实现伸缩。
    • 纵向分离:将业务处理流程上不同部分分离,实现系统伸缩性。
    • 横向分离:将不同的业务模块分离部署,实现系统伸缩性。
  2. 单一功能通过集群实现伸缩。

2、应用服务器集群的伸缩性

  1. Http重定向负载均衡
    根据用户的Http请求计算一台真实的Web服务器地址。优点比较简单,缺点是需求访问两次,性能较差。
  2. DNS域名解析负载均衡
    利用DNS处理域名解析请求的同时进行负载均衡处理的一种方案。每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回。
  3. 反向代理负载均衡
    反向代理服务器转发请求在HTTP协议层面,因此也叫应用层负载均衡。缺点:所有请求和响应的中转站,性能可能会成为瓶颈。
  4. IP负载均衡
    在网络层通过修改请求目标地址进行负载均衡。
  5. 数据链路层负载均衡
    数据链路层负载均衡是指在通信协议的数据链路层修改mac地址进行负载均衡。Linux平台上的链路层负载均衡开源产品LVS(Linux Virtual Server)。
  6. 负载均衡算法
    • 轮询,所有请求被依次分发到每台应用服务器上。
    • 加权轮询,在轮询的基础上,按照配置的权重将请求分发到每个服务器。
    • 随机,请求被随机分配到各个应用服务器。
    • 最少连接,将新到的请求分发到最少连接的服务器上。
    • 源地址散列,根据请求来源的IP地址进行Hash计算,得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理。

3、分布式缓存集群的伸缩性
分布式缓存的一致性Hash算法,一致性Hash算法通过一个叫作一致性Hash环的数据结构实现Key到缓存服务器的Hash映射。

4、数据存储服务器集群的伸缩性

  1. 关系型数据库集群的伸缩,数据库分库和主从复制,支持数据分片的分布式关系数据产品。
  2. NoSQL数据库产品放弃了关系型数据库的两大重要基础:以关系代数为基础的结构化查询语言(SQL)和事务一致性保证(ACID)。强化了高可用性和可伸缩性。
七、可扩展架构

1、利用分布式消息队列降低系统耦合性

  1. 事件驱动架构
    通过低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作。
  2. 分布式消息队列
    消息生产者应用程序通过远程访问接口将消息推送给消息队列服务器,消息队列服务器将消息写入本地内存队列后立即返回成功响应给消息生产者。为了避免消息队列服务器宕机造成消息丢失,会将消息成功发送到消息队列的消息存储在消息生产者服务器,等消息真正被消息消费者服务器处理后才删除消息。

2、利用分布式服务打造可复用的业务平台
将模块独立部署,降低系统耦合性。纵向拆分:将一个大应用拆分为多个小应用,如果新增业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统。横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务,不需要依赖具体的模块代码,即可快速搭建一个应用系统,而模块内业务逻辑变化时,只要接口保持一致就不会影响业务程序和其他模块。

  1. WebService用以整合异构系统及构建分布式系统。存在的问题导致WebService难以满足大型网站对系统高性能、高可用、易部署、易维护的要求。
  2. 分布式服务的需求与特点,负载均衡,失效转移,高效的远程通信,整合异构系统,对应用最少侵入,版本管理,实时监控。

3、可扩展的数据结构
分布式开源框架Dubbo,服务消费者程序通过服务接口使用服务,而服务接口通过代理加载具体服务,具体服务可以使本地的代码模块,也可以是远程的服务,因此对应用较少侵入,应用程序只需要调用服务接口,服务框架根据配置自动调用本地货远程实现。服务框架客户端模块通过服务注册中心加载服务提供者列表,查找需要的服务接口,并根据配置的负载均衡策略将服务调用请求发送到某台服务提供者服务器。

4、可扩展的数据结构
NoSQL数据库使用ColumnFamily(列族),数据结构可随意扩展。

八、安全架构

1、网站应用攻击与防御

  1. XSS攻击,一种是反射型,攻击者锈使用户点击一个嵌入恶意脚本的链接,达到攻击的目的。另一种就是持久型XSS攻击,黑客提交恶意脚本的请求,保存在被攻击的Web站点的数据库中。解决方案:消毒,对某些html危险字符转义。HttpOnly,浏览器禁止页面JavaScript访问带有HttpOnly属性的Cookie。
  2. 注入攻击,两种形式,SQL注入攻击,OS注入攻击。使用预编译手段,绑定参数是最好的防SQL注入参数。
  3. CSRF攻击,攻击者通过跨站请求,以合法用户的身份进行非法操作。核心是利用了浏览器Cookie或者服务器Session策略,盗取用户身份。
    解决方案:1、表单Token,在页面表单中增加一个随机数作为token,伪造的请求无法获取该值。2、验证码,但是用户体验不好,在必要时使用,如支付交易等关键页面。3、Referer check,Http请求头的Referer域中记录着请求来源,验证是否合法。

2、加密技术与密钥安全

  1. 单项散列加密,对密码进行单向散列加密,将密文存入数据库,不可逆计算密码的原文。为了加强安全性,还可以给散列算法加点盐。
  2. 对称加密,算法简单,加解密效率高,系统开销小,适合对大量数据加密。
  3. 非对称加密,加密和解密使用的密钥不是同一密钥。

3、信息过滤与反垃圾

  1. 文本匹配,解决敏感词过滤。
  2. 分类算法
  3. 黑名单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值