大型网站技术架构核心原理与案例分析 读书笔记
高可用架构
一、度量与考核
可用性度量
QQ的可用性是4个9,即99.99%,这意味着QQ服务要保证在所有运行时间中只有0.01%的时间不可用,也就是一年中大约有53分钟不可用。
网站不可用时间(故障时间) = 故障修复时间点 - 故障发现(报告)时间点
网站年度可用性指标 = (1 - 网站不可用时间/年度总时间) x 100%
对于大多数时间而言
- 2个9是基本可用,网站年度不可用时间少于88小时;
- 3个9是较高可用,网站年度不可用时间少于9小时;
- 4个9是具有自动恢复能力的高可用,网站年度不可用时间少于53分钟;
- 5个9是极高可用性,网站年度不可用时间少于5分钟。
对网站整体而言,达到4个9或5个9除了过硬的技术、大量资金设备投入和工程师责任心,还要看运气。
著名网站不一定都有高可用性,比如Twitter的可用性不足2个9.
考核
每个工程师的考核使用故障分。故障分是对网站故障进行分类加权计算故障责任的方法。
故障分类示例图:
故障处理流程示意图:
二、高可用架构
企业级应用系统为了提高系统可用性,会采用昂贵的软硬件设备。
互联网公司更多采用PC级服务器、开源数据库和操作系统,这些廉价设备可以节约成本但可用性低,特别是服务器。低价商业服务器一年宕机一次是大概率事件,高强度频繁读写的普通硬盘损坏概率也更高。
网站高可用架构设计的目的是,保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。
实现上述高可用架构的主要手段是数据和服务的冗余备份和失效转移
典型的网站分层模型是应用层、服务层、数据层。中小网站在具体部署时,通常将应用层和服务层部署在一起,而数据层另外部署。(这也是网站架构演化的第一步。)
三、应用层
通过负载均衡实现无状态服务的失效转移
引用服务器集群的session管理
1. session复制。
早期企业应用系统中使用较多,适合小型集群。不适合大型集群。
示意图:
2. session绑定
利用LB的原地址hash算法实现,来源于同一IP的请求分发到同一服务器上(也可以根据cookie信息分发,要求LB工作在HTTP层)。这种方法又叫做会话黏滞。
session绑定屎不符合高可用需求的,因为一旦一台服务器宕机,那么该机器的session就不存在了。虽然大部分LB都提供源地址负载均衡算法,但很少有网站利用这个算法进行session管理。
示意图:
3. 利用Cookie记录Session
4. Session服务器
四、服务层
- 分级管理
- 超时设置
- 异步调用
- 服务降级。主要有拒绝服务和关闭服务。如Twitter使用随机拒绝请求的策略。
- 幂等性设计
五、数据层
CAP原理
为了保证数据层的高可用,网站通常会牺牲另一个指标:数据一致性。
大型网站通常选择强化分布式存储系统的可用性和伸缩性,而在某种程度上放弃一致性。
数据备份
冷备份不能保证数据最终一致,也不能保证数据可用性。
热备份分为异步热备方式和同步热备方式。
失效转移
数据服务器集群中任何一台服务器宕机,应用程序针对这台服务器的所有读写操作都要重新路由到其他服务器,保证数据访问不会失败,这个过程叫失效转移。
失效转移有三个部分:失效确认、访问转移、数据恢复。
确认是否宕机的手段:心跳检测和程序访问失败报告。程序访问失败报告后还要发送一次心跳检测进行确认。
六、高可用网站的软件质量保证
在网站运维实践中,除了网络、服务器等硬件故障导致的系统可用性风险外,还有来自软件系统本身的风险。网站为了保证线上系统的可用性,要采取一些与传统软件开发不同的质量保证手段。
网站发布
发布过程中,每次关闭的是集群中一小部分服务器,发布完成后立即可以访问,因此整个发布过程不影响用户使用。
示意图:
自动化测试
每次发布的新功能都是在原有系统功能上的小幅增加,但为了保证系统没有引入未知bug, 网站测试还是要对整个网站功能进行全面的回归测试。此外还要测试各种浏览器的兼容性。在发布频繁的网站应用中,如果使用人工测试,成本、时间及测试覆盖率都难以接受。
目前大部分网站都采用Web自动化测试技术,使用自动测试工具或脚本完成测试。比较流行的有ThoughtWorks开发的Selenium. Selenium运行在浏览器中,模拟用户进行测试,因此Selenium可以同时完成Web功能测试和浏览器兼容测试。
大型网站通常也会开发自己的自动化测试工具,可以一键完成系统部署,测试数据生成、测试执行、测试报告生成等全部测试过程。许多网站测试工程师的编码能力毫不逊色于开发工程师。
预发布验证
先发不到预发布服务器上,开发工程师和测试工程师在预发布服务器上进行验证,执行一些典型的业务流程,确认系统没有问题后才正式发布。
预发布服务器是一种特殊用途的服务器,和线上正式服务器唯一的不同是没有配置在负载均衡服务器上,外部用户无法访问。
如图:
代码控制
主干发布、分支开发是主流的方式。
Git也逐渐取代SVN成为主流。
自动化发布
很多网站选择周四作为发布日,这样一周前面有三天时间可以准备、后面有一天可以挽回错误。
灰度发布
七、运行监控
监控数据采集
- 用户行为日志收集。用户操作系统、浏览器版本、IP、页面访问路径、页面停留时间等。这些对统计网站PV/UV指标、分析用户行为、优化网站设计、个性化营销与推荐等非常重要。具体可以通过服务端日志收集和客户端日志收集实现。由于大型网站的用户日志数量惊人,许多网站逐步开发基于Storm的日志统计与分析工具。
- 服务器性能监控。开源性能监控工具Ganglia,支持大规模服务器集群,并支持web图形化实时数据展示。
- 运行数据报告。具体的业务相关,如缓冲命中率、平均响应延迟时间、每分钟发送邮件数目、待处理的任务总数等。
监控管理
- 系统报警
- 失效转移
- 自动优雅降级