分布式Web服务器架构演变形成
2014-06-24 14:14
218 查看
开始 由于某些想法 于 互联网上搭建了 网站 时候甚至有 能主机都 租借 由于 篇文章我们只关注架构 演变历程 因此 假设 时候已经 托管了 台主机 并且有 定 带宽了 时候由于网站具备了 定 特色 吸引了部分人访问 逐渐 发现系统 压力越来越高 响应速度越来越慢 而 时候比较明显 数据库和应用互相影响 应用出问题了 数据库也 容易出现问题 而数据库出问题 时候 应用也容易出问题 于 进入了第 步演变阶段: 应用和数据库从物理上分离 变成了两台机器 时候技术上没有 新 要求 发现确实起 效 了 系统又恢复 前 响应速度了 并且支撑住了更高 流量 并且 会因 数据库和应用形成互相 影响 步架构演变对技术上 知识体系基本没有要求 架构演变第二步:增加页面缓存 好景 长 随着访问 人越来越多 发现响应速度又开始变慢了 查找原因 发现 访问数据库 操作太多 导致数据连接竞争激烈 所 响应变慢 数据库连接又 能开太多 否则数据库机器压力会 高 因此考虑采用缓存机制来减少数据库连接资源 竞争和对数据库读 压力 时候首先也许会选择采用squid 等类似 机制来 系统 相对静态 页面(例 两天才会有更新 页面)进行缓存(当 也 采用 页面静态化 方案) 样程序上 做修改 能够 好 减少对webserver 压力 及减少数据库连接资源 竞争 OK 于 开始采用squid来做相对静态 页面 缓存 前端页面缓存技术 例 squid 想用好 还得深入掌握下squid 实现方式 及缓存 失效算法等 架构演变第三步:增加页面片段缓存 增加了squid做缓存 整体系统 速度确实 提升了 webserver 压力也开始下降了 随着访问量 增加 发现系统又开始变 有些慢了 尝 了squid之类 动态缓存带来 好处 开始想能 能让现 些动态页面里相对静态 部分也缓存起来呢 因此考虑采用类似ESI之类 页面片段缓存策略 OK 于 开始采用ESI来做动态页面 相对静态 片段部分 缓存 步涉及 了 些知识体系: 页面片段缓存技术 例 ESI等 想用好 同样需要掌握ESI 实现方式等; 架构演变第四步:数据缓存 采用ESI之类 技术再次提高了系统 缓存效 系统 压力确实进 步降低了 同样 随着访问量 增加 系统还 开始变慢 经过查找 能会发现系统 存 些重复获取数据信息 地方 像获取用户信息等 时候开始考虑 些数据信息也缓存起来呢 于 些数据缓存 本地内存 改变完毕 完全符合预期 系统 响应速度又恢复了 数据库 压力也再度降低了 少 步涉及 了 些知识体系: 缓存技术 包括像Map数据结构、缓存算法、所选用 框架本身 实现机制等 架构演变第五步: 增加webserver 好景 长 发现随着系统访问量 再度增加 webserver机器 压力 高峰期会上升 比较高 时候开始考虑增加 台webserver 也 了同时解决 用性 问题 避免单台 webserver down机 没法使用了 做了 些考虑 决定增加 台webserver 增加 台webserver时 会碰 些问题 典型 有: 1、 何让访问分配 两台机器上 时候通常会考虑 方案 Apache自带 负载均衡方案 或LVS 类 软件负载均衡方案; 2、 何保持状态信息 同步 例 用户session等 时候会考虑 方案有写入数据库、写入存储、cookie或同步session信息等机制等; 3、 何保持数据缓存信息 同步 例 之前缓存 用户数据等 时候通常会考虑 机制有缓存同步或分布式缓存; 4、 何让上传文件 些类似 功能继续正常 时候通常会考虑 机制 使用共享文件系统或存储等; 解决了 些问题 终于 把webserver增加 了两台 系统终于 又恢复 了 往 速度 步涉及 了 些知识体系: 负载均衡技术(包括 限于硬件负载均衡、软件负载均衡、负载算法、linux转发协议、所选用 技术 实现细节等)、主备技术(包括 限于 ARP欺骗、linux heart-beat等)、状态信息或缓存同步技术(包括 限于Cookie技术、UDP协议、状态信息广播、所选用 缓存同步技术 实现细节等)、共享文件技术(包括 限于NFS等)、存储技术(包括 限于存储设备等) 架构演变第六步:分库 享受了 段时间 系统访问量高速增长 幸福 发现系统又开始变慢了 次又 状况呢 经过查找 发现数据库写入、更新 些操作 部分数据库连接 资源竞争非常激烈 导致了系统变慢 下 办呢 此时 选 方案有数据库集群和分库策略 集群方面像有些数据库支持 并 好 因此分库会成 比较普遍 策略 分库也 意味着要对原有程序进行修改 通修改实现分库 错 目标达 了 系统恢复甚至速度比 前还快了 步涉及 了 些知识体系: 步更多 需要从业务上做合理 划分 实现分库 具体技术细节上没有其 要求; 同时随着数据量 增大和分库 进行 数据库 设计、调优 及维护上需要做 更好 因此对 些方面 技术还 提出了 高 要求 架构演变第七步:分表、DAL和分布式缓存 随着系统 断运行 数据量开始大幅度增长 时候发现分库 查询仍 会有些慢 于 按照分库 思想开始做分表 工作 当 避免 会需要对程序进行 些修改 也许 时候 会发现应用自己要关心分库分表 规则等 还 有些复杂 于 萌生能否增加 通用 框架来实现分库分表 数据访问 ebay 架构 对应 DAL 演变 过程相对而言需要花费较长 时间 当 也有 能 通用 框架会等 分表做完 才开始做 同时 阶段 能会发现之前 缓存同步方案出现问题 因 数据量太大 导致现 太 能 缓存存 本地 同步 方式 需要采用分布式缓存方案了 于 又 通考察和折磨 终于 大量 数据缓存转移 分布式缓存上了 步涉及 了 些知识体系: 分表更多 同样 业务上 划分 技术上涉及 会有动态hash算法、consistent hash算法等; DAL涉及 比较多 复杂技术 例 数据库连接 管理(超时、异常)、数据库操作 控制(超时、异常)、分库分表规则 封装等; 架构演变第八步:增加更多 webserver 做完分库分表 些工作 数据库上 压力已经降 比较低了 又开始过着每天看着访问量暴增 幸福生活了 突 有 天 发现系统 访问又开始有变慢 趋势了 时候首先查看数据库 压力 切正常 之 查看webserver 发现apache阻塞了 多 请求 而应用服务器对每 请求也 比较快 看来 请求数太高导致需要排队等待 响应速度变慢 还好办 般来说 时候也会有些钱了 于 添加 些webserver服务器 添加 webserver服务器 过程 有 能会出现几种挑战: 1、Apache 软负载或LVS软负载等无法承担巨大 web访问量(请求连接数、网络流量等) 调度了 时候 经费允许 会采取 方案 购买硬件负载 例 F5、Netsclar、Athelon之类 经费 允许 会采取 方案 应用从逻辑上做 定 分类 分散 同 软负载集群 ; 2、原有 些状态信息同步、文件共享等方案 能会出现瓶颈 需要进行改进 也许 时候会根据情况编写符合网站业务需求 分布式文件系统等; 做完 些工作 开始进入 看似完美 无限伸缩 时代 当网站流量增加时 应对 解决方案 断 添加webserver 步涉及 了 些知识体系: 了 步 随着机器数 断增长、数据量 断增长和对系统 用性 要求越来越高 时候要求对所采用 技术都要有更 深入 理解 并需要根据网站 需求来做更加定制性质 产品 架构演变第九步:数据读写分离和廉价存储方案 突 有 天 发现 完美 时代也要结束了 数据库 噩梦又 次出现 眼前了 由于添加 webserver太多了 导致数据库连接 资源还 够用 而 时候又已经分库分表了 开始分析数据库 压力状况 能会发现数据库 读写比 高 时候通常会想 数据读写分离 方案 当 方案要实现并 容易 另外 能会发现 些数据存储 数据库上有些浪费 或者说过于占用数据库资源 因此 阶段 能会形成 架构演变 实现数据读写分离 同时编写 些更 廉价 存储方案 例 BigTable 种 步涉及 了 些知识体系: 数据读写分离要求对数据库 复制、standby等策略有深入 掌握和理解 同时会要求具备自行实现 技术; 廉价存储方案要求对OS 文件存储有深入 掌握和理解 同时要求对采用 语言 文件 块 实现有深入 掌握 架构演变第十步:进入大型分布式应用时代和廉价服务器群梦想时代 经过上面 漫长而痛苦 过程 终于 再度迎来了完美 时代 断 增加webserver 支撑越来越高 访问量了 对于大型网站而言 人气 重要毋庸置疑 随着人气 越来越高 各种各样 功能需求也开始爆发性 增长 时候突 发现 原来部署 webserver上 web应用已经非常庞大了 当多 团队都开始对其进行改动时 真 相当 方便 复用性也相当糟糕 基本 每 团队都做了或多或少重复 事情 而且部署和维护也 相当 麻烦 因 庞大 应用包 N台机器上复制、启动都需要耗费 少 时间 出问题 时候也 好查 另外 更糟糕 状况 有 能会出现某 应用上 bug 导致了全站都 用 还有其 像调优 好操作(因 机器上部署 应用 都要做 根本 无法进行针对性 调优)等因素 根据 样 分析 开始痛下决心 系统根据职责进行拆分 于 大型 分布式应用 诞生了 通常 步骤需要耗费相当长 时间 因 会碰 多 挑战: 1、拆成分布式 需要提供 高性能、稳定 通信框架 并且需要支持多种 同 通信和远程调用方式; 2、 庞大 应用拆分需要耗费 长 时间 需要进行业务 整理和系统依赖关系 控制等; 3、 何运维(依赖管理、运行状况管理、错误追踪、调优、监控和报警等)好 庞大 分布式应用 经过 步 差 多系统 架构进入相对稳定 阶段 同时也能开始采用大量 廉价机器来支撑着巨大 访问量和数据量 结合 套架构 及 多次演变过程吸取 经验来采用其 各种各样 方法来支撑着越来越高 访问量 步涉及 了 些知识体系: 步涉及 知识体系非常 多 要求对通信、远程调用、消息机制等有深入 理解和掌握 要求 都 从理论、硬件级、操作系统级 及所采用 语言 实现都有清楚 理解 运维 块涉及 知识体系也非常 多 多数情况下需要掌握分布式并行计算、报表、监控技术 及规则策略等等 说起来确实 费力 整 网站架构 经典演变过程都和上面比较 类似 当 每步采取 方案 演变 步骤有 能有 同 另外 由于网站 业务 同 会有 同 专业技术 需求 篇blog更多 从架构 角度来讲解演变 过程 当 其 还有 多 技术也未 此提及 像数据库集群、数据挖掘、搜索等 真实 演变过程 还会借助像提升硬件配置、网络环境、改造操作系统、CDN镜像等来支撑更大 流量 因此 真实 发展过程 还会有 多 同 另外 大型网站要做 远远 仅仅上面 些 还有像安全、运维、运营、服务、存储等 要做好 大型 网站真 容易