目 录
开端篇 弱化边界感
第1章 引言 3
1.1 运维架构和SRE 3
1.2 理解业务,技术为业务服务 5
1.3 不设边界 6
1.4 SRE金字塔 6
1.5 总结 7
第2章 重视测试环境和预发布环境 8
2.1 提效和维稳的道门槛——测试环境 9
2.1.1 低级错误 9
2.1.2 提效分析 10
2.2 “守门员”——预发布环境 11
2.2.1 低级错误 11
2.2.2 提效分析 12
2.3 两大环境问题根本原因溯源 12
2.4 微拍堂测试环境治理思路介绍 13
2.5 总结 17
监控篇 底层逻辑的艺术
第3章 浅谈监控系统设计 21
3.1 梳理监控体系 21
3.2 梳理监控指标 22
3.3 变更监控 25
3.4 准实时系统监控 25
3.5 短时进程追踪工具 27
3.6 全链路监控 27
3.7 商业监控平台的选用建议 28
3.8 监控方式:白盒监控与黑盒监控 29
3.9 从监控数据中总结规律 30
3.10 黄金指标 30
3.11 总结 31
第4章 云原生可观测性开源工具——Kindling 32
4.1 行业现状 32
4.2 Kindling解决方案——关联内核可观测性数据的Trace 34
4.3 Kindling探针的架构设计理念 37
4.4 Kindling探针架构 38
4.4.1 内核态程序:drivers 38
4.4.2 用户态C/C++程序:kindling-probe 38
4.4.3 用户态Go程序:kindling-collector 39
4.4.4 程序间通信方式 40
4.5 在线Demo介绍 41
4.6 案例分享 42
4.6.1 安装 43
4.6.2 功能介绍 44
4.6.3 稳定性价值 47
4.7 总结 48
第5章 高阶实战——打造可持续维护的闭环流程 49
5.1 案例:动态观测SQL质量流程设计 50
5.1.1 分析规范难以落地的原因 50
5.1.2 监督与管控流程设计 51
5.1.3 通知和统计 57
5.2 案例:WebP格式图片的规范和落地实践 57
5.2.1 规范无法持续推广 57
5.2.2 成本和用户体验上的双赢 58
5.2.3 计划实施 60
5.2.4 管控机制 60
5.2.5 采集数据信息和数据加工处理 60
5.2.6 巡检平台之规范化监督 61
5.3 案例:管道通信规范化实践 62
5.3.1 我们每天都在使用管道 62
5.3.2 管道示例场景及性能说明 64
5.3.3 如何规范管道使用场景 66
5.4 标准和规范治理平台 67
5.4.1 现状 68
5.4.2 设计思路 68
5.5 总结 72
第6章 挖掘Nginx的监控价值 73
6.1 URI指纹服务设计 73
6.2 Nginx日志分析指南 76
6.2.1 参数白名单 76
6.2.2 URI的响应时间和HTTP状态监控 77
6.2.3 URI响应字节数波动分析 77
6.2.4 查询URL请求的项目 79
6.2.5 注意HTTPS的透传 80
6.2.6 利用Nginx完成动态全链路比例调整 81
6.3 总结 82
故障篇 故障的生命周期
第7章 事前治理的方法论 85
7.1 从故障中总结经验 85
7.2 从系统资源层面和日志中巡检异常 86
7.3 从标准和规范中寻找闭环之路 86
7.4 从业务中挖掘基础服务的使用问题 87
7.5 技术风险防控运营成本 87
7.6 总结 88
第8章 变更管控设计思路 89
8.1 变更管控 89
8.1.1 变更对象 89
8.1.2 变更发布 90
8.1.3 变更可灰度 91
8.1.4 变更可回滚 92
8.1.5 变更可监控 92
8.1.6 配置项变更 92
8.1.7 变更管控思路 92
8.2 JumpServer使用的艺术及工单交互 96
8.3 变更三板斧:运维团队的可监控、可灰度、可回滚实践 98
8.3.1 案例:云服务器资源伸缩稳定性 98
8.3.2 案例:CDN OpenResty的变更策略 102
8.4 总结 106
第9章 轮值的设计思路 107
9.1 值班模式探究 108
9.1.1 让开发人员参与其中 108
9.1.2 制定KPI 109
9.1.3 值班人员的边界探讨 110
9.2 值班机器人 111
9.3 提升值班价值——SRE需求池设计 112
9.3.1 结合日常巡检与非值班时间 112
9.3.2 在烦琐的工作中收集需求 112
9.4 总结 113
第10章 故障演练与应急预案 114
10.1 故障演练缘由 114
10.1.1 更好地面对系统规模增长带来的复杂性 115
10.1.2 提升故障的排查速度 115
10.1.3 验证应急预案的正确性 115
10.1.4 验证基础设施的稳定性 116
10.1.5 验证监控感知能力 116
10.1.6 验证应急流程的顺畅度 116
10.2 故障演练流程 116
10.2.1 故障演练场景关键要素 116
10.2.2 故障演练预期 117
10.3 应急预案 119
10.3.1 应急场景标准化 120
10.3.2 梳理应急预案清单 120
10.4 总结 121
第11章 应急响应流程实践 122
11.1 收拢故障上报来源 122
11.1.1 从技术体系内部发现 122
11.1.2 从技术体系外部发现 123
11.2 建立应急小组 123
11.2.1 人多力量弱 123
11.2.2 稳定性接口人和岗位权限 123
11.2.3 完善客诉标准化术语 124
11.3 故障噪点治理 124
11.3.1 报警治理 124
11.3.2 设计外部反馈阈值 125
11.3.3 收集第三方抖动事件 125
11.4 控制应急节奏 126
11.4.1 舍小保大 126
11.4.2 “优先止血”,后续定位根本原因 127
11.4.3 及时同步信息,减少信息差 127
11.5 应急“止血”的常见操作 127
11.5.1 代码回滚 127
11.5.2 重启 128
11.5.3 时序监控下的限流、熔断、扩容 129
11.5.4 业务降级 130
11.5.5 阻断慢查询 131
11.5.6 网络与运营商 131
11.5.7 重识监控 132
11.6 总结 132
第12章 静态容灾降级系统 133
12.1 荆棘之路 134
12.2 设计之路 136
12.3 架构流程图 138
12.3.1 反向代理系统 138
12.3.2 日志分析系统 138
12.3.3 后台系统——利用URI指纹服务 138
12.3.4 爬虫系统 139
12.3.5 容灾的缓存系统 140
12.3.6 基于时间的版本用途 140
12.3.7 异地容灾 141
12.4 核心代码解说 142
12.4.1 Ngx_Lua应用 142
12.4.2 爬虫和日志分析系统的关系 143
12.4.3 完全容灾和部分容灾功能 144
12.5 静态容灾的智能关闭方案 145
12.5.1 从日志分析系统复制请求 145
12.5.2 利用GoReplay复制流量 145
12.5.3 利用Nginx的mirror镜像功能 146
12.5.4 灰度验证容灾系统缓存——闭环设计 147
12.6 替换爬虫的新思路 148
12.7 总结 148
第13章 基于OpenResty的动态限流设计思路 150
13.1 常见反向代理限流方案缺点分析 150
13.2 动态限流设计思路 151
13.3 多维度限流 154
13.4 智能感知响应能力动态控速设计方案 157
13.5 屏蔽慢请求带来的服务阻塞 159
13.6 总结 160
第14章 故障复盘 161
14.1 复盘前 161
14.2 复盘中 161
14.3 复盘后 164
14.4 自省 164
14.5 跨部门分享 165
14.6 故障库 165
14.7 总结 165
容量篇 性能与成本间的平衡
第15章 成本优化 169
15.1 成本优化事前准备 169
15.1.1 目标的制定和价值体现 170
15.1.2 IT成本与人力成本的权衡 170
15.1.3 提升对系统的理解 171
15.1.4 评估优化前后的数据统计及业务影响 171
15.1.5 从用户体验看待成本优化 173
15.1.6 梳理业务和资源的关系 173
15.2 公有云基础资源优化实践 174
15.2.1 成本管理白皮书 174
15.2.2 合理化资源使用率 177
15.2.3 自建产品和云产品的使用场景优化 178
15.2.4 基于业务场景的成本控制 179
15.3 总结 180
第16章 智能伸缩平台 181
16.1 弹性伸缩平台关键路径盘点 181
16.2 基础设施建设 182
16.2.1 基于Pod的HPA传统模式 182
16.2.2 基于Cluster-Autoscaler的Node伸缩 184
16.3 基于业务场景的实战 189
16.3.1 定时伸缩 189
16.3.2 基于预测的弹性伸缩 191
16.4 风险控制体系 199
16.4.1 动态限流触发规则 199
16.4.2 扩容节点失败和业务降级 200
16.5 总结 200
第17章 容量规划 201
17.1 容量规划现状 201
17.2 容量规划建设思路 202
17.2.1 建设核心 202
17.2.2 建设思路 203
17.3 应用系统容量规划说明 204
17.4 基于巡检模式的容量评估流程 205
17.4.1 对流量来源的梳理 205
17.4.2 对容量对象的梳理 206
17.4.3 收集日常关键性数据 207
17.5 对容量规划关注点的梳理 210
17.5.1 压力测试 210
17.5.2 业务放量 212
17.5.3 大促活动 213
17.5.4 秒杀业务 214
17.5.5 关注运营活动计划 214
17.5.6 尖刺限流 215
17.6 总结 215
第18章 编程能力 216
18.1 养成写伪代码的习惯 216
18.2 养成管理代码的习惯 217
18.3 编程能力分级 218
18.4 编程能力更深层的价值探讨 219
18.4.1 如何看待PHP短连接问题 219
18.4.2 理解Redis和Memcached在业务场景上的区别 220
18.4.3 进程、线程、协程在Linux系统中的表现 221
18.4.4 探究阻塞和非阻塞、异步和同步在系统中的表现 223
18.4.5 共享内存 224
18.4.6 尝试一些导致进程崩溃的操作 224
18.4.7 学习秒杀系统的业务架构 225
18.4.8 给自己的代码做闭环实践 226
18.4.9 参与业务开发日常 226
18.5 熟悉编程语言特性 226
18.6 通过系统分析倒推应用配置问题 227
18.6.1 通过access函数发现PHP性能问题 227
18.6.2 Java连接池失效 228
18.7 总结 229
全局视角篇 运维破圈
第19章 开启测试视角 233
19.1 测试人员的职责边界 233
19.2 压力测试 234
19.2.1 压测黑名单思维