序
我们生活在一个有趣的时代,可以称它是一个软件的寒武纪大爆炸。在这个过程中,构建新系统的成本呈数量级式下降,同时系统之间的关联程度也呈同等数量级的增长。借助于Amazon的AWS、微软的Azure和Google的GCP等资源,我们可以将系统在物理上扩展到一个几年前还只能想象的规模。
这些资源及其似乎无限的能力,正在以各种前所未见的方式,将新的思想、产品和市场极其快速地传播出去。但是,只有当我们构建的系统可以保持扩展的同时,所有这些探索才能成为可能。与以前相比,虽然构建小型系统变得容易很多,但是构建一个可以快速、可靠扩展的系统,并不像增加更多的硬件和存储空间那么容易,实际证明,这要难得多。
每个软件系统都会经历一个可预见的生命周期,从一个人能够完全理解的、小型的、设计精妙的解决方案,迅速增长为一个积累了大量技术债务的庞大系统,随后又逐渐分裂成由一些不完善的服务随机组成的组合,并最终演化成在广度(更多用户)和深度(更多功能)方面均可稳定扩展的、设计良好的分布式系统。对于这样的系统来说,我们很容易从外部了解要做哪些事情(让它变得更加可靠!),但又很难了解它内部的细节。幸运的是,本书是一本关于这方面不可或缺的指南,从可用性到服务层,从比赛日到风险模型,Lee一步步介绍了影响大规模系统的各个关键因素和实践方式。
Lee加入我们的时候,是NewRelic第一次从仅拥有一个产品正在向多个产品转型的时期,当时我们正沉浸在用户极速增长和公司成功的喜悦中。Lee的到来,为我们带来了他在Amazon的丰富经验,不管是零售业务还是AWS业务都曾经历过巨大的增长。Lee曾是这些团队的领头人,曾经积极参与过与可扩展性有关的所有事情,也遇到过很多失败。对我们来说,幸运的是,他已经经历过这些挫折与困苦,其中的教训可以让我们避免再犯同样的错误。
在Lee加入NewRelic之前,多年以来,我们一直经历着系统服务不可用的尴尬处境。我们原有的庞大系统也逐渐无法支持业务的发展,不管是可用性、可靠性还是性能都不是很好。但是,通过充分运用Lee在本书中所写的各项技巧,我们逐渐克服了这些困难,并构建了如今稳定可靠的企业级服务。其中我们使用的一个工具,建立了可用性工程的四个级别:青铜、白银、黄金和白金。要达到青铜级,团队必须拥有风险模型以及预定义的SLA标准。要达到白银级,团队必须能够监控风险模型中标识出来的问题,并使用比赛日的方式来解决。黄金级意味着风险已经被缓解掉了。白金级如同CMM5级一样,不仅系统可以自愈,而且我们关注持续性的改进。我们首先集中精力对第一级的服务进行改进,然后上升到第二级的服务,逐步推进,最终使得所有团队都至少达到了白银级,并且大多数团队通过了黄金级,甚至有几个团队达到了白金级。
后来我加入了InVisionApp这个更年轻的公司。我又一次经历着从早期成功向高速增长的过程,一直推动大家去使用Lee之前带给我的技术和工具。在这个新系统、新产品、新公司的爆炸年代,我强烈建议大家跟我做一样的事:向Lee学习如何构建可伸缩的系统。
——BjornFreeman-Benson博士,InVisionApp首席技术官
前言
当应用程序开始增长时,通常会出现两件事情:它们明显变得更加复杂(也更加脆弱),并且需要处理显著增加的流量(需要更先进、更复杂的管理机制)。这会让应用程序逐渐陷入一个死亡漩涡,用户会不断经历着限流、宕机以及其他服务质量和可用性方面的问题。
但是你的用户不会关心这些。他们只希望使用应用来做他们希望做的事情。如果你的应用程序宕机、响应缓慢或者信息不一致,用户会马上抛弃你,转而投靠能够帮助他们处理生意的竞争对手。
本书可教会你一些如何构建并管理大规模应用程序的基本技巧,帮助你避免陷入如上所述的死亡漩涡。一旦你掌握了这些技巧,你的系统就能够可靠处理海量的流量,从容面对流量中大量的不确定性,同时不会对用户期望造成任何影响。
本书的读者对象
本书的目标读者包括构建和管理大规模应用程序和系统的软件工程师、架构师、技术经理以及总监。如果你管理着软件开发人员、系统可靠性工程师、DevOps工程师,或者你经营着一个拥有大规模应用程序和系统的机构,本书中所提供的建议和指导都能够帮助你,让你的系统运行得更加平稳和可靠。
如果你的应用程序已经从很小的规模变得很大(并且正在经历着增长所带来的各种问题),你可能正在为系统的低可靠性和低可用性烦恼。如果你正在头疼如何管理技术债务以及相关的系统故障,本书恰好提供了这些方面的指导,能够帮助你通过降低技术债务,让应用程序更轻松地扩展到更大规模。
编写本书的原因
在Amazon零售和AWS业务多年从事构建高可伸缩应用程序之后,我加入了NewRelic这个正在迅速成长的公司。当时,NewRelic已经感受到了因为缺少管理高可伸缩应用程序的系统、流程所带来的痛苦,但是尚未完整形成能够扩大其应用程序规模的流程和规范。
在NewRelic,我亲眼目睹了一个公司在扩张规模过程中所经历的痛苦与挣扎,同时也意识到,还有很多其他公司每天都在经历着这些痛苦。
编写本书的初衷,是为了帮助那些正在面对其应用程序高速增长的人们,使其了解到一些有用的流程和最佳实践,避免他们再掉入规模扩张过程的各种陷阱之中。
无论你的应用程序每年增长十倍还是百分之十,也无论增长的是用户数量、交易数量、数据存储量还是代码复杂性,本书都可以在构建和维护应用程序方面为你提供帮助,让它们在保持高可用性的前提下实现增长。
现在我们所说的规模
基于云的服务正在以极快的速度增长和扩张。这主要归功于对云服务的大量需求,“软件即服务(SaaS)”逐渐成为应用程序开发的标准。由于SaaS应用程序天生多租户的特点,它们对于规模上的问题尤其敏感。
随着世界的改变,以及我们对SaaS服务、云服务、海量应用程序越来越多的关注,规模性问题也变得越来越重要。似乎我们看不到,云应用程序在体积和复杂性方面会出现增长到头的情况。
关键的机制在于,我们当前用来管理大规模系统的前沿科技,很可能会成为明天的基础工具,而明天我们可能遇到的规模问题,也会让当前的解决方案相形见绌。我们需要越来越复杂的系统和架构,来处理将来可能无限增长的规模。
本书的目的,就是为了提供可以禁得起时间考验的知识。
本书导读
管理规模并不只是管理流量,还包括管理风险和可用性。通常来说,所有这些东西都是描述相同问题的不同方式,并且它们息息相关。因此,为了能够合理地讨论规模问题,我们还必须考虑到可用性、风险管理以及像微服务和云服务这样的现代架构模型。因此,本书按照如下章节来划分内容。
第Ⅰ部分:可用性
当某个应用程序开始扩张规模时,可用性和可用性管理通常是最先受到影响的部分。
第1章,什么是可用性为了更好地让读者理解,我们会讲解一下高可用性的意义,以及它与可靠性之间的区别。
第2章,提高应用程序可用性的五个要点
在本章中,我针对如何提高应用程序的可用性提出了五个核心方向。
第3章,测量可用性
本章会介绍一种测量可用性的标准算法,并进一步讲解高可用性的作用和价值。
第4章,提高下降的可用性如果你的应用程序正遇到可用性的问题(或者你想知道这是否正在发生),我们提供了一些管理手段,来帮助你提高应用程序的可用性。
第Ⅱ部分:风险管理
理解系统中的风险,对于提高应用程序的可用性,以及它后续向更大规模发展的能力是至关重要的。
第5章,什么是风险管理
本章会通过介绍风险管理的基本知识,引出如何管理高可伸缩应用程序的话题。
第6章,可能性与严重性本章会讨论风险发生时的严重性与可能性之间的区别。它们都非常重要,但是方式不同。
第7章,风险模型
在本章中,我会以一个精心设计的系统为例,来帮助你理解和管理系统中的风险。
第8章,风险缓和
本章会讨论如何处理系统中已知的风险,并减少它们对应用程序的影响。
第9章,比赛日本章会介绍如何对风险管理计划、风险缓和计划以及容灾计划进行持续的测试和评估。本章回顾了在生产环境实现比赛日所需的技术,以及它所带来的好处。
第10章,构建低风险系统
在本章中,我会给出如何降低应用程序中的风险,以及如何构建低风险系统的建议。
第Ⅲ部分:服务和微服务
服务和微服务都是一种架构方案,用于构建需要更大规模运行的、更加大型且复杂的应用程序。
第11章,为什么使用服务
本章会介绍为什么服务对于构建高度可扩展的应用程序如此重要。
第12章,使用微服务
在本章中,我会介绍如何创建基于微服务的架构,主要关注于如何对服务大小进行合理分割,确定服务的边界,以便提高可扩展性和可用性。
第13章,处理服务故障
在本部分的最后一章中,我们会来讨论如何构建能够处理故障的服务。
第Ⅳ部分:如何让应用程序具有伸缩性
“伸缩”其实不仅仅与流量有关,它关系你的组织,以及你的组织如何来响应更大的应用程序需求。
第14章,两次失误的高度
本章会介绍如何在出现故障的情况下,依然能够通过伸缩系统来保持高可用性。
第15章,服务所有权
本章会讲解,关注服务的所有权,能如何帮助你扩展组织和应用程序。
第16章,服务分级
本章会介绍如何区分各个服务的关键程度,从而帮助管理对服务的期望。
第17章,使用服务分级
当制订服务分级制度之后,我们会介绍如何通过它来管理服务故障的影响、响应性需求以及期望管理。
第18章,服务等级协议
在本章中,我们会讨论如何使用SLA来管理服务所有者之间的相互依赖。
第19章,持续改进
本章会就如何改进应用程序整体的可扩展性,提供相应的技术和指导。
第Ⅴ部分:云服务
对于构建和管理需要极强可伸缩能力的大型、关键性系统来说,基于云的服务正在变得日益重要。
第20章,变化和云服务本章介绍了云服务对构建高度可伸缩的Web应用程序所带来的改变。
第21章,云上的
目录
序. .......................... xv
前言. ......................xvii
第 1章 什么是可用性... 2
可用性与可靠性 ............................................... 3
什么导致了低可用性 ....................................... 4
第 2章 提高应用程序可用性的五个要点......................................... 6
要点 1:时刻考虑应对故障 ............................. 7
要点 2:时刻考虑如何伸缩 ............................. 8
要点 3:缓和风险 ............................................ 9
要点 4:监控可用性 ...................................... 10
要点 5:以预测和确定的方式来应对可用性问题 ...................................................... 11
做好准备 ........................................................ 12
第 3章 测量可用性... 13
N个 9 14
什么样的可用性是合理的 ...................... 14
不要上当 ........................................................ 14
通过数字来体现可用性.................................. 15
测试并跟踪当前的可用性 .............................. 17
将手动流程自动化 ......................................... 17
自动化部署............................................. 18
配置管理 ................................................ 18
更改实验和高频次更改 .......................... 19
自动化的变更完备性测试 ...................... 20
改进你的系统 ................................................ 20
不断变化和发展中的应用程序 ...................... 20
时刻关注可用性 ............................................. 21
第 5章 什么是风险管理. .......................................................... 24
管理风险 ........................................................ 25
识别风险 ........................................................ 25
消除最严重的风险 ......................................... 26
风险缓和 ........................................................ 26
定期检查 ........................................................ 27
对风险管理的总结 ......................................... 27
第 6章 可能性与严重性. .......................................................... 28
10佳列表:低可能性,低严重性 .................. 29
订单数据库:低可能性,高严重性 ............... 29
自定义字体:高可能性,低严重性 ............... 30
T恤图片:高可能性,高严重性 ................... 31
第 7章 风险模型...... 32
风险模型的作用域 ......................................... 34
创建风险模型 ................................................ 34
通过头脑风暴建立风险列表 .................. 35
填写可能性和严重性字段 ...................... 36
风险项详情............................................. 37
触发计划 ................................................ 37
使用风险模型来制订计划 .............................. 37
维护风险模型 ................................................ 38
第 8章 风险缓和...... 40
恢复计划 ........................................................ 41
容灾计划 ........................................................ 42
改进我们的风险状况 ..................................... 43
第 9章 比赛日......... 44
预发布环境和生产环境.................................. 44
在生产环境中举行比赛日的担心 ................... 46
比赛日测试 .................................................... 47
第 10章 构建低风险系统......................................................... 48
冗余 .. 48
幂等接口示例 ................................................ 49
增加了复杂性的冗余改进 .............................. 49
独立性 ............................................................ 50
安全 .. 51
简单性 ............................................................ 51
自修复 ............................................................ 52
运维流程 ........................................................ 53
第 11章 为什么使用服务. ......................................................... 56
单体应用程序 ................................................ 56
基于服务的应用程序 ..................................... 57
所有权收益 .................................................... 58
规模收益 ........................................................ 60
如何定义服务 ................................................ 63
深入了解服务 ......................................... 63
指导原则 1:特定的业务需求 ................ 63
指导原则 2:清晰和独立的团队所有权 . 64
指导原则 3:天然隔离的数据 ................ 65
指导原则 4:共享的能力 /数据 ............. 67
多种原因 ................................................ 67
过犹不及 ........................................................ 68
适当的平衡 .................................................... 69
第 13章 处理服务故障............................................................ 70
级联式的服务故障 ......................................... 70
如何响应服务故障 ......................................... 71
可预测的响应 ......................................... 72
可理解的响应 ......................................... 73
合理的响应............................................. 73
如何确定故障 ................................................ 74
适当的行为 .................................................... 76
优雅降级 ................................................ 76
优雅补偿 ................................................ 77
尽早失败 ................................................ 77
用户导致的问题 ..................................... 78
第Ⅳ部分 如何让应用程序具有伸缩性
第 14章 两次失误的高度......................................................... 82
什么是“两次失误的高度” ............................ 83
实践中的“两次失误的高度” ........................ 83
丢失一个节点 ......................................... 83
升级过程中出现的问题 .......................... 85
数据中心恢复 ......................................... 86
隐蔽的共享故障类型 .............................. 88
管理你的应用程序 ......................................... 90
航天飞机 ........................................................ 90
第 15章 服务所有权.. 92
由独立团队负责的服务架构 .......................... 92
STOSA应用程序和组织的好处 ..................... 94
成为一个服务所有者意味着什么 ................... 94
第 16章 服务分级. .... 97
应用复杂性 .................................................... 97
什么是服务分级 ............................................. 98
为服务分配服务级别标签 .............................. 99
1级服务 ................................................. 99
2级服务 ................................................. 99
3级服务 ............................................... 100
4级服务 ............................................... 100
示例:在线商店 ........................................... 100
接下来呢 ...................................................... 103
第 17章 使用服务分级.......................................................... 104
期望 104
响应性 .......................................................... 104
依赖 106
关键依赖 .............................................. 106
非关键依赖........................................... 107
小结 107
第 18章 服务等级协议.......................................................... 108
什么是服务等级协议 ................................... 108
外部 SLA与内部 SLA的对比 ..................... 110
为什么内部 SLA很重要 .............................. 110
SLA可以作为一种信任的手段 .....................111
SLA可以用于问题诊断 ................................111
限定 SLA .............................................. 113
排名 SLA .............................................. 113
延迟分组 .............................................. 115
究竟应当定义多少内部 SLA,以及定义哪些内部 SLA ........................................... 116
关于 SLA的其他评价 .................................. 116
第 19章 持续改进. ... 117
定期检查你的应用程序................................ 117
微服务 .......................................................... 118
服务所有权 .................................................. 118
无状态服务 .................................................. 118
数据在哪里 .................................................. 118
数据分区 ...................................................... 119
持续改进的重要性 ....................................... 121
第 20章 变化和云服务. ..........................................................124
云服务有哪些变化 ....................................... 124
对基于微服务架构的认可 .................... 124
更小、更专业的服务 ............................ 125
更专注于应用程序 ............................... 125
微型初创公司 ....................................... 125
安全和合规已经成熟 ............................ 125
变化还在继续 .............................................. 125
第 21章 云上的分布.127
AWS的架构 ................................................. 127
AWS区域 ............................................. 127
AWS可用区 ......................................... 128
数据中心 .............................................. 128
总体架构概述 .............................................. 129
第 22章 托管的基础设施....................................................... 134
基于云的服务架构 ....................................... 134
原生资源 .............................................. 135
托管资源(基于服务器) ....................... 136
托管资源(不基于服务器) ................... 137
使用托管资源的影响 ................................... 138
使用非托管资源的影响................................ 138
监控和 CloudWatch ...................................... 138
第 23章 云资源分配. ............................................................ 140
固定额度的资源分配 ................................... 140
调整分配 .............................................. 141
预留容量 .............................................. 142
基于使用量的资源分配................................ 143
基于使用量分配资源的好处 ................ 144
资源分配技术的利与弊................................ 145
第 24章 可伸缩的计算选项.................................................... 146
云服务器 ...................................................... 147
优点 ...................................................... 147
缺点 ...................................................... 147
适用场景 .............................................. 147
计算分片 ...................................................... 147
优点 ...................................................... 147
缺点 ...................................................... 148
适用场景 .............................................. 148
动态容器 ...................................................... 148
优点 ...................................................... 148
缺点 ...................................................... 149
适用场景 .............................................. 149
微计算 .......................................................... 149
优点 ...................................................... 149
缺点 ...................................................... 150
第 25章 AWS.Lambda....................................................... 151
使用 Lambda ................................................ 151
事件处理 .............................................. 151
手机应用后台 ....................................... 152
物联网数据采集 ................................... 153
Lambda的优缺点......................................... 154
第Ⅵ部分 总结
第 26章 融会贯通...156
可用性 .......................................................... 156
风险管理 ...................................................... 157
服务 157
扩展 157
云服务 .......................................................... 158
面向可伸缩的架构 ....................................... 158
索引. ..................... 159