来源:公司资讯 | 2021.09.03
◆大型网站 的特点 :
高并发 、大流量:需要 面对 高并发 用户 ,大流量访问 。
高可用 :需要 7x24 小时 不间断 服务 。
海量数据 :数据 需要 存储 、管理 ,需要 大量 服务器 。
用户 分步 广泛 、网络 情况 复杂 :全球 网络 复杂 ,像国内 还有 各个 运营商网络互通 难的问题 。
安全 环境恶劣 :互联网 开放性 ,使得 网站 易受到 攻击 。
需求 快速 变更 ,发布 频繁 :快速迭代。
渐进式 发展 :从小 网站 开始 ,逐渐 发展 成大 站点 。
◆大型网站 的主要 技术 挑战
庞大 的用户 ,高并发 的访问 和海量数据 。
任何 简单 业务 在处理 PB级数据 或数以亿计的用户 时,问题 就会 变得 棘手 。
◆大型 网站架构 的演化过程
◆初始 阶段 的网站架构
大多数 小项目 的初期 架构 都是 这样 。
随着 网站 业务发展 ,1台服务器 无法 满足需求:用户 越来越多 ,网站 性能 越来越 差,越来越多 的数据 导致 存储空间 不足 。
◆应用 、数据库 、文件 分离
应用服务 与数据服务 分离 :提高 性能 ,解决 存储 问题 。
【服务器 专用化】
应用服务器 :处理 业务 ,要求 CPU 强
文件服务器 :存储 文件 ,要求 存储容量 大
数据库 服务器 :存储 数据 、缓存 、磁盘 检索 ,要求 内存 、硬盘速度快
随着 用户量 增多 ,数据库 压力大 ,会成为 系统 瓶颈 。
◆用缓存 改善 网站 性能
二八定律 :80 %的业务 访问 20 %的数据 。
所以 常用 数据 放入 缓存 ,可以 减少 数据库 的压力 。
缓存 分为 两种 :
本地 缓存 :访问 更快,但受应用服务器 内存 限制 ,且会出现 和应用程序 争用内存 的情况 。
分布式缓存:集群 方式 ,专用 服务器 作为 缓存服务器 ,理论上不受 内存容量 限制 。
目前 只有 单个 应用服务器 ,且只部署 了一个 实例 ,其能够 处理 的连接数 有限 ,在网站访问 高峰期 时,应用服务器 会变成 瓶颈 。
◆使用 应用 集群 改善 网站 的并发 能力
一台 服务器 的处理 能力不足时,不要 考虑 去换更强大 的服务器 ,对于 大型网站 而言 ,不管 多么 强大 的服务器 ,都满足 不了 网站 持续增长 的业务 需求 。
最好 的方式 是添加 更多 的服务器 来分担 原有 服务器 的访问 。
◆数据库 读写分离
数据库 还存在 的的问题 :使用 缓存 后,依然 会有 部分 读操作 (缓存 没有 命中 ,缓存 过期 等)和所有 的写操作 需要 访问 数据库 。
在网站 用户 达到 一定 规模 后,数据库 依然 会因为 负载 较高成为 系统 瓶颈 。
解决办法 :采用 数据库 读写分离,两台 数据库 配置 主从关系 ,从主库 写数据 ,从从 库读数据 ,主库 的数据 会同步 到从库中。
为了 便于 应用程序 能够 透明 地访问 读写分离的数据库 ,所以 在应用程序 中使用 专门 的数据 访问 模块 。
◆使用 反向代理 缓存 和CDN 加速 网站 响应 :网络环境 复杂 ,缓存 前端 静态 资源
请求 访问 存在的问题 :随着 网站 持续 的发展 ,发现 不同 网络环境 的用户 访问速度 不同 。
解决办法 :使用 反向代理 缓存 和CDN 加速 网站 响应 。
CDN 和反向代理 的基本原理 :都是 缓存 ,区别 在于 CDN 部署 在网络 提供商 的机房 ,使用户 在请求 网站服务 时,可以 从距离 自己 最近 的网络 提供商 机房 获取数据 ;而反向代理 则部署 在网站 的中心 机房 中,从用户 请求 达到 中心 机房 后,首先 访问 的服务器 是反向代理 服务器 ,如果 反向代理 服务器 中缓存 着用户 请求 的资源 ,就将其直接 返回 给用户 。
CDN 和反向代理 的目的 :尽早 返回 数据 给用户 ,一方面 加快 用户 访问速度 ,另一方面 减轻 应用服务器 的负载 压力 。
◆使用 分布式文件系统 和分布式 数据库系统
随着 网站 业务发展 ,原有 读写分离的数据库 也不能 支撑 。
另外 ,原有 的文件服务器 也无法 满足需求了。
这时 ,需要 使用 分布式 数据库 和分布式文件系统 。
分布式 数据库 是网站 数据库 拆分 的最后 手段 ,只有 在单表 数据 规模 非常 庞大 时才使用 。
网站 更常用 的数据库 拆分 手段 是业务 分库 ,将不同 的业务 数据 部署 在不同 的物理服务器上。
◆使用 NoSQL和搜索引擎
随着 业务 越来越 复杂 ,对数据存储 和检索 的需求 也越来越 复杂 ,网站 需要 采用 NoSQL和非数据库查询 技术 比如 搜索引擎 。
◆业务 拆分 (分治 )
网站 过于 复杂 ,将业务 拆分 。
比如 商城 拆分为 首页 、店铺 、订单 、买家 、卖家 等产品线 ,归不同 的业务 团队 负责 。
具体 到技术 ,也会根据 产品线 划分 ,将一个网站 拆分为 多个 应用 ,每个 应用 独立 部署 维护 。
应用 之间 可以 通过 一个 超链接 建立 关系 (在首页 的导航 链接 指向 不同 的应用 地址 ),也可以 通过 消息队列 进行 数据 分发 ,当然 最多 的还是 通过 访问 同一个 数据 存储系统 来构成 一个 关联 的完整 系统 。
◆分布式服务
业务 拆分 越来越 小,存储系统 越来越大,应用系统 整体 复杂度 呈指数型增加 ,部署 维护 越来越 困难 。
由于 所有 应用 都需要 连接数据库 ,在数万 台服务器 的情况 下,数据库连接 会资源 不足 。
既然 每个 应用系统 都需要 相同 的业务 操作 ,比如 用户管理 、商品管理 等,可以 把这些 共用 业务 抽取 出来 ,独立 部署 。