大型网站技术架构剖析
大型网站系统特点
- 高并发,大流量
- 高可用
- 海量数据
- 用户分布广泛,网络情况复杂
- 安全环境恶略
- 需求快速变更,发布频繁
- 渐进式发展
大型网站发展演化过程
一台服务器
特点:没人
应用程序、数据库、文件都在一个服务器。
应用服务器和数据服务器分离
应用服务器
- 处理大量业务
- 需要更快更强的CPU
数据服务器
- 需要快速磁盘检索和数据缓存
- 需要更快的磁盘和更大的内存
文件服务器
- 需要更大的硬盘
使用缓存改善网站性能
- 本地缓存
- 远程缓存(分布式缓存)
使用应用服务器集群改善并发处理能力
- 负载均衡服务器
- 用户服务器集群
数据库读写分离
利用数据库的主从热备份,来实现数据库的读写分离。从而改善数据库的负载压力。
使用反向代理和CDN加速网站响应
基本原理都是缓存(都可以缓存一些静态资源)
反向代理服务器
- 缓存用户请求资源
CDN服务器
- 目的:尽早返回数据给用户
使用分布式文件系统和分布式数据库系统
分布式数据库是网站数据库拆分的最后手段。不到万不得已的时网站更常用的拆分手段是业务拆分。
使用NoSQL和搜索引擎
应对更复杂的存储和检索需求
业务拆分
应对日益复杂的业务场景
拆分方法
- 根据产品线拆分成不同的应用
应用产品之间的关系
- 超链接
- 消息队列进行数据分发
- 访问同一个数据存储系统
分布式服务
通过分布式服务调用公用业务服务完成具体业务需要
大型网站架构模式
分层
- 应用层
- 服务层
- 数据层
分割
对不同的层继续进行垂直的分割
分布式
分层、分割的主要目的就是为了便于分布式部署。
分布式就是为了用更多的计算机来完成同样的功能
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 分布式配置
- 分布式文件系统
集群
多台服务器部署相同应用构成一个集群。通过负载均衡设备对外提供服务
有点:
- 提高系统并发访问量
- 提高系统可用性(冗余)
缓存
改善性能的第一手段
- 内容分发网络CDN
- 反向代理
- 本地缓存
- 分布式缓存
异步
- 共享内存队列(单服务器)
- 分布式消息队列(分布式系统)
冗余
访问和负载很小的服务器也至少要部署两台构成集群。目的就是实现服务的高可用。
自动化
- 自动化报警
- 自动化失效转移
- 自动化失效恢复
- 自动化降级
- 自动化分配资源
安全
- 身份认证
- 加密
- 验证码识别
- 对于XSS,SQL注入,进行编码转换等
- 敏感信息过滤
- 风险控制
网站性能测试优化
性能测试指标
- 响应时间
- 并发数
- 吞吐量
- 性能计数器
性能测试方法
- 性能测试
- 负载测试
- 压力测试
- 稳定性测试
常见优化手段
用户视角
- 优化页面HTML样式
- 利用浏览器的并发和异步
- 调整浏览器缓存策略
- CDN和反向代理
开发人员
- 使用缓存加速数据读取速度
- 使用集群提高系统吞吐能力
- 使用异步消息加速响应及实现消峰
- 优化代码改善程序性能
运维人员
- 优化骨干网
- 使用高性价比定制服务器
- 使用虚拟化技术优化资源利用
网站性能优化
web性能优化
- 减少HTTP请求(合并css、javascript、图片)
- 使用浏览器缓存(使用Cache-Control和Expire属性)
- 启用压缩(减少网络数据传输量)
- 减少页面阻塞(CSS文件尽量放在最上面,javascript放在最下面)
- 减少Cookie传输
- CDN加速
- 反向代理
- 安全
- 加速web请求(可以缓存一些静态资源)
- 负载均衡
应用服务器优化
分布式缓存
异步操作(消息队列)
原则:任何可以晚点在做的事都可以晚点再做
使用集群
使用负载均衡技术来构建
存储服务器优化
- 访问频繁的页面不应该访问数据库(如首页,最好是静态的)
- 谨慎使用锁操作
- 对缓存的管理提高到和其他服务器一样的级别
- 大文件小文件分别对待
大型网站架构设计误区
- 一味追求大公司的解决方案
- 为了技术而技术
- 企图用技术解决所有问题