网站架构模式
网站架构模式:大公司在实践中针对高并发访问/海量数据处理/高可靠的问题,提出了很多解决方案,这些解决方案被更多网站服用,就逐渐形成大型网站的架构模式;
实现 高性能,高可用,易伸缩,可扩展,安全的技术架构目标
- 1 分层
- 2 分割
- 3 分布式
- 4 集群
- 5 缓存
- 6 异步
- 7 冗余
- 8 自动化
- 9 安全
1 分层
分层属于横向切分;
网站分为:应用层/服务层/数据层
- 应用层
- 负责具体业务和试图展示;如网站首页搜索输入和结果展示
- 服务层
- 为应用层提供服务支持,如用户管理服务,购物车服务等
- 数据层
- 提供数据存储访问服务;如数据库,缓存,文件,搜索引擎等
分层好处(开发和维护时)
- 便于分工(严格遵从分层架构的约束,禁止跨层次调用和逆向调用)
- 各层有一定独立性,方便维护;
分层是逻辑上的,部署时候可以在一台物理机也可以分离;在网站很小的时候就应该采用分层架构,将来才能平滑过度;
2 分割
分层属于横向切分,分割属于纵向切分;
分割的意义:将不同的功能和服务分割,做出高内聚低耦合的模块单元;
- 一方面有助于软件的开发和维护
- 一方面便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力
比如在应用层将不同业务进行分割,在服务层根据服务分割模块等
3 分布式
对大型网站来说:分层和分割的目的是便于分布式部署,将不同模块部署在不同的服务器上,通过远程调用协同工作;
分布式意味着能够处理的并发访问和数据量会随着机器的增多而增强;
分布式带来的问题:
- 必须通过网络,可能会对性能造成大影响;
- 服务器越多,服务器宕机的概率就越大,使网站可用性降低
- 保持数据一致性的难度会增加
- 导致网站依赖错综复杂,开发管理维护成本增加
常见分布式方案:
- 分布式 应用和服务
- 分层分割后的应用和服务模块分布式部署
- 优点:改善网站性能/并发性/加快开发和发布速度/减少数据库连接资源消耗/高复用便于业务功能扩展
- 分布式 静态资源
- 静态资源 JS/CSS/图片,采用独立域名;
- 优点:减轻应用服务的负载压力/通过独立域名加快浏览器并发加载速度/利于分工和术业有专攻
- 分布式 数据和存储
- 单台机器顶不住,
- 除了传统关系型数据库进行分布式部署外,各种 NOSQL 产品几乎都是分布式的
- 分布式 计算
- 目前普遍采用 Hadoop 和 MapReduce 分布式计算框架进行此类批处理计算,特点是移动计算而不是移动数据,将计算程序分发到数据所在的位置以加速计算和分布式计算;
- 其它
- 支持网站线上服务器配置实时更新的分布式配置
- 分布式环境下实现并发和协同的分布式锁
- 支持云存储的分布式文件系统
4 集群
用户访问集中的模块(比如首页),需要将独立部署的集群化
多台服务器腹部相同应用构成一个集群,通过负载均衡设备共同对外提供服务
- 可以提供更好的并发特性,更好的扩容(只需要持续添加机器即可);
- 当单台服务器发生故障的时候,负载均衡设备或系统的失效转移机制会请求转发到集群中其它服务器,使服务器故障不影响用户使用
因为这些好处,即使很小的分布式应用和服务,至少要部署两台服务器构成一个小集群(目的是提高系统的可用性);
5 缓存
使用缓存的 2 前提条件
- 1.数据访问热点不均衡,数据会被频繁访问;
- 2.数据在某个时段内有效,不会很快过期
- 否则会产生脏数据,影响结果的正确性
缓存除了可以加快数据访问速度,还可以减轻后端应用和数据存储的负载压力;
CDN
部署在网络服务器,从距离用户最近的网络服务器读取数据;一般静态资源放在这里
反向代理
类似 CDN,部署在网站前端,用户访问时候,最先访问的就是反向代理服务器;
本地缓存
服务器的本地缓存,混存折热点数据,应用程序可以在本机内存中直接访问,无需访问数据库;
分布式缓存
配合本地缓存(本地缓存单机一般顶不住),分布式缓存将数据缓存在一个专门的分布式缓存集群中
6 异步
异步方式处理业务可能会对用户体验和业务流程造成影响,需要网站产品设计方面的支持
异步:业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作
在分布式操作中,多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看作内存队列的分布式部署
优点如下
提高系统可用性
消费者服务器放生宕机,数据会在消息队列服务器中存储堆积,生产者服务器可以继续处理业务请求,系统整体表现无故障,消费者服务器恢复正常后,继续处理消息队列的数据
加快网站响应速度
处在业务前端的生产者服务器在处理完业务请求后,将数据写入消息队列,不需要等待消费者处理就可以返回,相应延迟减少;
消除并发高峰
网站流量存在高峰和低谷,即使网站按照一般访问高峰进行规划和部署,也依然会出现突发事件;
使用消息队列突然增加的访问请求数据放入消息队列,等待消费者服务器依次处理,就不会对网站负载造成太大压力;
7 冗余
要想保证服务器宕机的情况下网站依然正常,就需要服务器冗余运行和数据冗余备份;这样当某台服务器宕机的时候,可以将其上的服务和数据访问转移到其它机器上
上面说的负载小的服务也要两台机器组成集群,就是为了通过冗余实现服务高可用;
数据库除了定期备份,存档保存,实现冷备份外,为了保证在线业务高可用,还需要对数据库进行主从分离,实时同步实现热备份;
8 自动化
通过减少人为干预,使发布过程自动化可有效减少发布故障;
发布过程的自动化
- 自动化代码管理
- 代码版本控制
- 代码分支创建合并等过程自动化
- 开发工程师只需提交开发的产品代号,系统自动创建分支,后期自动代码合并
- 自动化测试
- 自动部署到测试环境
- 启动自动化测试用例进行测试
- 向开发人员发送测试报告
- 向系统反馈测试结果
- 自动化安全检测
- 安全检测工具通过对代码进行静态安全扫描及部署到安全测试环境进行安全攻击测试,评估安全性
- 自动化部署
- 将工程代码自动化部署到线上生产环境
运行过程的自动化
- 自动化监控
- 对服务进行心跳检测
- 监控各项性能指标和应用程序的关键数据指标
- 自动化报警
- 发现异常
- 超出预设的阙值
- 向相关人员发送警告信息,警告故障可能会发生
- 自动化失效转移(在检测到故障发生后)
- 将失效的服务器从急群众隔离出去,不在处理系统中的应用请求
- 自动化失效恢复(故障消除后)
- 重新启动服务
- 同部数据保持一致性
- 自动化降级(遇到访问高峰,超过网站最大处理能力时,为保证网站安全可用)
- 拒绝部分请求
- 关闭不必要的服务
- 将系统负载降至一个安全的水平
- 自动化分配资源(同上)
- 将空闲资源分配给重要的服务
- 扩大部署规模
9 安全
- 通过密码和手机校验码进行身份认证
- 登陆,交易等操作需要对网络通信进行加密,网站服务器上存储的敏感数据如用户信息等也进行加密处理
- 为了防止机器人程序滥用网络资源攻击网站,网站使用验证码进行识别
- 对于常见的用于攻击网站的 XSS 攻击,SQL 注入,进行编码转换等相应处理
- 对于垃圾信息,敏感信息进行过滤,对交易转账等重要操作根据交易模式和交易信息进行风险控制