SLO 设计实战:从业务目标到技术指标

概述 很多团队在实践 SRE 时遇到的第一个困境是:知道 SLO 是什么,但不知道怎么设。要么照搬 Google 的 99.99%,要么随便拍一个 99.9%——然后发现这个数字既不反映用户体验,也无法驱动工程决策。 好的 SLO 不是拍脑袋拍出来的,而是从业务目标出发,经过用户旅程分析、指标选择、数值校准、多层级设计、定期评审等一系列工程方法推导出来的。详细梳理 SLO 设计的完整方法论,帮助你建立从"业务目标"到"技术指标"的完整映射链路。 本文假设读者已了解 SLI/SLO 的基本概念。如需补充,可参考 Google SRE Workbook - Service Level Objectives 和本站 SRE核心理念:SLI、SLO与错误预算。 一、SLO 设计金字塔 SLO 设计不是孤立的技术活动,而是从上到下的分层推导过程: ┌─────────────┐ │ 业务目标 │ "我们的服务需要做到什么程度?" └──────┬──────┘ │ ┌──────▼──────┐ │ 用户体验 │ "用户关心什么?" └──────┬──────┘ │ ┌──────▼──────┐ │ SLI 定义 │ "我们怎么衡量用户体验?" └──────┬──────┘ │ ┌──────▼──────┐ │ SLO 目标值 │ "这个指标要做到多少?" └──────┬──────┘ │ ┌──────▼──────┐ │ 告警与行动 │ "不达标时怎么办?" └─────────────┘ 第一层:业务目标 一切 SLO 设计的起点是业务目标,而不是技术指标。业务目标回答的问题是:这个服务对业务的价值是什么?...

April 24, 2024 · 9 分钟 · 1912 字 · 徐保金

Terraform 基础设施即代码入门

手动登录云控制台创建服务器、数据库、网络——这种方式在资源少时还能勉强应付,一旦环境变复杂,就会出现"改不动、删不清、说不明"的困境。基础设施即代码(Infrastructure as Code, IaC)用代码描述基础设施,让资源的创建、修改和销毁变得可版本化、可审查、可复用。Terraform 是目前最主流的 IaC 工具,从理念到实战全面梳理。 参考来源:Terraform 官方文档 一、IaC 理念:声明式 vs 命令式 IaC 的核心思想是:用代码文件描述基础设施的期望状态,由工具自动驱动实际状态向期望状态收敛。 在 IaC 领域,存在两种截然不同的范式: 维度 声明式(Declarative) 命令式(Imperative) 核心理念 描述"要什么"(期望状态) 描述"怎么做"(操作步骤) 代表工具 Terraform、CloudFormation、Pulumi Ansible(部分)、Shell 脚本、AWS CLI 幂等性 天然幂等,重复执行结果一致 需自行保证幂等性 状态感知 工具追踪当前状态,自动计算差异 无状态感知,按步骤执行 可读性 接近配置文件,易于理解 接近编程逻辑,灵活但复杂 Terraform 采用声明式范式。你只需声明"我需要 3 台 EC2、1 个 RDS、1 个 VPC",Terraform 会自动对比当前状态和期望状态的差异,生成并执行变更计划。 声明式的核心优势:幂等性。无论执行多少次 terraform apply,最终状态一致。这意味着你可以把基础设施代码纳入 Git 版本控制,通过 PR 审查变更,实现基础设施的"代码化治理"。 二、Terraform 核心概念 Terraform 的运作围绕四个核心概念展开: 开发者编写 .tf 文件 │ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Provider │ ←──→ │ Resource │ │ State │ │ 云厂商插件 │ │ 资源声明 │ │ 状态文件 │ └──────────────┘ └──────────────┘ └──────────────┘ │ ▼ ┌──────────────┐ │ Module │ │ 模块化复用 │ └──────────────┘ 2....

April 24, 2024 · 8 分钟 · 1558 字 · 徐保金

Grafana 仪表盘设计最佳实践

Grafana 是云原生时代最主流的可视化平台,但"能用"和"好用"之间隔着一套设计方法论。一个混乱的仪表盘会让值班人员在海量面板中迷失,而一个设计良好的仪表盘能在 5 秒内传递系统健康状态。从设计原则出发,覆盖变量系统、面板选型、告警集成,最后用一个完整的 SLO 仪表盘串联所有知识点。 参考来源:Grafana 官方文档 一、仪表盘设计原则 1.1 五秒规则 一个仪表盘应该在 5 秒内回答最核心的问题:系统现在是否正常? 超过 5 秒才理解,说明信息层次不对。 实践方法: 顶部放置全局状态行:用 Stat 或 Gauge 面板展示 SLO 达成率、核心错误率、P99 延迟,绿/黄/红阈值一目了然。 中部放置趋势图:Time series 面板展示过去 1-6 小时的指标趋势。 底部放置明细表:Table 面板列出实例级明细,供深入排障。 1.2 从左到右、从上到下 人类阅读习惯是从左上到右下,仪表盘的信息流应顺应这一规律: ┌─────────────────────────────────────────────┐ │ [SLO] [错误率] [P99延迟] [流量] │ ← 第一行:一眼看状态 ├─────────────────────────────────────────────┤ │ CPU 趋势图 │ 内存趋势图 │ ← 第二行:趋势 │ 请求量趋势图 │ 错误率趋势图 │ ├─────────────────────────────────────────────┤ │ 实例明细表 │ ← 第三行:明细 └─────────────────────────────────────────────┘ 1.3 其他设计要点 一个仪表盘只服务一个主题:不要把"数据库监控"和"业务指标"混在一个仪表盘里。 合理利用阈值颜色:绿色=正常,黄色=警告,红色=严重,不要滥用颜色。 默认时间范围设为"最近 1 小时":值班场景最常用。 命名清晰:面板标题写"CPU 使用率 (%)“而非"cpu”。 二、变量模板系统 变量(Variables)是仪表盘可复用性的核心。通过变量可以实现"一套模板,多环境切换"。...

April 17, 2024 · 5 分钟 · 992 字 · 徐保金

商业监控 vs 自建监控:Datadog 与开源方案对比

概述 监控系统选型时,最纠结的问题之一是"用商业平台还是自建开源方案"。Datadog 是商业可观测性平台的标杆,开箱即用、功能全面、集成丰富,但价格不菲。Prometheus + Grafana 是开源自建方案的代表,灵活可控、无许可费用,但需要投入运维人力。 这不是一个简单的"省钱 vs 省事"的选择。对于快速增长的创业公司,Datadog 的开箱即用可能比省下的许可费更有价值;对于大规模基础设施,开源方案的边际成本优势会越来越明显。从功能、成本、运维、风险等多个维度系统对比两类方案,提供结构化的选型决策框架。 参考来源:Datadog 官网定价、CNCF 可观测性调查 一、Datadog 功能概览 1.1 产品矩阵 Datadog 提供了一个覆盖可观测性全生命周期的产品矩阵: ┌──────────────────────────────────────────────────────┐ │ Datadog 产品矩阵 │ │ │ │ 基础设施层 │ │ ├── Infrastructure Monitoring (主机/容器监控) │ │ ├── Network Monitoring (网络性能监控) │ │ └── Serverless (AWS Lambda/云函数监控) │ │ │ │ APM 层 │ │ ├── APM (分布式追踪) │ │ ├── Database Monitoring (数据库监控) │ │ ├── Continuous Profiling (性能分析) │ │ └── Real User Monitoring (前端 RUM) │ │ │ │ 日志层 │ │ ├── Log Management (日志采集+分析) │ │ └── Log Patterns (日志模式自动分类) │ │ │ │ 合成监控 │ │ ├── Synthetics (API/浏览器拨测) │ │ └── Continuous Testing (CI 集成测试) │ │ │ │ 安全与合规 │ │ ├── Cloud Security Management (云安全态势) │ │ └── Cloud SIEM (安全事件管理) │ │ │ │ 其他 │ │ ├── Incident Management (事件管理) │ │ ├── CI Visibility (CI/CD 可视化) │ │ └── Watchdog (AI 异常检测) │ └──────────────────────────────────────────────────────┘ 1....

April 17, 2024 · 9 分钟 · 1721 字 · 徐保金

K8s 网络模型:CNI 与 Service 网络

Kubernetes 网络模型四大要求 Kubernetes 网络模型的设计基于四个核心要求,理解它们是掌握 K8s 网络的基础。根据 Kubernetes 官方网络模型文档,这四个要求构成了集群网络通信的基石。 1. Pod 间通信(Pod-to-Pod) K8s 要求所有 Pod 之间可以直接通过 IP 通信,无需 NAT(网络地址转换)。这意味着: 每个 Pod 拥有独立的 IP 地址 Pod 之间通信使用真实 Pod IP,不经过 NAT 转换 无论 Pod 调度到哪个 Node,Pod 间网络始终扁平可达 这是 K8s 网络模型最核心的设计决策。传统数据中心网络中,跨主机容器通信通常依赖端口映射或 NAT,而 K8s 选择了扁平网络模型,让每个 Pod 成为网络中平等的一等公民。 2. Node 与 Pod 通信(Node-to-Pod) Node 上的进程(包括 kubelet、kube-proxy)必须能直接与该 Node 上任何 Pod 通信,同样不经过 NAT。这个要求保证了: kubelet 可以执行健康检查(liveness/readiness probe) 节点上的监控 agent 能直接采集 Pod 指标 主机网络进程与 Pod 网络互通 3. Service 网络 Service 提供了一个稳定的虚拟 IP(ClusterIP),将流量负载均衡到后端 Pod。Service 网络是独立于 Pod 网络的虚拟地址段(默认 10....

April 12, 2024 · 4 分钟 · 722 字 · 徐保金

Ansible Playbook 最佳实践:从入门到生产部署

概述 Ansible 的上手门槛很低——一个 YAML 文件、几行 yum install 就能跑通。但当你面对几百台服务器、多套环境、复杂的依赖关系和严格的变更审计要求时,“能跑"和"能上线"之间隔着一整个工程体系。本文把生产级 Playbook 的核心实践浓缩成一份可操作的指南,涵盖从结构组织到性能优化的全链路。 参考来源:Ansible 官方好的实践 一、Playbook 结构优化 1.1 目录布局 生产级 Ansible 项目应该遵循标准目录结构。这不是 Ansible 的强制要求,而是大量团队踩坑后形成的共识: production-project/ ├── ansible.cfg # 项目级配置 ├── inventory/ │ ├── production/ │ │ ├── hosts.ini # 生产环境主机清单 │ │ └── group_vars/ │ │ ├── all.yml # 所有环境共享变量 │ │ ├── web.yml # web 组专用变量 │ │ └── db.yml # db 组专用变量 │ └── staging/ │ ├── hosts.ini │ └── group_vars/ │ └── all....

April 5, 2024 · 10 分钟 · 2014 字 · 徐保金

Prometheus PromQL 入门与实践

PromQL(Prometheus Query Language)是 Prometheus 监控系统的查询语言,也是整个云原生监控体系的核心。无论是构建 Grafana 仪表盘、编写告警规则,还是进行故障排查时的临时查询,都离不开 PromQL。我将从数据模型出发,逐步深入到聚合操作、常用函数和实战查询,最后覆盖子查询等高级技巧。 参考来源:Prometheus 官方文档 — Querying basics 一、PromQL 数据模型 PromQL 有四种基本数据类型,理解它们是写对查询的前提: 类型 说明 示例 即时向量(Instant Vector) 一组时间序列在当前时刻的采样值 node_cpu_seconds_total 范围向量(Range Vector) 一组时间序列在过去一段时间内的所有采样值 node_cpu_seconds_total[5m] 标量(Scalar) 一个简单的数值 3.14、1024 字符串(String) 字符串值(较少使用) "hello" 最常用的两种: 即时向量:仪表盘和告警中最常见,返回"当前这一刻"各序列的值。 范围向量:用于 rate()、increase() 等函数计算,必须带时间窗口 [...]。 # 即时向量:返回当前所有序列 up # 范围向量:返回过去5分钟内的所有采样点 up[5m] # 标量 1 - 0.3 二、基础查询 2.1 Metric 选择与标签过滤 通过标签选择器可以精确过滤目标序列: # 选择名为 node_cpu_seconds_total 的所有序列 node_cpu_seconds_total # 按 mode 标签过滤 node_cpu_seconds_total{mode="idle"} # 多标签组合(AND 关系) node_cpu_seconds_total{instance="node-1:9100", mode="idle"} # 标签正则匹配 node_cpu_seconds_total{instance=~"node-[0-9]+:9100"} # 标签反向匹配(排除某些值) node_cpu_seconds_total{mode!...

April 4, 2024 · 4 分钟 · 645 字 · 徐保金

Kubernetes Ingress 控制器选型与配置

概述 Kubernetes Service 提供四层负载均衡,但在生产环境中,绝大多数 Web 应用需要七层路由能力:基于域名的虚拟主机、基于路径的路由、TLS 终止、灰度发布。Ingress 就是 K8s 对七层路由的抽象,而 Ingress Controller 则是这一抽象的具体实现。 选择 Ingress Controller 不是一个小决策——它处于所有外部流量的入口位置,一旦选错或配置不当,影响的是整个集群的服务可用性。本文对比主流 Ingress Controller 的优劣,并给出生产环境配置实践。 本文基于 Kubernetes v1.30。参考 Kubernetes Ingress 文档 Ingress 原理 数据流路径 客户端 → 负载均衡器(云LB/MetalLB) → Ingress Controller Pod → Service → Pod ↑ Ingress 资源 (路由规则) Ingress Controller 本质上是一个运行在集群中的 Pod(通常是 Deployment 或 DaemonSet),它: 监听 K8s API 中的 Ingress 资源变化 将 Ingress 规则翻译成自身配置(如 nginx.conf) 热加载配置,处理外部请求并路由到对应 Service Ingress 资源结构 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress namespace: production annotations: nginx....

March 27, 2024 · 7 分钟 · 1490 字 · 徐保金

磁盘 I/O 性能诊断与优化

前言 磁盘 I/O 往往是系统性能链条中最慢的一环。一次机械磁盘寻道约 10ms,而内存访问仅约 100ns——两者相差 10 万倍。当业务出现延迟抖动、响应变慢,排查方向总会指向 I/O 子系统。从指标体系出发,结合工具实战与生产案例,建立一套可复用的 I/O 诊断方法论。 I/O 性能指标体系 在动手之前,必须搞清楚四个核心指标的含义及其相互关系。 指标 单位 含义 典型参考值 IOPS 次/秒 每秒完成的 I/O 读写次数 HDD ~100,SATA SSD ~10 万,NVMe SSD ~50 万+ 吞吐量 MB/s 每秒传输的数据量 HDD ~150 MB/s,SATA SSD ~550 MB/s,NVMe SSD ~3000 MB/s+ 延迟 ms/μs 单次 I/O 从提交到完成的耗时 HDD 5-15ms,SSD 0.1-1ms,NVMe 0.02-0.1ms 队列深度 个 等待处理的 I/O 请求数 建议值 NVMe 32-256,SSD 8-32 这四个指标之间存在关键约束关系: 小块随机读写场景下,瓶颈是 IOPS(如数据库 OLTP 4KB 随机写) 大块顺序读写场景下,瓶颈是吞吐量(如日志追加、视频流媒体) 延迟是最终用户感知的指标,即使 IOPS 和吞吐量充足,单次延迟过高仍会导致卡顿 队列深度提升能增加并发,但也意味着单请求等待时间变长 一个重要认知:IOPS × 块大小 ≈ 吞吐量。例如 4KB 块、100 IOPS,吞吐量约 0....

March 27, 2024 · 4 分钟 · 841 字 · 徐保金

Makefile 构建自动化:不只是编译

概述 很多人对 Makefile 的印象停留在 C/C++ 编译辅助工具。但 Make 本质上是一个依赖关系驱动的任务执行引擎——你告诉它"目标是什么、依赖什么、怎么生成",它负责按正确顺序执行并跳过无需重复的步骤。这种模型在运维场景中同样强大:部署依赖构建、清理依赖停止服务、检查依赖配置就绪。从语法基础到运维实战,把 Makefile 的能力完整展开。 参考来源:GNU Make 手册 一、Makefile 语法基础 1.1 基本结构 # 目标: 依赖 # 命令(必须用 Tab 缩进,不能用空格) target: dependencies command1 command2 一个实际例子: # Makefile - 基础示例 hello: main.c utils.c gcc -o hello main.c utils.c -Wall clean: rm -f hello *.o .PHONY: clean 关键规则:命令行必须以 Tab 开头,不是空格。这是 Makefile 最常见的初学者错误。 1.2 执行机制 Make 的工作流程分三步: 解析:读取 Makefile,构建依赖关系图 比较:检查每个目标的修改时间,判断是否需要重新生成 执行:按拓扑排序执行过时目标的命令 目标文件不存在 → 执行命令生成 目标文件存在,但依赖更新 → 重新执行 目标文件存在,依赖未变 → 跳过(这就是增量构建的核心) # 执行第一个目标 make # 执行指定目标 make clean # 指定 Makefile 文件 make -f MyMakefile build # 并行执行(利用多核) make -j4 # 只打印命令不执行 make -n # 强制重新生成 make -B # 输出详细执行过程 make V=1 二、变量与函数 2....

March 26, 2024 · 11 分钟 · 2289 字 · 徐保金