24 纲举目张:SLO、SOP 与组织治理
数据库平台最危险的状态,不是“什么都没有”,而是看起来什么都有:
却没人能回答:
本章把这些问题组织成一条可执行的治理链:
治理不是在 PostgreSQL 外面增加一层审批表。它的任务是把“正常”“异常” 和“谁有权改变什么”变成可计算、可否证、可追责的服务合同。
本章目标
完成本章后,你应当能够:
- 区分数据库实例、集群、入口、应用和用户服务;
- 为服务、数据、平台与安全隐私分别指定 accountable owner;
- 用义务而不是“金银铜”标签定义服务等级;
- 画出依赖、失效语义、值班与升级路径;
- 解释为什么
postgres_up = 1不是业务可用性; - 把 SLI 写成
good events / eligible events; - 区分 SLI、SLO、SLA、错误预算和控制目标;
- 为可用性、延迟、新鲜度选择靠近用户的测量点;
- 把正确性和恢复就绪从可平均的错误预算中分离;
- 计算事件预算、等价时间预算和 burn rate;
- 设计滚动窗口、低流量策略与不可追溯篡改的排除项;
- 用错误预算真实约束发布节奏,而不是装饰仪表盘;
- 区分 SOP、故障 Runbook、恢复演练和单次 Change Plan;
- 把变更拆成申请、评审、执行、验证、回退或前滚与关单;
- 为 L2/L3 高风险动作设计独立批准、精确目标和停止线;
- 解释双人控制、延迟确认与 break-glass 的不同作用;
- 为每个 SLI 固定数据源、查询、维度与缺失语义;
- 区分页型症状、诊断原因和容量工单;
- 使用 multiwindow、multi-burn-rate 作为可调起点;
- 让每个 page 绑定用户影响、所有者、Runbook 和首个安全动作;
- 监控监控系统自身,而不把“没有数据”解释为健康;
- 为配置、变更、访问、恢复、SLO 与事件建立证据目录;
- 区分普通日志、审计记录、决策证据与合规结论;
- 用哈希、时间、身份、最小化和保留政策建立证据链;
- 自动检查治理不变量,并用反例证明检查真正会失败;
- 对一个环境给出“合同通过、生产待决”的诚实结论。
本章不做什么
本章不会把组织设计冒充 PostgreSQL 参数调优,也不会:
- 承诺一个普适的 99.99%;
- 用书中的角色标识代替真实值班表;
- 把沙箱一次成功切换称为生产 RTO;
- 把备份任务退出码称为恢复证明;
- 把现成组件指标直接拼成业务 SLO;
- 发布真实告警、发送真实 page;
- 以“合规”为名收集密码、密钥或完整客户行;
- 让审批替代技术停止线;
- 让自动化替代业务和风险授权。
pg36_shop 在本章仍是 synthetic teaching service。数值是可计算的政策输入,
不是与真实业务 owner 谈判后的生产承诺。
前置与后续
本章收束第 19–23 章已经获得的事实:
- 第 19 章 部署基线:四机 Pigsty v4.5.0 / PostgreSQL 18 沙箱,以及六项明确例外;
- 第 20 章 高可用:计划切换、write gap、 timeline 和未知写结果;
- 第 21 章 备份体系与恢复演练:命名恢复点、WAL 覆盖、 隔离恢复与应用校验;
- 第 22 章 服务接入:入口、池化、 排队、路由与 planned role change;
- 第 23 章 数据安全: TLS、角色、RLS、轮换、审计缺口与 transaction-pool 状态。
这些章节证明了机制,但机制不会自动成为服务承诺。例如:
下一章 第 25 章 监控体系与可观测诊断 将实现本章输出的 指标和规则。先定语义、后写查询,是两章之间最重要的边界。
一张图看完整合同
任何断点都会制造假治理:
| 断点 | 表面现象 | 真正风险 |
|---|---|---|
| 无服务卡 | 大量组件指标 | 不知道为谁服务、谁决策 |
| 无 SLI 语义 | 有阈值 | 不知道分子、分母和缺失意味着什么 |
| 无预算政策 | 有 SLO 图 | 可靠性结果不影响发布决策 |
| 无动作合同 | 有 page | 值班只能临场猜测 |
| 无停止线 | 有 SOP | 文档只会推动动作,不能阻止事故 |
| 无验证 | 命令成功 | 状态是否正确仍未知 |
| 无证据边界 | 日志很多 | 不能证明目标、授权与结果,还可能泄密 |
五种容易混淆的对象
服务目录项
描述“谁向谁提供什么能力,以及依赖、等级和责任”。它不是机器清单。
SLI
一个实际测量值。例如:
$$ \text{availability SLI}
\frac{\text{good eligible order attempts}} {\text{all eligible order attempts}} $$
SLO
对某个窗口内 SLI 的目标。例如“滚动 28 天内至少 99.9%”。它不是法律赔偿 条款;后者通常属于 SLA。
控制目标
不适合用平均错误率淡化的要求。例如“没有未解释的账实不符”与“90 天内有 一次通过的隔离恢复”。一次数据串租不能因为本月另有一千万次正确读取而变得 可以接受。
错误预算政策
当可靠性好或差时,组织具体改变什么。没有后果的错误预算只是 KPI:
本章采用的目标
本章服务卡定义五个目标:
| ID | 类型 | 目标 |
|---|---|---|
SLO-AVAILABILITY |
ratio SLO | 被接纳的下单尝试得到可核对的成功结果 |
SLO-LATENCY |
ratio SLO | 被接纳的下单尝试在 250 ms 内完成 |
SLO-FRESHNESS |
ratio SLO | 带已知 commit token 的读取在 5 s 内可见 |
CTRL-CORRECTNESS |
control | 无未解释的重复、串租、金额或状态错误 |
CTRL-RESTORE-READINESS |
control | 90 天内有通过的隔离恢复证据 |
它们有意不使用:
这些都是有价值的组件事实,但只能解释服务为什么好或坏,不能单独回答用户 是否获得了正确服务。
可计算的错误预算
可用性目标为 99.9%,滚动窗口为 28 天:
若窗口内有 10,000,000 个 eligible events:
若为了直觉把比例换算成连续时间:
40.32 分钟只是等价解释。request-based SLO 的实际预算仍是事件,不应把一 小时的低流量故障与一小时的流量高峰当成同一件事。
burn rate 定义为:
$$ \text{burn rate}
\frac{\text{observed bad-event ratio}} {1-\text{SLO target}} $$
对 99.9% 目标,14.4 倍 burn 对应 1.44% bad ratio。Google SRE Workbook 给出的 multiwindow 起点是:
| route | 长窗 | 短窗 | burn | 按本章 28 天窗口约消耗预算 |
|---|---|---|---|---|
| page | 1 h | 5 min | 14.4x | 1 h 内 2.14% |
| page | 6 h | 30 min | 6x | 6 h 内 5.36% |
| ticket | 3 d | 6 h | 1x | 3 d 内 10.71% |
这是起点,不是常数。实际规则必须按流量、后果和 notification cost 调整。 原始推导见 Google SRE Workbook 的 Alerting on SLOs。
观察与告警的边界
Pigsty v4.5 提供:
PostgreSQL、PgBouncer、HAProxy、Patroni 和主机事实通过 cls、ins、ip
等身份维度关联。当前实现说明以 Pigsty
Monitoring System 与
PGSQL Monitoring 为准。
但平台不能凭空产生业务语义。第 25 章还需要实现:
这些名称是本书的应用合同,不是 Pigsty 当前内置指标。将来改名可以,改变 eligible/good/missing 语义则必须重新评审 SLO。
四类操作文档
| 文档 | 何时使用 | 核心区别 |
|---|---|---|
| SOP | 可重复的日常动作 | 已知输入、稳定步骤、例行验证 |
| Incident Runbook | 症状已经发生 | 先保安全、边诊断边决策 |
| Recovery Drill | 证明恢复路径 | 隔离、预设验收、保留计时与结果 |
| Change Plan | 一次具体变更 | 精确目标、窗口、版本、批准与回退 |
“切主 SOP”这个名称可能掩盖两种完全不同的动作:
不能因为两者最终都出现“新主库”,就复用同一套前提和停止线。
高风险动作的基本不变量
本章把动作分成 L0–L3:
| 等级 | 典型动作 | 基本要求 |
|---|---|---|
| L0 | 只读观察、验证证据 | 精确目标,不改变远端状态 |
| L1 | 有界、可逆、低影响变更 | 预览、验证、回退 |
| L2 | 权限、模式、池或运行态变更 | 独立批准、停止线、证据 |
| L3 | 删除、恢复、拓扑和大影响动作 | 双人控制、延迟确认、强制门禁 |
L2/L3 使用不同的 requester、approver 与 executor。双人控制并不是两个人 盯着同一条未核对的命令按回车;合格的独立批准人必须检查:
- 目标是否精确;
- 影响半径是否可信;
- 前置事实是否新鲜;
- 动作是否与已批准 artifact hash 一致;
- stop condition 是否机器可判定;
- 回退/前滚是否真的可执行;
- 未知结果是否会被错误重试。
NIST SP 800-53 Rev. 5.1 的变更访问限制包含 dual authorization。它是风险控制的参考,不意味着每个 组织必须机械照搬同一审批流。
正式实验
本章提供一套纯 L0 实验:
正式运行:
重新执行第 19 章只读 gate 后,四台主机与四个 PostgreSQL member 仍通过
accepted-with-exceptions;六项沙箱例外没有被隐藏。
形式化验证故意尝试:
- 宣称 production SLO;
- 删除 platform owner;
- 把 process alive 当服务健康;
- 把目标改成 100%;
- 排除计划维护;
- 把缺失数据当健康;
- 让 exhausted budget 没有后果;
- 给指标加入未约束客户标识;
- 接受没有动作的 page;
- 让 cause/capacity 直接 page;
- 把 backup exit 0 当恢复证明;
- 让一人自批自执行;
- 让 break-glass 跳过目标与证据;
- 允许 evidence 保存 secret;
- 伪造上游 restore run id;
- 把一次沙箱切换称为生产证明。
二十个变体全部被拒绝。实验没有部署告警,也没有联系真实值班人。
本章目录
24.1 服务目录与责任模型
24.2 SLI、SLO 与错误预算
24.3 SOP、Runbook 与变更治理
24.4 观察与告警契约
- 24.4.1 每个 SLI 的数据源、查询、维度和缺失语义
- 24.4.2 告警必须绑定用户影响、首个安全动作和所有者
- 24.4.3 症状告警、原因告警与容量预测分开
- 24.4.4 产出供 ch25 实现的告警规则清单
24.5 证据、审计与合规
24.6 实战:把 pg36_shop 纳入服务治理
权威资料
- Google SRE Workbook: Implementing SLOs、 Alerting on SLOs
- Prometheus: Alerting practices、 Alerting rules
- PostgreSQL 18: Monitoring Database Activity
- Pigsty v4: Monitoring System、 PGSQL Monitoring
- NIST: SP 800-53 Rev. 5.1
这些资料提供方法和组件事实;pg36_shop 的服务语义、阈值和治理政策仍由
本章合同负责。
章末验收
不要用“文档已经发布”验收本章。应当能回答:
- 能否从一次用户动作追到 eligible/good 事件定义?
- 能否指出这个定义在哪个测量点实现?
- 没有数据时,系统是 unknown、failed 还是有独立 fallback?
- 正确性错误是否会被平均比例掩盖?
- 计划维护是否仍反映在用户体验中?
- 错误预算状态是否改变变更权限和速度?
- 每个 page 是否有 owner、runbook、第一安全动作和恢复验证?
- cause metric 是否只用于诊断,而不会重复 page?
- capacity 是否形成有期限的 owned ticket?
- 高风险动作能否被同一身份申请、批准和执行?
- break-glass 是否仍绑定目标、时限、证据和轮换?
- backup success 之外,是否有隔离恢复与应用验收?
- evidence 是否能证明 source、target、time、collector 和 hash?
- evidence 是否明确不保存 secret 与不必要的个人数据?
- 能否运行反例并看到 validator 真实拒绝?
- 是否清楚哪些结论仍然
production pending?
如果这些问题没有答案,再多告警、审批单和仪表盘也只是组织噪声。
上一章:固若金汤:认证、授权与数据安全 · 返回下卷导读 · 下一章:望闻问切:监控体系与可观测诊断 · 查看全书目录 · 查看索引中心