- 高并发,大流量
- 高可用
- 海量数据
- 用户分布广泛,网络情况复杂
- 安全环境恶劣
- 需求快速变更,发布频繁
- 渐进式发展
1.初始阶段
2.应用服务和数据服务分离
3.使用缓存改善网站性能
4.使用应用服务器集群改善网站并发能力
5.数据库的读写分离
6.使用反向代理和CDN加速网站响应
7.使用分布式文件系统和分布式数据库系统
8.使用NoSQL和搜索引擎
9.业务拆分
- 分布式服务
- 大型网站架构技术的核心价值是随网站所需灵活应对
- 驱动大型网站技术发展的主要力量是网站的业务发展
- 一味追随大公司的解决方案
- 为了技术而技术
- 企图用技术解决所有问题
- 分层(最常见的三层为应用层、服务层和数据层)
- 业务分割
- 分布式
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 集群
- 缓存
- CDN
- 反向代理
- 本地缓存
- 分布式缓存
- 异步
- 冗余
- 自动化
- 安全
- 性能
- 可用性
- 伸缩性
- 扩展性
- 安全性
不同视角下的网站性能
- 用户角度就是用户在浏览器上直观感受到的网站响应速度
- 开发人员关注应用程序本身及其相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标
- 运维人员关注基础设施性能和资源利用率
性能测试指标
- 响应时间
- 并发数
- 吞吐量 TPS/HPS/QPS
- 性能计数器
- System Load
- 对象与线程数
- 内存使用
- CPU使用
- 磁盘与网络I/O
性能测试方法
- 性能测试
- 负载测试
- 压力测试
- 稳定性测试
性能测试报告样例
并发数 | 响应时间(ms) | TPS | 错误率(%) | Load | 内存(G) | 备注 |
---|---|---|---|---|---|---|
10 | 500 | 20 | 0 | 5 | 8 | 性能测试 |
20 | 800 | 30 | 0 | 10 | 10 | 性能测试 |
30 | 1000 | 40 | 2 | 15 | 14 | 性能测试 |
40 | 1200 | 45 | 20 | 30 | 16 | 负载测试 |
60 | 2000 | 30 | 4 | 50 | 16 | 压力测试 |
80 | 超时 | 0 | 100 | 不详 | 不详 | 压力测试 |
- 浏览器访问优化
- 减少http请求
- 使用浏览器缓存
- 启用压缩
- CSS和JS文件位置
- 减少Cookie传输
- CDN加速
- 反向代理 - 安全保护 配置缓存加速 负载均衡
- 分布式缓存 - 优先考虑使用缓存优化性能是第一定律
- 缓存原理就是Key/Value的Hash表
- 二八定律 - 80%的访问落在20%的数据上
- 合理使用缓存
- 频繁修改的数据不适合,读写比2:1以上
- 没有热点的访问不适合
- 数据不一致与脏读问题
- 缓存可用性
- 缓存预热
- 缓存穿透
- 分布式缓存架构
- Memcached
- 简单的通信协议
- 丰富的客户端程序
- 高性能的网络通信
- 高效的内存管理
- 互不通信的服务器集群架构
- 异步操作
- 使用集群
- 代码优化
- 多线程
- 资源复用 - 单例和对象池
- 数据结构
- 垃圾回收
- 机械硬盘 vs 固态硬盘
- B+树 vs LSM树
- RAID vs HDFS
一般用N个9度量
分类 | 描述 | 权重 |
---|---|---|
事故级故障 | 严重故障,网站整体不可用 | 100 |
A类故障 | 网站访问不顺畅或核心功能不可用 | 20 |
B类故障 | 非核心功能不可用,或核心功能少数用户不可用 | 5 |
C类故障 | 以上故障以外的其他故障 | 1 |
- 数据和服务的冗余备份及失效转移
- 应用层和服务层一般使用负载均衡设备构建集群,数据层在数据写入时进行数据同步复制,实现数据冗余备份
- 还要考虑因升级发布引起的宕机
- 通过负载均衡进行无状态服务的失效转移
- 应用服务器集群的Session管理
- Session复制
- Session绑定
- 利用Cookie记录Session
- Session服务器
- 分级管理,核心应用和服务使用更好的硬件,服务部署上进行必要的隔离,避免故障连锁反应
- 超时设置,超时未响应重新调度
- 异步调用
- 服务降级,两种方式:拒绝服务和关闭功能
- 幂等性设计
- CAP理论
- 数据备份
- 冷备份,定期备份
- 异步热备份(关系型数据库的异步热备即是Master-Slave模式)
- 同步热备份
- 失效转移
- 失效确认
- 访问转移
- 数据恢复
- 网站发布
- 自动化测试
- 预发布验证
- 代码控制
- 自动化发布
- 灰度发布 - 分批次部分发布
用户行为日志收集
包含用户操作系统、浏览器版本信息,IP地址,页面访问路径,页面停留时间等,可以通过服务器端日志收集和客户端浏览器日志收集
服务器性能监控
运行数据报告
- 系统报警
- 失效转移
- 自动优雅降级
- 不同功能进行物理分离实现伸缩 - 横向、纵向
- 单一功能通过集群规模实现伸缩 - 应用服务器集群、数据服务器集群
重要手段 - 负载均衡 参考
- Memcached
- 分布式缓存的一致性Hash算法
- 关系数据库集群的伸缩性设计
数据库主从读写分离或业务拆分
产品:Amoeba Cobar
- NoSQL数据库的伸缩性设计
低耦合设计
- 事件驱动架构
通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间的合作,比如常见的生产者消费者模式
- 分布式消息队列
将队列数据结构部署到独立的服务器上,应用程序可以通过远程访问接口使用分布式消息队列,进行消息存取操作,进而实现分布式的异步调用
关键的解决方案还是拆分,将模块独立部署,降低系统耦合性。
- Web Service
- 大型网站分布式服务的需求与特点
- 负载均衡
- 失效转移
- 高效的远程通信
- 整合异构系统
- 对应用最少侵入
- 版本管理
- 实时监控
- 分布式服务架构(Dubbo)
NoSQL中使用ColumnFamily设计
- API接口
- 协议转换
- 安全
- 审计
- 路由
- 流程
- XSS
- 消毒 - 转义html危险字符
- HttpOnly属性的Cookie
- 注入攻击 - SQL注入和OS注入
- 开源获取数据库结构
- 错误回显获取数据库结构
- 盲注
- 消毒防御
- 参数绑定防御
- CSRF攻击
- 其他
- Error Code
- HTML注释
- 文件上传
- 路径遍历
- Web应用防火墙 - ModSecurity
- 网站安全漏洞扫描
- 单向散列加密
- 对称加密
- 分对称加密
- 密钥安全管理
- 密钥和算法放在独立服务器
- 加解密算法放在应用系统中,密钥放在独立服务器,密钥切分成数片放在不同存储介质