读书笔记 大型网站技术架构 核心原理与案例分析

一、大型网站软件系统的特点

  1. 高并发,大流量
  2. 高可用
  3. 海量数据
  4. 用户分布广泛,网络情况复杂
  5. 安全环境恶劣
  6. 需求快速变更
  7. 渐进式发展

二、架构模式

模式:可重复

本章一般性的思路和解决方案。

1.分层

  • 应用层 就是通过网页直接看到的东西
  • 服务层 如用户管理
  • 数据层 数据库,缓存,文件…

这三个大分层可以再细分

2.分割

分层是横向,分割是纵向不同业务的分割,由独立团队负责

3.分布式

分布式的思想是可以用更多的计算机来完成工作

  • 分布式应用和服务 改善性能和并发
  • 分布式静态资源 图片,CSS
  • 分布式数据和存储 NoSQL产品
  • 分布式计算 MapReduce

4.集群

并发提供高可用

5.缓存

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

6.异步

消息队列的重要用来降耦

提高可用性,加快响应速度,消除并发访问高峰

7.冗余

热备,冷备,灾备中心

8.自动化

自动化的发布,代码管理,测试,部署,监控,报警,失效转移,失效恢复,自动化降级(拒绝,关闭),自动化分配资源……

9.安全

密码,校验码,验证码,加密,过滤……

三、性能

性能优化的终极目的是改善用户体验,使用户感觉网站很快。

1.性能测试

指标

  • 响应时间
  • 并发数
  • 吞吐量
  • 性能统计:CPU,内存

测试方法

性能:资源可接受范围内是否符合性能指标预期负载:若干项性能指标达到临界点使,某种资源饱和压力:超过安全负载,继续施加压力,获得系统最大压力承受能力稳定性:一定压力下运行较长时间

2.Web前端性能优化

浏览器访问优化

  • 减少http请求:合并js,css等资源为一个文件
  • 使用浏览器缓存:HTTP头中Cache-Control和Expires属性
  • 启用压缩
  • CSS最上,js最下:尽早开始渲染页面,尽晚执行js
  • 减少coockie传输

CDN加速

CDN本质是离用户最近的缓存

反向代理加速

缓存静态内容。部分网站把动态内容也缓存。

除了缓存效果,天然还可以保护网站安全,也可以实现负载均衡。

3.应用服务器性能优化

分布式缓存

网站性能优化,总是优先考虑使用缓存。

缓存主要存放读写比很高,很少变化的数据。

(28原则,80%的访问集中在20%的数据)

不合理的缓存:

  • 频繁修改
  • 没有热点
  • 数据不一致,脏读是否允许
  • 缓存服务崩溃,即缓存雪崩(系统已经习惯于依赖缓存之后,失去缓存无法接受)

缓存预热

缓存穿透: 反复访问的不存在的数据也缓存一个null

分布式缓存架构的两种方式: 以JBoss Cache为代表的需要更新同步的分布式缓存:所有服务器缓存相同,规模大时代价惊人以Memcached 为代表的互相不通信的分布式缓存:互不通信,海量数据可伸缩

异步操作

典型场景就是消息队列速度远高于数据库操作,从而起到了减少延迟的效果

削峰作用,通过缓存消息,将短时间产生的大量事务高峰削平。

集群

通过负载均衡技术构建服务器集群

代码优化

多线程:线程比进程(比如CGI)切换代价小

多线程的原因:IO阻塞和多CPU 启动线程数建议=[执行时间/(执行时间-IO时间)]*CPU数目

线程安全: 无状态对象,Java的Servlet Web开发的贫血模型对象局部对象锁

资源复用:单例,对象池:连接池,线程池

垃圾回收:深入理解比如JVM的垃圾回收原理

4.存储性能优化

机械硬盘 vs. 固态硬盘

B+树(传统关系数据库) vs. LSM树(NoSQL,减少磁盘访问次数)

RAID vs. HDFS

四、高可用

度量方式:几个9?

硬件故障是常态

先说分层

  • 应用 高并发,负载均衡
  • 服务 集群,分布式服务框架
  • 数据 冗余备份

1.高可用的应用

应用的显著特点是无状态。

通过负载均衡实现无状态服务的失效转移。但是业务不可能完全无状态,所以需要Session管理:

  • Session复制。集群规模大不可能
  • Session绑定。无法实现高可用
  • Cookie记录Session 简单易用 但是大小受限,传输影响性能,用户也可能关闭Cookie
  • 独立出来Session服务器 可以利用分布式缓存,数据库

2.高可用的服务

  • 分级管理:不同业务的权限和资源不一样
  • 超时设置:设置超时时间,不正常可以重试或者转移
  • 异步调用: 消息队列
  • 服务降级:高峰期部分拒绝服务,关闭功能
  • 幂等性 : 避免重复效果

3.高可用的数据

对缓存怎么看待?需要不需要保证像数据存储一样的高可用?

CAP原理

  • Consistency 一致性
  • Availibility 可访问性
  • Partition Tolerance 跨网络分区线性伸缩

数据一致性的分类:强一致,数据用户一致,数据最终一致。要求逐次降低。

数据备份

冷备数据同步热备,异步热备 Master和Slave的读写分离

失效转移

失效确认,访问转移,数据恢复

4.高可用:质量保证

  • 发布流程:发布脚本,逐批完成。关闭路由-升级-打开路由
  • 自动化测试 Selenium
  • 预发布验证
  • 代码控制
  • 自动化发布 火车发布模型
  • 灰度发布:每天只发布一部分服务器,发现问题则回滚

5.监控

目前很多网站逐步开发基于实时计算框架Storm的日志统计与分析工具

Ganglia

五、伸缩性

不断添加服务器可以线性增长集群的处理能力,就是好的伸缩性

纵向分离和横向分离

1.应用服务器集群的伸缩性设计

负载均衡的实现方式:

  • HTTP重定向 重定向服务器本身成为瓶颈
  • DNS域名解析 归域名服务商管,且不能立刻生效
  • 反向代理 因为所处位置,顺便提供负载均衡能力。还是性能瓶颈
  • IP负载均衡 修改目的IP 带宽受限于服务器
  • 数据链路层 修改目的mac,三角传输 也叫直接路由方式 目前使用最广 linux上最好的产品是LVS

负载均衡算法:

  • RR
  • WRR
  • Random
  • Least Connections
  • Source Hashing 会话粘滞

2.分布式缓存集群的伸缩性设计

Memcached 的访问模型,通过路由算法选择Node去从实际服务器读写缓存。一大挑战是扩容后的缓存失效问题。选择在访问量最少时扩容,同时新加入机器通过模拟请求的方式预热

改进路由算法使新加入的服务器不影响缓存命中:一致性Hash算法构造node的hash环,key则以距离远近决定命中。更进一步,每个物理节点虚拟为多个虚拟node,尽量保证扩容后的均衡。

3.数据存储服务器集群的伸缩性设计

主从读写分离数据分库 Cobar:分布式关系数据库访问代理,迁移scheme实现扩容关系模型绑架对象模型 业务对象贫血模型和充血模型之争 NoSQL 弱化SQL和ACID,关注高可用性和可伸缩性

HBase,以HRegion为单位实现数据管理

六、可扩展

扩展和伸缩的区别,扩展是基础设施稳定,应用依赖和耦合少,对需求变更可以敏捷响应

1.用分布式消息队列降耦

保持模块间松散耦合

分布式消息队列产品 ActiveMQ

2.利用分布式服务打造可复用的业务平台

纵向把大业务拆分成小业务横向把复用的业务拆分出来,独立部署为分布式服务

3.可扩展的数据结构

NoSQL ColumnFamily

4.利用开发平台建设网站生态圈

七、安全

XSS攻击 即跨站点脚本攻击 cross site script SQL注入攻击 CSRF攻击

Web 应用防火墙 ModSecurity 加密和密钥安全

信息过滤和反垃圾

电子商务风险



最后更新: 2015-05-03 22:43