概述
1.1 架构演化
初始网站架构
文件 应用程序 数据库 在一台服务器上
高流量、高并发网站:
应用服务与数据服务分离
应用服务器,文件服务器,数据库服务器
网站架构优化
- 利用缓存
80%的业务集中在20%的数据上
本读缓存
远程分布式集群缓存 - 应用服务器集群改善并发性能
通过负载均衡调度服务器,分发请求到应用服务器集群系统的任意一台服务器中 - 数据库读写分离
主从热备; - 反向代理 &cdn 加速网站访问速度
反向代理: 网站中心机房
cdn: 网络提供商机房 - 使用NoSQL和搜索引擎
1.2 价值观
中小型网站使用 LAMP
1.3 设计误区
追求大公司的解决方案
企图用技术解决所有问题
2.1 网站架构模式
分层:
分层 | 角色 |
---|---|
应用层 | 业务,视图 |
服务层 | 为应用层提供服务支持 |
数据层 | 数据存储访问,搜索引擎;数据库,缓存文件 |
分割
高内聚低耦合的模块,功能和数据分离
分布式
优点: cpu,内存,存储资源越多,能够处理的并发和数据量越大;
缺点:服务器不工作的几率增大,导致部分应用无法访问,可用性降低。保持数据一致性困难
集群
独立部署服务器集群化,通过负载均衡设备共同对外提供服务
即使是访问量很小的分布式应用和服务,也要至少部署两台服务器构成集群提高系统的访问性
缓存
- CDN
从距离用户最近的网络提供商进行响应;
保存首页等经常访问的静态资源(变化较少);
多见于视频网站,门户网站的热点内容 - 反向代理
保存在网站的前端
首页等静态资源
异步
分布式消息队列,等待服务器依次处理
场景: 促销,微博热点等访问高峰,使用消息队列将突然增加的访问请求数据放入消息队列中
冗余
服务器冗余
数据冗余
自动化
发布过程自动化 减少人为干预
自动化代码管理 版本控制,代码分支创建合并
自动化测试 部署测试环境,自动化样例测试,返回测试报告
自动化安全检测
自动化部署
安全 风险控制
安全校验
数据加密传输
验证码防止机器人程序攻击网站
防止xss,SQL注入
垃圾、敏感信息过滤
3.1 架构要素
架构
高性能
网站性能测试
- 性能测试指标:
响应时间
并发数
吞吐量网站性能优化第一定律:优先使用缓存优化性能
- 用户角度
优化html样式
利用浏览器的并发、异步特性
调整浏览器的缓存策略
减少http请求次数
使用cdn服务加速
反向代理
- 开发角度
合理使用缓存加速数据读取
使用集群增加吞吐能力
使用异步消息加速请求响应及实现削峰
前端性能优化
-浏览器性能优化
减少http请求次数
使用浏览器缓存
html页面中,css放在最上方,js放在最下方
减少cookie传输
启用压缩
应用服务器性能优化
集群
-- 安全性检查 缓存 加快访问速度 2:1原则
-使用分布式缓存
合理使用缓存:
几个名词:
- 缓存预热
在缓存系统启动前将热点数据加载好 - 缓存穿透
将不存在的数据存储起来,value = null
由于不恰当的业务或者恶攻击 ,持续高并发请求某个不存在的数据,由于缓存中不存在,会持续向服务器发起请求,可能造成崩溃。
-异步操作
使用消息队列注意:请求放入消息队列立即返回,给予客户端响应;
对于订单处理,发送邮件,必须等待服务器响应通知用户订单成功,以免引起纠纷
-使用集群
负载均衡服务器
存储性能优化
RAID(廉价磁盘访问阵列)改善磁盘的访问延迟
磁盘存储方式:
- 存储速度
- 数据可靠性
- 磁盘利用率
大型企业应用采取 hadoop分布式文件系统,不需要haid支持
三次备份,一台服务器宕机,立即备份到另一台
高可用
高可用的网站架构
应用层
数据层
服务层
部署到各自独立的服务器上
高可用的应用
高可用的服务
高可用的数据
缓存 服务不是数据存储服务,
扩大缓存服务器集群规模的的简单手段就是整个网站共享一个分布式缓存集群
- 原则
持久性: 在各种情况下数据都不会丢失
可访问性: 切换数据访问设备迅速
一致性:数据副本部分写入失败,导致不一致
-数据备份
冷备: 简单廉价 不能保证数据最终一致
-失效转移
失效确认:心跳检测 应用程序访问失败报告
访问转移
数据恢复:必须将数据恢复到系统设定的值
软件质量保证
-网站发布
- 自动化测试
-预发布验证
-代码控制
分支开发,主干发布:互不干扰,不同发布周期的开发可以在同一应用进行
主干开发,分支发布:主干代码反映整个应用状态,一目了然,利于持续集成
- 自动化发布
- 灰度发布
只发布一部分服务器,方便回滚
伸缩性
定义 不需要改变软硬件结构,通过改变部署服务器的数量扩大或缩小网站的服务能力
应用服务器集群伸缩性
-负载均衡
- http负载均衡
- 反向代理负载均衡
- dns域名解析负载均衡
- 数据链路层负载均衡
- ip负载均衡
分布式缓存集群的伸缩性
-余数hash
用hash值/ 服务器数目 得到的数字对应服务器列表下标
-分布式缓存的一致性hash算法
计算机中的任何问题都可以通过增加一个虚拟层来实现
-一致性hash算法(虚拟层手段)
一台物理虚拟机虚拟为150个虚拟服务节点最合适
数据存储服务器集群伸缩性
- 关系型数据库的伸缩性
主从读写分离
业务分割模式
- noSQL数据库的伸缩性
应用最广泛的 HBase
数据以Hregion为单位进行管理
可扩展架构
分布式消息队列降低系统耦合性
EDA架构: 生产者消费者模式
分布式消息队列: 发布订阅模式
消息元 ---》 分布式消息队列
消息接收者 --》 从消息队列中获得
消息发送者和接收者之间无直接联系
分布式服务
横向拆分:
复用的业务拆分部署为独立的模块
纵向拆分:
大应用拆分为多个小应用
可扩展的数据结构
面向矩阵的稀疏阵列存储格式 nosql ColomnFamily
利用开放平台建立网络生态圈
第三方增值服务,开放的调用接口
安全
信息过滤与反垃圾
-文本匹配
正则表达式匹配(效率低)
trie树:双数组trie树
构建多级hash表 提交信息在hash过滤树及其分支只能够逐字匹配
-分类算法
训练模型
-黑名单
案例
淘宝架构演化
linux+apache+mysql+php
mvc+orm 自主开发Webx+IBatis
Spring 代替 EJB JBoss 代替收费的Weblogic
维基百科高性能架构
使用免费开源的软件
-前端性能优化
“圣杯”cdn服务 用户查询的词条集中于比重很小的热点词条上,将词条内容缓存到服务器上,cdn又部署在离用户最近的地方,响应速度极快。
由于大多数请求根本不会到达Squid服务器,服务器压力骤减,节约资源可以处理其他未被
-服务器性能优化
从硬件改善性能
-后端性能优化
使用缓存,热点数据缓存在分布式缓存系统的内存中
- 热点集中数据 缓存在应用服务器的本地存储中
- 缓存数据尽量是浏览器可以直接使用的格式,避免解析构造数据的代价
使用缓存服务器存储session对象
mySQL 使用 raid0存储阵列,将加速磁盘访问放在首位,但数据丢失无法恢复
业务后退一小步,技术前进一大步
Doris 高可用架构设计
在各种软硬件故障的情况下,如何保障数据可靠,服务可用