大型网站核心架构要素

软件架构:有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

除了系统功能需求,还需要关注性能,可用性,伸缩性,扩展性和安全性这5个架构要素。

性能

  • 浏览器端:浏览器缓存,页面压缩,合理布局页面,减少cookie传输
  • CDN:静态内容分发至离用户最近的网络服务商机房
  • 反向代理服务器:缓存热点文件,加快请求响应速度
  • 应用服务器端:服务器本地缓存和分布式缓存
  • 异步操作:将用户请求发送至消息队列等待后续任务处理
  • 多台应用服务器组成集群
  • 代码方面,使用多线程,改善内存管理
  • 数据库服务器端,索引,缓存,SQL优化,NoSQL

指标:

  • 响应时间
  • TPS:Transaction per sec
  • 系统性能计数器

可用性

7*24小时可用,高可用的设计目标是当服务器宕机的时候,服务或者应用依然可用,主要手段是冗余,应用部署在多台服务器上同时提供访问,数据存储在多台服务器上互相备份。

多台应用服务器通过负载均衡设备组成一个集群共同对外提供服务,一台服务器宕机,请求切换到其他服务器就可以实现应用的高可用,但是应用服务器上不能保存请求的会话信息。

存储服务器,需要对数据进行实时备份。

伸缩性

网站通过集群的方式将多台服务器组成一个整体共同提供服务,伸缩性即通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。

  • 应用服务器集群
  • 缓存服务器集群,新加入的服务器可能导致缓存路由失效,需要改进缓存路由算法保证缓存数据的可访问性
  • 关系数据库,很难做到大规模集群的可伸缩性,其集群伸缩性方案必须在数据库之外实现,通过路由分区等手段
  • NoSQL

扩展性

功能需求,如何设计网站的架构使得其能够快速响应需求变化,是网站可扩展架构的主要目的。

网站可伸缩架构的主要手段是事件驱动和分布式服务。

事件驱动架构在网站通常用消息队列实现。

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

安全性

网站安全架构是保护网站不受恶意访问和攻击,保护网站重要数据不被窃取。

瞬时响应:网站的高性能架构

网站性能测试

常用优化手段:

  • 优化页面HTML样式,利用浏览器端的并发和异步特性,调整浏览器缓存策略,使用CDN服务,反向代理手段
  • 使用缓存加速数据读取,使用集群提高吞吐能力,使用异步消息加快请求响应以及削峰,使用代码优化手段改善程序性能
  • 优化骨干网,使用高性价比定制服务器,利用虚拟化技术优化资源利用

性能测试指标

  • 响应时间:应用执行一个操作需要的时间
  • 并发数:系统能够同时处理请求的数目,测试程序通过多线程模拟并发用户的办法测试系统的并发处理能力,两次请求之间增加随机等待时间,即思考时间
  • 吞吐量:单位时间内系统处理的请求数量,体现系统的整体处理能力,请求数/秒页面数/秒,TPS, HPS(HTTP per sec), QPS(Query per sec),系统并发数从小到大的过程中,系统吞吐量逐渐增加,到达极限时候,随着并发数的增加而下降,到达崩溃点后,系统资源耗尽,吞吐量为0
  • 性能计数器:系统负载,对象和线程数,CPU使用,内存使用,磁盘和网络IO指标。系统负载理想值是CPU数目,指当前正在被CPU执行和等待被CPU执行的进程数目总和。

性能测试方法

  • 性能测试
  • 负载测试,增加并发请求
  • 压力测试,超过安全负载,对系统继续施加压力
  • 稳定性测试

性能测试报告

性能优化

  • 性能分析

检查处理请求的日志,检查监控数据

  • 性能优化

分为Web前端性能优化,应用服务器性能优化,存储服务器性能优化

Web前端性能优化

浏览器加载,网站视图模型,图片服务,CDN服务,优化手段:优化浏览器访问,使用反向代理,CDN

  1. 浏览器访问优化
    • 减少http请求,合并CSS,JavaScript,图片
    • 使用浏览器缓存
    • 启用压缩
    • CSS在页面上方,JS在下方,尽快渲染页面
    • 减少Cookie传输,静态资源使用独立域名访问,避免请求静态资源时候发送Cookie
  2. CDN加速
    • 缓存,将数据缓存存在了离用户最近的地方,使得用户以最快速度获取数据,即所谓网络访问第一跳
  3. 反向代理:缓存,负载均衡

应用服务器性能优化

优化手段主要有: 缓存,集群,异步等

  • 分布式缓存

网站优化第一定律:优先考虑使用缓存优化性能

缓存指将数据存储在相对较高访问速度的存储介质里,以供系统处理。

网站数据访问通常遵循二八定律,即80%访问落在20%的数据上,因此利用Hash表和内存的高速访问特性,将这20%的数据缓存起来,可以很好的改善系统性能,提高数据读取速度,降低存储访问压力。

通过分布式缓存服务器集群,将缓存数据分布到集群多台服务器上可以改善缓存的可用性,当一台缓存服务器宕机的时候,只有部分缓存数据丢失,重新从数据库加载这部分数据不会对数据库造成很大影响。

缓存预热

缓存穿透:持续高并发的请求某个不存在的数据,这样会对数据库造成很大压力,所以简单的对策是将不存在的数据缓存起来,值为None

  • 分布式缓存架构

    • JBoss Cache:需要更新同步的分布式缓存,所有服务器中保存相同的缓存数据
    • Memcached:不互相通信的分布式缓存,集中式的缓存集群管理,通过一致性Hash路由算法选择缓存服务器远程访问缓存数据,因此可以简单的扩容,有好的伸缩性
  • Memcached

  • 通信协议: TCP

  • 序列化协议:基于文本的自定义协议
  • 服务端通信模块:Libevent,支持事件触发的网络通信程序库,稳定的长连接
  • 高效的内存管理:固定空间分配,避免了内存碎片管理,内存的分配和释放都是以chunk为单位的,使用LRU算法释放最近最久未被访问的数据占用空间。但是浪费内存空间
  • 互不通信的服务器集群架构,客户端路由算法一致性hash

异步

使用消息队列将调用异步化,可以改善网站的扩展性和性能,但是在后续的业务校验,写数据库操作可能失败,所以需要修改业务流程进行配合。

集群

网站高并发访问场景下,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理。

代码优化

多线程

IO阻塞和多CPU,理想的系统Load是既没有进程等待也没有CPU空闲,利用多线程IO阻塞与执行交替进行,可以最大限度的利用CPU资源。

线程安全:

  • 对象设计为无状态对象
  • 使用局部对象
  • 并发访问资源时候使用锁

资源复用:单例和对象池

数据结构

垃圾回收

存储性能优化

机械硬盘和固态硬盘

B+树和LSM树

为了改善数据访问特性,文件系统或者数据库系统通常会对数据排序后存储,加快数据检索速度。

B+树是专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将其加载到内存中然后继续查找,直到找到相应数据。

LSM树,N阶合并树,数据写操作在内存中进行,并且创建一个新记录,数据在内存中仍然是一棵排序树。如果数量超过设定的内存阈值后,会将这棵排序树和磁盘最新的排序树合并,如果这棵树数据量也超过阈值后,和磁盘上下一级的排序树合并。

RAID 和 HDFS

RAID 廉价磁盘冗余阵列,主要是为了改善磁盘访问延迟,增强磁盘的可用性和容错能力。通过RAID,实现数据在多块磁盘上的并发读写和数据备份。

HDFS(Hadoop分布式文件系统),系统在整个存储集群的多台服务器上进行数据并发读写和备份,可以看作在服务器集群规模上实现了类似RAID的功能。

HDFS以块为单位管理文件内容,一个文件被分割成若干个Block,当应用写文件的时候,每写完一个块,HDFS就将其自动复制到另外两台机器上,相当于进行了数据复制。

对文件处理计算的时候,通过MapReduce并发计算任务框架,启动多个计算子任务,同时读取文件的多个块,并发处理,相当于实现了并发访问功能。