描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121297267
√ 超级畅销书,Amazon主站排名*,打标#1 Best Seller
√ 运维高烧不退,谷歌神书问世,继续为这一热潮推波助澜
√ 本书解密全球*神秘*让人仰望的技术岗位——谷歌SRE
√ 未出先火,本书原著问世时各大社区火爆异常、人气爆棚
大型软件系统生命周期的绝大部分都处于“使用”阶段,而非“设计”或“实现”阶段。那么为什么我们却总是认为软件工程应该首要关注设计和实现呢?在《SRE:Google运维解密》中,Google SRE的关键成员解释了他们是如何对软件进行生命周期的整体性关注的,以及为什么这样做能够帮助Google成功地构建、部署、监控和运维世界上现存*的软件系统。通过阅读《SRE:Google运维解密》,读者可以学习到Google工程师在提高系统部署规模、改进可靠性和资源利用效率方面的指导思想与具体实践——这些都是可以立即直接应用的宝贵经验。
任何一个想要创建、扩展大规模集成系统的人都应该阅读《SRE:Google运维解密》。《SRE:Google运维解密》针对如何构建一个可长期维护的系统提供了非常宝贵的实践经验。
前言 xxxi
序言 xxxv
第Ⅰ部分 概览
第1 章 介绍 2
系统管理员模式 2
Google 的解决之道:SRE 4
SRE 方法论 6
确保长期关注研发工作 6
在保障服务SLO 的前提下化迭代速度 7
监控系统 8
应急事件处理 8
变更管理 9
需求预测和容量规划 9
资源部署 10
效率与性能 10
小结 10
第2 章 Google 生产环境:SRE 视角 11
硬件 11
管理物理服务器的系统管理软件 13
管理物理服务器 13
存储 14
网络 15
其他系统软件 16
分布式锁服务 16
监控与警报系统 16
软件基础设施 17
研发环境 17
莎士比亚搜索:一个示范服务 18
用户请求的处理过程 18
任务和数据的组织方式 19
第Ⅱ部分 指导思想
第3 章 拥抱风险 23
管理风险 23
度量服务的风险 24
服务的风险容忍度 25
辨别消费者服务的风险容忍度 26
基础设施服务的风险容忍度 28
使用错误预算的目的 30
错误预算的构建过程 31
好处 32
第4 章 服务质量目标 34
服务质量术语 34
指标 34
目标 35
协议 36
指标在实践中的应用 37
运维人员和终用户各关心什么 37
指标的收集 37
汇总 38
指标的标准化 39
目标在实践中的应用 39
目标的定义 40
目标的选择 40
控制手段 42
SLO 可以建立用户预期 42
协议在实践中的应用 43
第5 章 减少琐事 44
琐事的定义 44
为什么琐事越少越好 45
什么算作工程工作 46
琐事繁多是不是一定不好 47
小结 48
第6 章 分布式系统的监控 49
术语定义 49
为什么要监控 50
对监控系统设置合理预期 51
现象与原因 52
黑盒监控与白盒监控 53
4 个黄金指标 53
关于长尾问题 54
度量指标时采用合适的精度 55
简化,直到不能再简化 55
将上述理念整合起来 56
监控系统的长期维护 57
Bigtable SRE :警报过多的案例 57
Gmail :可预知的、可脚本化的人工干预 58
长跑 59
小结 59
第7 章 Google 的自动化系统的演进 60
自动化的价值 60
一致性 60
平台性 61
修复速度更快 61
行动速度更快 62
节省时间 62
自动化对Google SRE 的价值 62
自动化的应用案例 63
Google SRE 的自动化使用案例 63
自动化分类的层次结构 64
让自己脱离工作:自动化所有的东西 66
舒缓疼痛:将自动化应用到集群上线中 67
使用Prodtest 检测不一致情况 68
幂等地解决不一致情况 69
专业化倾向 71
以服务为导向的集群上线流程 72
Borg :仓库规模计算机的诞生 73
可靠性是基本的功能 74
建议 75
第8 章 发布工程 76
发布工程师的角色 76
发布工程哲学 77
自服务模型 77
追求速度 77
密闭性 77
强调策略和流程 78
持续构建与部署 78
构建 78
分支 79
测试 79
打包 79
Rapid 系统 80
部署 81
配置管理 81
小结 82
不仅仅只对Google 有用 83
一开始就进行发布工程 83
第9 章 简单化 85
系统的稳定性与灵活性 85
乏味是一种美德 86
我不放弃我的代码 86
“负代码行”作为一个指标 87
小 API 87
模块化 87
发布的简单化 88
小结 88
第Ⅲ部分 具体实践
第10 章 基于时间序列数据进行有效报警 93
Borgmon 的起源 94
应用软件的监控埋点 95
监控指标的收集 96
时间序列数据的存储 97
标签与向量 98
Borg 规则计算 99
报警 104
监控系统的分片机制 105
黑盒监控 106
配置文件的维护 106
十年之后 108
第11 章 on-call 轮值 109
介绍 109
on-call 工程师的一天 110
on-call 工作平衡 111
数量上保持平衡 111
质量上保持平衡 111
补贴措施 112
安全感 112
避免运维压力过大 114
运维压力过大 114
奸诈的敌人—运维压力不够 115
小结 115
第12 章 有效的故障排查手段 116
理论 117
实践 119
故障报告 119
定位 119
检查 120
诊断 122
测试和修复 124
神奇的负面结果 125
治愈 126
案例分析 127
使故障排查更简单 130
小结 130
第13 章 紧急事件响应 131
当系统出现问题时怎么办 131
测试导致的紧急事故 132
细节 132
响应 132
事后总结 132
变更部署带来的紧急事故 133
细节 133
事故响应 134
事后总结 134
流程导致的严重事故 135
细节 135
灾难响应 136
事后总结 136
所有的问题都有解决方案 137
向过去学习,而不是重复它 138
为事故保留记录 138
提出那些大的,甚至不可能的问题:假如…… 138
鼓励主动测试 138
小结 138
第14 章 紧急事故管理 140
无流程管理的紧急事故 140
对这次无流程管理的事故的剖析 141
过于关注技术问题 141
沟通不畅 141
不请自来 142
紧急事故的流程管理要素 142
嵌套式职责分离 142
控制中心 143
实时事故状态文档 143
明确公开的职责交接 143
一次流程管理良好的事故 144
什么时候对外宣布事故 144
小结 145
第15 章 事后总结:从失败中学习 146
Google 的事后总结哲学 146
协作和知识共享 148
建立事后总结文化 149
小结以及不断优化 151
第16 章 跟踪故障 152
Escalator 152
Outalator 153
聚合 154
加标签 155
分析 155
未预料到的好处 156
第17 章 测试可靠性 157
软件测试的类型 158
传统测试 159
生产测试 160
创造一个构建和测试环境 163
大规模测试 165
测试大规模使用的工具 166
针对灾难的测试 167
对速度的渴求 168
发布到生产环境 170
允许测试失败 170
集成 172
生产环境探针 173
小结 175
第18 章 SRE 部门中的软件工程实践 176
为什么软件工程项目对SRE 很重要 176
Auxon 案例分析:项目背景和要解决的问题 177
传统的容量规划方法 177
解决方案:基于意图的容量规划 179
基于意图的容量规划 180
表达产品意图的先导条件 181
Auxon 简介 182
需求和实现:成功和不足 183
提升了解程度,推进采用率 185
团队内部组成 187
在SRE 团队中培养软件工程风气 187
在SRE 团队中建立起软件工程氛围:招聘与开发时间 188
做到这一点 189
小结 190
第19 章 前端服务器的负载均衡 191
有时候硬件并不能解决问题 191
使用DNS 进行负载均衡 192
负载均衡:虚拟IP 194
第20 章 数据中心内部的负载均衡系统 197
理想情况 198
识别异常任务:流速控制和跛脚鸭任务 199
异常任务的简单应对办法:流速控制 199
一个可靠的识别异常任务的方法:跛脚鸭状态 200
利用划分子集限制连接池大小 201
选择合适的子集 201
子集选择算法一:随机选择 202
子集选择算法二:确定性算法 204
负载均衡策略 206
简单轮询算法 206
闲轮询策略 209
加权轮询策略 210
第21 章 应对过载 212
QPS 陷阱 213
给每个用户设置限制 213
客户端侧的节流机制 214
重要性 216
资源利用率信号 217
处理过载错误 217
决定何时重试 218
连接造成的负载 220
小结 221
第22 章 处理连锁故障 223
连锁故障产生的原因和如何从设计上避免 224
服务器过载 224
资源耗尽 225
服务不可用 228
防止软件服务器过载 228
队列管理 229
流量抛弃和优雅降级 230
重试 231
请求延迟和截止时间 234
慢启动和冷缓存 236
保持调用栈永远向下 238
连锁故障的触发条件 238
进程崩溃 239
进程更新 239
新的发布 239
自然增长 239
计划中或计划外的不可用 239
连锁故障的测试 240
测试直到出现故障,还要继续测试 240
测试常用的客户端 241
测试非关键性后端 242
解决连锁故障的立即步骤 242
增加资源 242
停止健康检查导致的任务死亡 242
重启软件服务器 242
丢弃流量 243
进入降级模式 243
消除批处理负载 244
消除有害的流量 244
小结 244
第23 章 管理关键状态:利用分布式共识来提高可靠性 246
使用共识系统的动力:分布式系统协调失败 248
案例1 :脑裂问题 249
案例2 :需要人工干预的灾备切换 249
案例3 :有问题的小组成员算法 249
分布式共识是如何工作的 250
Paxos 概要:协议示例 251
分布式共识的系统架构模式 251
可靠的复制状态机 252
可靠的复制数据存储和配置存储 252
使用领头人选举机制实现高可用的处理系统 253
分布式协调和锁服务 253
可靠的分布式队列和消息传递 254
分布式共识系统的性能问题 255
复合式Paxos :消息流过程详解 257
应对大量的读操作 258
法定租约 259
分布式共识系统的性能与网络延迟 259
快速Paxos 协议:性能优化 260
稳定的领头人机制 261
批处理 262
磁盘访问 262
分布式共识系统的部署 263
副本的数量 263
副本的位置 265
容量规划和负载均衡 266
对分布式共识系统的监控 270
小结 272
第24 章 分布式周期性任务系统 273
Cron 273
介绍 273
可靠性 274
Cron 任务和幂等性 274
大规模Cron 系统 275
对基础设施的扩展 275
对需求的扩展 276
Google Cron 系统的构建过程 277
跟踪Cron 任务的状态 277
Paxos 协议的使用 277
领头人角色和追随者角色 278
保存状态 281
运维大型Cron 系统 282
小结 283
第25 章 数据处理流水线 284
流水线设计模式的起源 284
简单流水线设计模式与大数据 284
周期性流水线模式的挑战 285
工作分发不均造成的问题 285
分布式环境中周期性数据流水线的缺点 286
监控周期性流水线的问题 287
惊群效应 287
摩尔负载模式 288
Google Workflow 简介 289
Workflow 是模型—视图—控制器(MVC)模式 290
Workflow 中的执行阶段 291
Workflow 正确性保障 291
保障业务的持续性 292
小结 294
第26 章 数据完整性:读写一致 295
数据完整性的强需求 296
提供超高的数据完整性的策略 297
备份与存档 298
云计算环境下的需求 299
保障数据完整性和可用性:Google SRE 的目标 300
数据完整性是手段,数据可用性是目标 300
交付一个恢复系统,而非备份系统 301
造成数据丢失的事故类型 301
维护数据完整性的深度和广度的困难之处 303
Google SRE 保障数据完整性的手段 304
24 种数据完整性的事故组合 304
层: 软删除 305
第二层:备份和相关的恢复方法 306
额外一层:复制机制 308
1T vs. 1E :存储更多数据没那么简单 309
第三层:早期预警 310
确保数据恢复策略可以正常工作 313
案例分析 314
Gmail—2011 年2 月:从GTape 上恢复数据( 磁带) 314
Google Music—2012 年3 月:一次意外删除事故的检测过程 315
SRE 的基本理念在数据完整性上的应用 319
保持初学者的心态 319
信任但要验证 320
xxvi | 目录
不要一厢情愿 320
纵深防御 320
小结 321
第27 章 可靠地进行产品的大规模发布 322
发布协调工程师 323
发布协调工程师的角色 324
建立发布流程 325
发布检查列表 326
推动融合和简化 326
发布未知的产品 327
起草一个发布检查列表 327
架构与依赖 328
集成 328
容量规划 328
故障模式 329
客户端行为 329
流程与自动化 330
开发流程 330
外部依赖 331
发布计划 331
可靠发布所需要的方法论 332
灰度和阶段性发布 332
功能开关框架 333
应对客户端滥用行为 334
过载行为和压力测试 335
LCE 的发展 335
LCE 检查列表的变迁 336
LCE 没有解决的问题 337
小结 338
第Ⅳ部分 管理
第28 章 迅速培养SRE 加入on-call 341
新的SRE 已经招聘到了,接下来怎么办 341
培训初期:重体系,而非混乱 344
系统性、累积型的学习方式 345
目标性强的项目工作,而非琐事 346
培养反向工程能力和随机应变能力 347
反向工程:弄明白系统如何工作 347
统计学和比较性思维:在压力下坚持科学方法论 347
随机应变的能力:当意料之外的事情发生时怎么办 348
将知识串联起来:反向工程某个生产环境服务 348
有抱负的on-call 工程师的5 个特点 349
对事故的渴望:事后总结的阅读和书写 349
故障处理分角色演习 350
破坏真的东西,并且修复它们 351
维护文档是学徒任务的一部分 352
尽早、尽快见习on-call 353
on-call 之后:通过培训的仪式感,以及日后的持续教育 354
小结 354
第29 章 处理中断性任务 355
管理运维负载 356
如何决策对中断性任务的处理策略 356
不完美的机器 357
流状态 357
将一件事情做好 358
实际一点的建议 359
减少中断 361
第30 章 通过嵌入SRE 的方式帮助团队从运维过载中恢复 363
阶段:了解服务,了解上下文 364
确定的压力来源 364
找到导火索 364
第二阶段:分享背景知识 365
书写一个好的事后总结作为示范 366
将紧急事件按类型排序 366
第三阶段:主导改变 367
从基础开始 367
获取团队成员的帮助 367
解释你的逻辑推理过程 368
提出引导性问题 368
小结 369
第 31 章 SRE 与其他团队的沟通与协作 370
沟通:生产会议 371
议程 372
出席人员 373
SRE 的内部协作 374
团队构成 375
高效工作的技术 375
SRE 内部的协作案例分析:Viceroy 376
Viceroy 的诞生 376
所面临的挑战 378
建议 379
SRE 与其他部门之间的协作 380
案例分析:将DFP 迁移到F1 380
小结 382
第32 章 SRE 参与模式的演进历程 383
SRE 参与模式:是什么、怎么样以及为什么 383
PRR 模型 384
SRE 参与模型 384
替代性支持 385
PRR :简单PRR 模型 386
参与 386
分析 387
改进和重构 387
培训 388
“接手”服务 388
持续改进 388
简单PRR 模型的演进:早期参与模型 389
早期参与模型的适用对象 389
早期参与模型的优势 390
不断发展的服务:框架和SRE 平台 391
经验教训 391
影响SRE 的外部因素 392
结构化的解决方案:框架 392
新服务和管理优势 394
小结 395
第Ⅴ部分 结束语
第33 章 其他行业的实践经验 398
有其他行业背景的资深SRE 399
灾难预案与演习 400
从组织架构层面坚持不懈地对安全进行关注 401
关注任何细节 401
冗余容量 401
模拟以及进行线上灾难演习 402
培训与考核 402
对详细的需求收集和系统设计的关注 402
纵深防御 403
事后总结的文化 403
将重复性工作自动化,消除运维负载 404
结构化和理性的决策 406
小结 407
第34 章 结语 408
附录A 系统可用性 411
附录B 生产环境运维过程中的实践 412
附录C 事故状态文档示范 417
附录D 事后总结示范 419
附录E 发布协调检查列表 423
附录F 生产环境会议记录示范 425
参考文献 427
索引 439__
如果用一个词语来描述 Google 的历史,那就是不断地“扩大规模”(scaling up)。Google 的成长经历,是计算机行业中数一数二的成功故事,标志着整个社会向 IT 为中心的商业模式的转变。Google 很早就开始实践 IT 与商业模式的结合,也是向社区推广DevOps 理念的先行者。本书就是由来自公司各个部门,切身参与甚至主导了整个行业转型实践的人写成的。
Google 是在一个系统运维工程师行业转型的阶段发展壮大的。Google 的发展史就像是对传统的系统运维理念发出的革命宣言:我们无法按照传统方式运维Google 系统,必须要思考一种新的模式,但是同时我们也没有时间等待其他人验证和支持我们的理论。在Principles of Network and System Administration(参见文献[bur99])一书的介绍中,我提出了一种观点:系统运维本质上是人与计算机共同参与的一项系统性工程。当时的一些评论者对这种观点表示了强烈的反对:“这个行业还远远没有成熟到可以称为一项工程”。在那时,我甚至对整个运维行业产生了怀疑,认为这个行业在个人英雄主义与神秘色彩中已经永久地迷失了自己,无法前进。但是,这时Google 诞生了,Google 的高速发展将我的预言变成了现实。我之前的定义变成了一个具体的词语:SRE,站点可靠性工程师。我的几个朋友切身参与了这个新职业的创立,用软件工程理念和自动化工具定义了这个行业。一开始,他们显得很神秘,Google 公司内的体验和整个行业也格格不入,Google 太特殊了! 随着时间的推移,公司内外交流逐渐增多。这本书的目标就是将SRE 的一些思考和实践带给整个行业,以促进交流。
在本书中,我们不仅仅展示了 Google 是如何建设维护其富有传奇色彩的大型计算集群的。更重要的是,我们展示了在建设过程中,Google 工程师团队是如何学习、成长、反复修改,后定义出一套完整的工具和科技体系的过程。IT 行业大多自我封闭,交流过少,很多从业人员都或多或少地受教条主义的限制。如果Google 工程师团队能克服这个惯性,保持开放的精神,那么我们也能够一起和他们面对 IT 行业内尖端的挑战。
这本书由一群有共同目标的 Google 工程师写就的短文组成。本书的作者们聚集在同一个公司旗下,为了同一个目标努力,本身就是一件很特别的事情。在本书的各个章节之间经常能看到软件系统的共同点,以及工作模式上的共通之处。我们经常可以从多个角度分析不同的决策选择,了解他们是如何一起解决公司内部多种利益冲突的。这些文章并不是严谨的学术研究论文,而是这些人的切身经历。虽然本书的作者们有着不同的工作目标、写作风格,以及技术背景,但是他们都尝试着去真诚地描述自己遇到的问题和解决的经历。这和 IT 行业内的普遍文风截然不同,风格迥异。有些作者会宣称:“不要做A,只有做B 才是正确的。” 另一些作者会更谨慎,行文更富有哲学性。这其实恰恰代表了整个 IT 行业内不同个性融合的现状。而我们作为读者,作为观察者,并不了解整个Google 的历史,也没有参与到具体的决策过程中,无法全面了解当事人所面临的纠缠不清的挑战,只能带着谦逊的态度远远旁观。在阅读本书的过程中,相信读者一定会产生出许多疑问:“他们当时为什么没有选择X ?”“ 如果他们选择了Y,结果会是怎样?”“ 如果多年之后回头再看,这个选择会是正确的吗?” 这些问题,恰恰是阅读本书的收获,因为我们次有机会将自己的经历、选择和本书陈列的决策逻辑相互对应,从中发现不足和缺陷。
这本书的成书过程也堪称奇迹。今天,我们能感受到整个行业都在鼓吹厚颜无耻的 “代码拿来主义”(just show me the code)。开源软件社区内部正在形成一种“不要问我问题”的风气,过于强调平等却忽略领域专家的意见。Google 是行业内为数不多的,愿意投入精英力量钻研本质问题的公司,而且这些公司精英很多都有工学博士学位。工具永远只是解决方案中的一个小小组件,用来链接日益庞杂的软件、人和海量的数据。这本书中没有药,没有什么东西能解决一切问题,但是这恰恰是本书的宗旨:相比后的软件结果、架构设计而言,真实的设计过程、作者本身的思考经历更有价值。实现细节永远只是短暂存在的,但是文档化的设计过程却是无价之宝。有机会了解到这些设计的内幕真是太难得了!
这本书,归根到底,记录了 Google 这个公司的成长经历。书中的很多故事都是由相互重叠的故事组成的,这恰恰说明了扩展一个计算机系统,要比简单按照书本上的标准架构放大困难得多。一个公司的成长,意味着整个公司商业模式和工作模式的扩展,而不是简单的资源扩张。仅此一点,这本书就物超所值了。
自省,是一个在 IT 行业内部并不流行的词语。我们不断重复发明各种系统。很多年以来,只有 USENIX LISA 大会论坛以及其他几个专注于操作系统的会议会讨论一些 IT 基础设施的设计和实现。很多年后的今天,IT 行业已经天翻地覆,但是本书仍然弥足珍贵:它详细记录了Google 迈过分水岭时期的全过程。很显然,这些经历没有办法完全复制,也许只能被模仿,但是却可以启发读者,指引未来。本书作者们表现出了极大的真诚,显示了谦逊的风格,以及极强的凝聚力、领导力。这些文章记录了作者们的希望、担忧、前言 | xxxiii
成功与失败的经历。我向这些作者们和编者们的勇气致敬,正是这种坦率,让我们能够作为旁观者和后来人,从前人的经历中学习到宝贵的知识。
Mark Burgess
In Search of Certainty 一书作者
Oslo,2016 年3 月
序言
软件工程有的时候和养孩子类似:虽然生育的过程是痛苦和困难的,但是养育孩子成人的过程才是真正需要花费绝大部分精力的地方。但是,传统软件工程专业花费了很多精力讨论软件的开发过程,而不是其后的维护过程。有统计显示, 一个软件系统的40%~90% 的花销其实是花在开发建设完成之后不断维护过程中的。行业内流行的一个说法是:一个系统如果已经开发完成,部署在生产环境上,那么它就是 “稳定的”,就不需要那么多工程师花费精力去优化、维护。我们认为这个说法是错误的。从这个视角出发,我们认为如果软件工程职业主要专注于设计和构建软件系统, 那么应该有另外一种职业专注于整个软件系统的生命周期管理。从其设计一直到部署,历经不断改进,后顺利退役。这样一种职业必须具备非常广泛的技能,但是和其他职业的专注点都不同。Google 将这个职位称为站点可靠性工程师(SRE,Site Reliability Engineering)。
那么,站点可靠性工程师究竟代表着什么呢?的确,这个词语并不能够特别清晰地描述这个职位的意义。基本上每个 Google SRE 都会被经常问到这个职位到底代表什么意思,以及他们的日常工作究竟是什么。
将这个词语展开来说:首先,也是重要的一点,SRE 是工程师(engineer)。SRE 使用计算机科学和软件工程手段来设计和研发大型、分布式计算机软件系统。有的时候,SRE 和产品研发团队共同工作,其他时候我们需要开发这些系统的额外组件:例如备份系统和负载均衡系统等。理想情况下,同时推进这些组件在多个项目中复用。还有的时候,我们的任务是想出各种各样的办法用现有组件解决新的问题。
其次,SRE 的关注焦点在于可靠性。Ben Treynor Sloss,Google 负责7×24 运维的副总裁,SRE 名称的发明者,宣称可靠性应该是任何产品设计中基本的概念:任何一个系统如果没有人能够稳定地使用,就没有存在的意义。因为可靠性 是如此重要,因此SRE 专注于对其负责的软件系统架构设计、运维流程的不断优化,让这些大型软件系统运行得更可靠,扩展性更好,能更有效地利用资源。但是,SRE 并不是无止境地追求完美:当一个系统已经 “足够可靠” 的时候,SRE 通常将精力转而投入到研发新的功能和创造新的产品中。
后,SRE 的主要工作是运维在分布式集群管理系统上运行的具体业务服务(service)。不论是遍布全球的存储服务,还是亿万用户赖以工作的 E-mail 服务,还是 Google 初的 Web 搜索服务。SRE 中的“ S” 开始指代的就是google.com 的运维服务,因为SRE的个工作就是维持网站的正常运转。随着时间的推移,SRE 逐渐接管了 Google 内部绝大部分产品系统,包括 Google Cloud Platform 这类开发者平台,也包括内部的一些非网站类的基础设施系统,例如 Bigtable。
虽然我们在这里将 SRE 的职位定义得比较宽泛,但是在这样一个互联网业务高速发展的时代,这个职位的出现毫不奇怪。同样,虽然在应用系统运营维护的过程中有数不清的重要环节需要关注,我们关注的是“可靠性”这一点也不奇怪。在Web 服务领域里,对服务器端软件的优化和修改是相对可控的,变更管理与生产安全又结合得非常紧密,一种类似于 SRE 的职业早晚会在这个环境下诞生。
虽然 SRE 这个行业是在 Google 内部,从Web 社区中诞生的,但我们认为这个职业对其他团队和组织也有很多值得借鉴的地方。本书是对阐述SRE 发展过程的一次尝试:我们既希望将这些宝贵经验共享给其他相关行业,也希望能从其他行业中汲取知识,从而更好地定义各种角色和术语。为了这个目的,本书将通用的理论、设计理念和思想,与实际的应用工具介绍等分开。在某些需要结合Google 内部信息讨论主题的时候,我们相信读者可以进行类比,将书中的理念与自己的实际环境相结合,以便得出更为有效的结论。本书中也包含了一些对 Google 内部生产环境的介绍,将 Google 内部环境与外部常见的开源类软件相对应。这样可以让本书的一些设计理念与实践的结合度更强,应用起来更容易。
后,我们当然希望社区内出现更多、更可靠的软件系统。我们知道,创业企业甚至中型企业经常对如何应用这些理念和技术感到困惑。可靠性就像安全性,越早关注越好。这就意味着一些小型创业公司,在应付日常面临的种种挑战时,也应该抽出一部分精力来面对可靠性这个话题。这与盖房子有些类似,如果一开始将整个地基打好并保持继续修缮,要比盖好房子之后再重新修改设计要容易得多。本书第4 部分着重介绍了 SRE 团队如何进行内部培训、如何加强内部沟通等实践,很多都可以直接拿来应用。
对中型企业来说,企业内部可能已经有这样的一组人在做着与SRE 非常类似的工作。这些人可能并不叫 SRE 这个名字,甚至可能没有受到管理层的重视。在这样的企业中,提高可靠性好的办法往往就是去认可这些人的工作,并配备足够的激励机制。在牛顿被世界正式认可为物理学家之前,他经常被称作是后的炼金术师。而这些专注于可靠性的工程师们,正如当年的牛顿一样,是一个新时代的开拓者。
如果一定要为SRE 寻找一个起源的话,谁才能够被称为世界上个SRE 呢?我们选择了 Margaret Hamilton,MIT 教授,参与了阿波罗登月计划的软件开发工作。她的工作具有现代SRE 的一切特性。用她自己的话来讲:“团队文化就是从一切经历中不断学习,包括来自那些我们意想不到的地方的经历。”
在Apollo 7 飞船研发期间的某一天,Margaret 带着她的小女儿 Lauren 一起来到公司。在 Margaret 忙着和组员们在大型计算机上运行飞行模拟测试的时候,她的小女儿偷偷地按下了控制台上的 DSKY 键。整个模拟程序出乎意料地崩溃了,导致整个火箭发射程序意外终止。Margaret 和组员调试后发现,原来Lauren 意外触发了 P01 这段子程序的执行,导致了整个模拟过程的失败。(该子程序是起飞前调试程序,执行时会删除现存的导航信息,如果在火箭飞行过程中执行这段程序,计算机将无法继续维持火箭航线,后果将是灾难性的。)
凭借着 SRE 的直觉, Margaret 为项目组提交了一个软件改动,申请在飞行程序中增加一项特殊状态检查,以避免飞行员在飞行过程中意外触发P01 程序的执行。但不幸的是,NASA 管理层认为,这项错误发生的可能性太小,根本不值得为此添加这项修改。于是Margaret 没有能够成功提交这项软件修改。她只能在火箭飞行手册中添加了一段文字,写道:“在飞行过程中,请勿触发P01 程序。” (当时增加这段文字时,很多NASA 工程师都认为这很好笑,认为Margaret 是小题大做,几乎所有人都认为宇航员经过如此长时间的专业训练,是不会犯如此低级的错误的。)
几天后,在Apollo 8 飞船执行下一项飞行任务时。宇航员 Jim Lovell、William Anders和Frank Borman 三人执行一个长达四天的飞行计划途中,Jim Lovell 意外地触发了 P01程序的执行。更巧的是,当天正好是美国圣诞节,大部分工程师都休假去了。可想而知,当时NASA 的一片混乱状态。这次不是演习,而是人命关天的危急时刻,如果不能及时解决,三名宇航员将永远无法安全返回了。所幸,当时 Margaret 的飞行手册更新中恰恰提到了这种情形,并且提供了重新上传数据以及恢复执行的有效办法,在有限的时间内解决了问题,使任务可以继续进行。
Margaret 曾经说过:“无论对一个软件系统运行原理掌握得多么彻底,也不能阻止人犯意外错误。” 在这次危机过后,Margaret 之前提交的修改申请很快就被批准了。
虽然Apollo 8 的事故发生在几十年前,但是工程师们一定不会对此感到陌生, 类似的场景总是在不断重演。希望读者以史为鉴,只有靠着对细节的不懈关注,做好充足的灾难预案和准备工作,时刻警惕着,不放过一切机会去避免灾难发生。这就是SRE 重要的理念!欢迎加入SRE 的大家庭!
如何阅读本书
这本书是由一系列短文组成的, 由Google SRE 成员和前成员共同写就。相比之下,这本书更像是一本会议文集。本书的每一章都可以作为一个独立部分进行阅读,但是读者也可以根据自己的兴趣选择某些章节重点阅读。(如果本书中引用了某些额外文章,你可以在参考文献中找到。)
读者可以按照任何顺序阅读本书,但是我们推荐从第2 章和第3 章开始。这两章描述了Google 的生产运行环境,以及SRE 是如何系统化认知与量化“风险”的(毕竟 “风险” 是SRE 关注的要点)。读者当然也可以选择逐章阅读,本书逻辑上分为以下几个部分:理念性介绍(第Ⅱ部分)、实践(第Ⅲ部分)和管理经验(第Ⅳ部分)。每一部分都配有简介,并且配有SRE 成员以前发表的文章的引用地址。
后,本书配有网站https://g.co/SREBook,其中包括了一些有益读物, 希望读者能从中获得阅读的乐趣。
致谢
本书全靠作者们和技术作家们的不懈努力才得以面世。我们要特别感谢以下内部评审者,他们提供了非常有价值的反馈:Alex Matey、Dermot Duffy、JC van Winkel、John T。
Ben Lutch 和Ben Treynor Sloss 是本书在Google 内部的赞助者; 他们对这项工作的认可和对分享我们运维大规模服务的认可是本书成书的关键条件。
我们特别致谢 Rik Farrow,;login: 的编辑,他与我们的一些作者紧密合作,在USENIX上预发布了本书的一部分内容。
每章中都注明了本章的作者,我们在这里也想特别致谢一下为每一章提供了反馈、讨论以及评审的人。
第3 章:Abe Rahey、Ben Treynor Sloss、Brian Stoler、Dave O’Connor、David Besbris、Jill Alvidrez、Mike Curtis、Nancy Chang、Tammy Capistrant、Tom Limoncelli
第5 章:Cody Smith、George Sadlier、Laurence Berland、Marc Alvidrez、Patrick Stahlberg、Peter Duff、Pim van Pelt、Ryan Anderson、Sabrina Farmer、Seth Hettich
第6 章:Mike Curtis、Jamie Wilkinson、Seth Hettich
第8 章:David Schnur、JT Goldstone、Marc Alvidrez、Marcus Lara-Reinhold、Noah Maxwell、Peter Dinges、Sumitran Raghunathan、Yutong Cho
第9 章:Ryan Anderson
第10 章:Jules Anderson、Max Luebbe、Mikel Mcdaniel、Raul Vera、Seth Hettich
第11 章:Andrew Stribblehill、Richard Woodbury
第12 章:Charles Stephen Gunn、John Hedditch、Peter Nuttall、Rob Ewaschuk、Sam Greenfield
第13 章:Jelena Oertel、Kripa Krishnan、Sergio Salvi、Tim Craig
第14 章:Amy Zhou、Carla Geisser、Grainne Sheerin、Hildo Biersma、Jelena Oertel、Perry Lorier、Rune Kristian Viken
第15 章:Dan Wu、Heather Sherman、Jared Brick、Mike Louer、Štěpán Davidovi?、Tim Craig
第16 章:Andrew Stribblehill、Richard Woodbury
第17 章:Isaac Clerencia、Marc Alvidrez
第18 章:Ulric Longyear
第19 章:Debashish Chatterjee、Perry Lorier
第20 章和第21 章:Adam Fletcher、Christoph Pfisterer、Lukáš Je?ek、Manjot Pahwa、Micha Riser、Noah Fiedel、Pavel Herrmann、Pawe? Zuzelski、Perry Lorier、Ralf Wildenhues、Tudor-Ioan Salomie、Witold Baryluk
第22 章:Mike Curtis、Ryan Anderson
第23 章:Ananth Shrinivas、Mike Burrows
第24 章:Ben Fried、Derek Jackson、Gabe Krabbe、Laura Nolan、Seth Hettich
第25 章:Abdulrahman Salem、Alex Perry、Arnar Mar Hrafnkelsson、Dieter Pearcey、Dylan Curley、Eivind Eklund、Eric Veach、Graham Poulter、Ingvar Mattsson、John Looney、Ken Grant、Michelle Duffy、Mike Hochberg、Will Robinson
第26 章:Corey Vickrey、Dan Ardelean、Disney Luangsisongkham、Gordon Prioreschi、Kristina Bennett、Liang Lin、Michael Kelly、Sergey Ivanyuk
第27 章:Vivek Rau
第28 章:Melissa Binde、Perry Lorier、Preston Yoshioka
第29 章:Ben Lutch、Carla Geisser、Dzevad Trumic、John Turek、Matt Brown
第30 章:Charles Stephen Gunn、Chris Heiser、Max Luebbe、Sam Greenfield
第31 章:Alex Kehlenbeck、Jeromy Carriere、Joel Becker、Sowmya Vijayaraghavan、Trevor Mattson-Hamilton
第32 章:Seth Hettich
第33 章:Adrian Hilton、Brad Kratochvil、Charles Ballowe、Dan Sheridan、Eddie Kennedy、Erik Gross、Gus Hartmann、Jackson Stone、Jeff Stevenson、John Li、Kevin Greer、Matt Toia、Michael Haynie、Mike Doherty、Peter Dahl、Ron Heiby
我们都知道 Google公司的分布式系统设计和实现在业界遥遥领先,这些分布式系统多年前就已经运行在百万台服务器上,很多公司也都在觊觎这么多服务器是如何运行和管理的。本书揭开了这层神秘的面纱, SRE就是运行和管理这百万台服务器和众多分布式系统的关键。
多年前,Google是通过发布技术论文帮助业界解决分布式难题的,如今各种分布式系统百花齐放,如何管理这些系统对传统的运维技术和理念产生了极大的挑战,现在 Google给我们带来了技术指导和*实践。该书汇集了 Google多年生产环境的管理经验,连编写工作都采用了分布式实现的方法,由各个领域的资深专家联合创作而成。可以把本书看作是一座灯塔,很多公司的集群规模还远达不到 Google的规模,但是参照本书中的技术指导和*实践,不仅可以加速传统运维向 SRE的进化,更重要的是可以帮助公司高效地运维和管理各种复杂的分布式系统。
——吕宏利,Google Ads SRE
信息技术领域是英文缩写词的高产领域,几乎所有的新概念、新技术和新产品的推出甚至一场市场营销的策划都会伴随着新的英文缩写词的出现。 SRE这个缩写,在公司内部不仅代表了一个全新的运维理念和其伴随的崭新的工程领域、一套完整的系统运维体系和其对应的*实践,而且也是我和我的好朋友——本书的译者孙宇聪一起工作了数年的战斗集体。而本书的作者们也都是这个大集体中的师长和伙伴。
系统运维长久以来都依赖实践积累之上的口口相传,经验通常是领域从业者手里掌握的秘诀。本书从实践出发,汇集了众多业内*的系统运维人员的实战心得,理论基础和实操指导并重,系统化地阐述了在新一代信息系统架构(大规模、分布式、高并发、多业务、多租户)下系统运维的理念(当前被广泛接受并被大量实践的 DevOps就起源于此)、思路、*实践以及对应的组织架构和人员管理的方方面面,是系统运维领域从业人员不可多得的参考和学习资料。本书是对新时代系统运维领域实践的总结和理论升华。
本书的译者孙宇聪在生活中是一个略显粗犷的大男人,但对于本书的翻译,他充分发挥了自己在这个领域中多年的从业经验和对系统运维的深刻理解,细致入微地做到内容和语言两个方面的精准和优美,这在翻译的技术图书中是非常难得的。
——张矩,锋瑞资本执行董事,前 Google SRE
很高兴受译者孙宇聪邀请为该书写推荐序,这本书是 Google的 SRE部门多年实践的总结,孙宇聪本人也在 Google SRE部门工作多年。SRE部门在 Google真正落实了 DevOps。 SRE工程师在 Google不只是维护各种线上服务的稳定性,还要负责保证各项服务的性能,同时负责管理维护数据中心。美国多家互联网公司都在依照 Google的方式来组织和运作 SRE部门,可以说 SRE被 Google发扬光大,Google的 SRE实践正在成为 DevOps的标准。
SRE和传统的 IT运维有很大区别,SRE真正实现了 DevOps:首先, SRE深度参与开发阶段的工作,对应用程序的设计实现方式、依赖库、运行时的资源消耗都有严格的规约;其次,SRE工程师本身也要做不少编程工作,来实现各种工具用以自动解决问题和故障,换句话说,SRE强调的是对问题和故障的自动处理,而非人工干预;再者,按照 SRE的约定,开发人员自行负责程序上线部署更新,毕竟开发人员对自己开发的程序更熟悉,易于处理程序上线过程中遇到的问题。总之,作为 Google的 DevOps实践,SRE非常注重开发和运维职能的结合,极大地加快了业务应用迭代周期,提升了 IT对业务的支撑能力。
随着 DevOps在国内的宣传推广,国内的很多企业客户也逐渐接受了 DevOps的理念,但是在具体落地实践 DevOps的过程中缺乏实际案例作为参照。本书的推出,方便了国内广大 IT人员在落地 DevOps过程中参照 Google的 SRE实践。非常感谢孙宇聪把这么好的一本书翻译成中文。
——王璞,数人云创始人
Google首创了 SRE这个职业,并将其 SRE思想体系和方法论贡献出来汇集成此书。中文版的及时出版,使得国内广大运维从业者可以更高效地赏阅并实践。很荣幸此书在 GOPS全球运维大会首发,高效运维社区将继续作为 Google SRE国内*传播平台,推进其和《互联网应用运维框架及能力模型》(本书译者孙宇聪先生联合撰写)的融合,促进其在中国运维行业的落地生根、蓬勃发展。
——萧田国,高效运维社区发起人,开放运维联盟联合主席
从接触 Google SRE的概念开始,就感受到它神秘地存在,直到看到英文版的 SRE书籍,才知道它对传统运维的颠覆性。本书的面世,让国内更多的运维人员接触到 Google先进的运维理论与实践。个人坚信这种理论和实践的提升与改变,才是运维人的出路,运维的业务价值、行业价值便也随之而来。运维也可以“高大上”地存在!
——王津银,“精益运维”发起人;优维科技创始人;开放运维联盟发起人之一;开放运维联盟应用标准规范组组长、起草人
大型互联网应用的部署规模从几千台到几十万台不一,随着软件系统的复杂度提升也呈现出越来越庞大的趋势,如何通过少数人力管理好庞大复杂的应用环境?如何在环境极度复杂的情况下确保软件的服务质量?如何在确保质量的情况下优化软件迭代速度?很多问题困扰着项目管理者、产品经理、软件工程师、运维人员。本书从 Google所面临的问题、价值观、解决方案、体系建设、*实践等方面理论结合实际,非常具备指导意义,每一个希望提高工作效率、改进工作成果的技术和管理人员都应该认真阅读理解,结合自身工作环境进行实践,找出一条适合自己的持续发展之路。
——莫显峰,Ucloud联合创始人,CTO
Google丰富的产品与服务已成为全球多数网民每天生活的一部分,而支撑这许多应用的是其背后庞大的基础设施。为了更有效地保证用户体验,Google建立了独树一帜的运维体系并称之为 SRE(Site Reliability Engineering)。绝大部分传统 IT公司会雇佣系统管理员( sysadmin)来运维复杂的计算机系统,但由于大部分工作依靠手工操作,所以随着用户增长,Sysadmin的团队也必须相应地增长。Google SRE团队的精华在于研发软件系统,将运维自动化以替代传统模型中的人工操作。这本书详细地描述了 Google SRE的原则与理念,并列举了实际案例来说明如何灵活运用这些准则。
孙宇聪在 Google任职八年。他不仅精通基础设施的各个方面,还热衷于钻研平台架构。他致力于为中文读者解析 Google运维的窍门,于是在繁忙的工作之余,翻译了这本由他的原同事们撰写的书。由于 Google的规模很大,许多人可能认为 Google的做法无法效仿,但书中描述的原则与道理是可以触类旁通的。书中提及许多实用的道理,比如, 100%的可用性是不现实的,需要达到这个目标的成本通常远超于所能获得的价值,所以 Google会针对每种产品设定一个错误预算(容错率),既能保证用户体验又不影响创新和部署的速度。
我希望读者像我一样,通过阅读这本书,能学习到如何更有效地运维自己的产品与平台。
——Joe Zhu,Zenlayer创始人
Google SRE团队通过写作本书为整个运维行业做出了巨大的贡献。通过本书,他们将指导思想、*实践和常见的应用架构模式以及团队建设模式共享出来,揭示了 Google如何能够持续不断地建设、部署*的工程项目,同时保持世界一流的可靠性标准。每个感兴趣的人都应该通读本书,切身尝试书里提到的一些想法。
Jez Humble,Continuous Delivery和 Lean Enterprise书籍的共同作者
我还记得 Google*次在运维技术论坛上发表的演讲。感觉就像听了一场野生动物专家针对两栖爬行动物的专题介绍。演讲非常有意思,但是由于演讲的内容和观众的日常工作感觉距离太遥远,因此演讲的效果并不好。
随着 IT行业的不断改变,中小型企业的运维实践逐渐和 Google接轨。突然之间, Google多年打磨、积累形成的运维实践变成了*热门的行业焦点。对于一个面临日益严峻的可靠性、可扩展性、可维护性挑战的行业,这本书真是太及时了!
——David N. Blank-Edelman,总监,USENIX董事会成员,以及 SREcon 大会的共同创始人
自从我离开 Google这座充满魔力的城堡,我就一直在等这本书面世,我一直在用书中的思想理念给同事们布道。
——Bjo.. rn Rabenstein,SoundCloud 生产工程团队负责人, Prometheus(开源项目)开发者,前 Google SRE(2013)
Google是 SRE理念的发明者。本书不光介绍了这个职位的技术细节,还包括了其中的思考过程、团队目标、设计理念以及学到的宝贵课程。如果你想从起源上了解 SRE一词的意义,应该从本书开始。
——Russ Allbery,Google SRE,安全工程师
本书的作者们和大家分享了 Google SRE团队的成长经历,包括其中走过的弯路。 Google凭借这些实践经验,将 Google服务部署到全世界,同时保持世界一流的可靠性。我高度建议任何一个想要创建、扩展大规模集成系统的人阅读本书。这本书针对如何构造一个可长期维护的系统提供了非常宝贵的实践经验。
——Rik Farrow,USENIX成员
开发一个 Gmail这样的大型分布式系统已经很难了。如何运营维护这样的一套系统,在保障每天不断更新的同时保障一流的可靠性就更难了。这本书就像一套完备的菜谱,收集了 Google在实践过程中积累的宝贵经验。希望通过阅读本书,读者能够绕开一些 Google曾经走过的弯路。
——Urs Ho..lzle,Google 基础架构组资深副总裁
译者序
当我在2016 年年初听说本书的英文版即将面世时,时间就意识到这将是一本不可多得的经典之作。我作为Google SRE 曾经的一员,看到本书中提到的那些熟悉的技术和理念时非常兴奋——现在终于有机会用一种体系化、结构化的方式将这些知识和技术与大家分享了!
Google SRE 全球共计约1000 人,负责运维Google 的大部分家喻户晓、不可或缺的商业应用。同时,SRE 还负责运维幕后那些全球首屈一指的计算基础设施,不管是全球百万台级别的服务器集群,还是全球一流的网络架构,背后都有SRE 的身影。每个小的传统运维问题在这个平台上似乎都被无限放大了。但是与此同时,Google 恰恰又是利用传统、朴素的软件工程方法将其一一解决的。
SRE 是一群天生的怀疑论者,我们怀疑一切宣传起来“高大上”的技术,以及任何“神奇”的产品——我们只想看具体的设计架构、实现细节,以及真实的监控图表。SRE 在保障系统可靠性方面并没有什么药,有的只是这种极强的务实态度(pragmatic)。这种务实的态度决定了SRE 会认真对待运维问题。在设计评审中,他们会认真推演各种灾难场景。在每周例会时,他们又会讨论如何消除和防范事故发生、优化各种警报策略以及增强自动化功能。在平时工作中,他们则会精心维护团队的各种文档和项目源代码,一点一点地提高服务质量。回头看来,SRE 其实是一群崇尚工匠主义的人,我们坚信只要不断地解决根源问题,服务质量就一定会得到提升。而SRE 正是用这种“日拱一卒”的方法造就了Google 这个的奇迹。
本书的风格亦是如此。书中很多章节用务实的语言记录了Google SRE 团队在面临各种困难时的思考过程、所采用的解决方案以及事后总结的经验教训。本书中没有介绍任何“魔法系统”,也没有提供任何“奇技淫巧”,有的只是对问题本质发人深省的深入探讨。从这种意义上讲,本书体系化地覆盖了运维工作的方方面面,是一本运维行业的教科书。我希望通过翻译此书,能将这种体系和理念分享给更多的人。期待与大家更深入地探讨与交流!
回首在Google 度过的8 年时光,我想感谢我所有的前同事,感谢他们对我的各种帮助,这段职业经历是我终生难忘的。而且,我还要感谢我的家人,是他们的耐心陪伴和帮助才让我踏踏实实地度过了这200 多个小时,完成了我人生中的一个Project。
孙宇聪
2016 年8 月3 日 傍晚
评论
还没有评论。