可伸缩架构:面向增长应用的高可用
读者评价
作者Lee Atchison在《可伸缩架构:面向增长应用的高可用》中提出了一些基本技巧,使得我们在构建各类应用程序的过程中,既能够保证产品的质量,又能够处理海量的流量、数据以及需求。
虽然书比较薄,但是对于构建高可用应用的因素都囊括了,翻译的也很好
自修复系统可能只是部署在多个服务器之前的负载均衡器,当某个服务器无法处理请求,可以将请求快速路由给其他服务器。这就是一个自修复系统。
如果用户在需要使用你的服务的时候却不能用,他们为什么要买你的服务? 如果用户在需要使用你的服务的时候却不能用,他们会有什么样的想法和感受? 如果你的服务不可用、你如何能让用户感到高兴,给公司赚钱,达成你的商业承诺和目标呢?
内容介绍
随着互联网的发展越来越成熟,流量和数据量飞速增长,许多公司的关键应用程序都面临着伸缩性的问题,系统变得越来越复杂和脆弱,从而导致风险上升、可用性降低。《可伸缩架构:面向增长应用的高可用》是一本实践指南,让IT、DevOps和系统稳定性管理员能够了解到,如何避免应用程序在发展过程中变得缓慢、数据不一致或者彻底不可用等问题。规模增长并不只意味着处理更多的用户,还包括管理更多的风险和保证系统的可用性。作者Lee Atchison 在可用性、风险管理、服务和微服务、扩展应用程序和云服务方面提出了一些技巧,使得我们在构建各类应用程序时,既能够保证产品的质量,又能够处理海量的流量、数据以及需求。
如果你管理着软件开发人员、系统可靠性工程师、DevOps工程师,或者你经营着一个拥有大规模应用程序和系统的机构,《可伸缩架构:面向增长应用的高可用》中所提供的建议和指导都能够帮助你,让你的系统运行得更加平稳和可靠。
目录
- 序 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
- 第4 章 提高下降的可用性 16
- 测试并跟踪当前的可用性 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
- 使用风险模型来制订计划 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
- 第12 章 使用微服务 62
- 如何定义服务 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
- 第4部分 如何让应用程序具有伸缩性
- 第 14章 两次失误的高度 82
- 什么是“两次失误的高度” 83
- 实践中的“两次失误的高度” 83
- -- 丢失一个节点 83
- -- 升级过程中出现的问题 85
- -- 数据中心恢复 86
- -- 隐蔽的共享故障类型 88
- -- 故障循环 89
- 管理你的应用程序 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 的性能检测方法 112
- -- 限定 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
- 可用区不是数据中心 131
- 如何通过地理多样性真正做到高可用 133
- 第 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
- -- 适用场景 149
- 如何选择 150
- 第 25章 AWS.Lambda. 151
- 使用 Lambda 151
- -- 事件处理 151
- -- 手机应用后台 152
- -- 物联网数据采集 153
- Lambda的优缺点 154
- 第Ⅵ部分 总结
- 第 26章 融会贯通156
- 可用性 156
- 风险管理 157
- 服务 157
- 扩展 157
- 云服务 158
- 面向可伸缩的架构 158
- 索引 159
延迟和吞吐量是衡量可扩展性的一对指标,我们希望获得低延迟和高吞吐量的系统架构。所谓低延迟,也就是用户能感受到的系统响应时间,比如一个网页在几秒内打开,越短表示延迟越低,而吞吐量表示同时有多少用户能够享受到这种低延迟,如果并发用户量很大时,用户感觉网页的打开速度很慢,这意味着系统架构的吞吐量有待提高。 扩展性的目标是用可接受的延迟获得最大的吞吐量。可靠性(可用性)目标:用可接受的延迟获得数据更新的一致性。
可伸缩性(可扩展性)是一种对软件系统计算处理能力的设计指标,高可伸缩性代表一种弹性,在系统扩展成长过程中,软件能够保证旺盛的生命力,通过很少的改动甚至只是硬件设备的添置,就能实现整个系统处理能力的线性增长,实现高吞吐量和低延迟高性能。 可伸缩性和纯粹性能调优有本质区别, 可伸缩性是高性能、低成本和可维护性等诸多因素的综合考量和平衡,可伸缩性讲究平滑线性的性能提升,更侧重于系统的水平伸缩,通过廉价的服务器实现分布式计算;而普通性能优化只是单台机器的性能指标优化。他们共同点都是根据应用系统特点在吞吐量和延迟之间进行一个侧重选择,当然水平伸缩分区后会带来CAP定理约束。 软件的可扩展性设计非常重要,但又比较难以掌握,业界试图通过云计算或高并发语言等方式节省开发者精力,但是,无论采取什么技术,如果应用系统内部是铁板一块,例如严重依赖数据库,系统达到一定访问规模,负载都集中到一两台数据库服务器上,这时进行分区扩展伸缩就比较困难,正如Hibernate框架创建人Gavin King所说:关系数据库是最不可扩展的。