Thanos 部署与实践:Prometheus 长期存储与全局查询

概述 Prometheus 是云原生监控领域的事实标准,但它在长期数据存储和全局查询方面存在明显短板:本地存储默认只保留 15 天数据,单实例无法跨集群聚合查询,高可用方案也相对复杂。Thanos 作为 CNCF 孵化项目,通过将 Prometheus 数据上传到对象存储(如 S3、GCS、MinIO)实现了无限容量的长期存储,并通过分布式查询组件提供跨集群的全局视图。 将深入剖析 Thanos 的架构设计,并结合生产环境实战经验,详细讲解各组件的配置、部署和运维要点。 Thanos 解决了什么问题 在引入 Thanos 之前,我们首先需要理解 Prometheus 原生存储的局限性: 维度 Prometheus 原生 Thanos 增强 数据保留 默认 15 天,受本地磁盘限制 理论无限,依赖对象存储容量 高可用 需要 Thanos Sidecar 或 remote_write 双写 Sidecar + Query 天然支持 全局查询 联邦方案,有限且易丢数据 Query 组件聚合所有 Store API 降采样 不支持 Compactor 自动降采样,优化长周期查询 历史数据查询 超出保留期即丢失 可查询数月甚至数年前数据 跨集群视图 需要额外联邦配置 原生支持多集群统一查询 核心思路是:不改 Prometheus 本身,通过 Sidecar 旁路将数据上传到对象存储,再通过 Query 组件统一查询。这种设计保持了 Prometheus 的简单性,同时获得了企业级存储和查询能力。 核心架构与组件 整体架构 Thanos 的架构围绕"Sidecar 上传、Store 读取、Query 聚合"三个核心环节展开:...

November 19, 2024 · 10 分钟 · 1948 字 · 徐保金

Linux 性能分析利器:BPF 与 bcc 工具集

eBPF:内核可编程的革命 传统性能分析工具分两类:一类是 top、vmstat、iostat 这样的"概览型"工具,告诉你系统层面发生了什么,但看不到细节;另一类是 strace、gdb 这样的"跟踪型"工具,能看细节但开销巨大,生产环境基本不敢用。 eBPF(Extended Berkeley Packet Filter)改变了一切。它允许你在不修改内核源码、不加载内核模块的前提下,安全地在内核中运行沙箱程序。这些程序挂载到内核的 hook 点(kprobes、tracepoints、perf events 等),在事件发生时被触发执行,采集数据后通过 ring buffer 传递到用户态。 为什么说这是革命性的?三个原因: 安全:eBPF 程序在加载时经过验证器(verifier)检查,确保不会死循环、不会非法访问内存,不需要 root 权限加载内核模块的风险。 低开销:eBPF 程序在内核态直接执行,只有采集到的数据才通过 ring buffer 拷贝到用户态,热路径上的开销极小。 可编程:你可以针对自己的具体问题编写精确的探针程序,而不是依赖通用工具"凑合"用。 eBPF 的完整技术文档可参考 BPF Compiler Collection (BCC) 官方仓库,本文所有工具均来自该项目。 bcc 工具集安装 bcc(BPF Compiler Collection)是基于 eBPF 的性能分析工具集,由 iovisor 项目维护,提供了数十个开箱即用的追踪工具。 Ubuntu / Debian # Ubuntu 20.04+ 推荐方式 sudo apt update sudo apt install -y bpfcc-tools linux-headers-$(uname -r) # 验证安装 /usr/share/bcc/tools/biolatency --help CentOS / RHEL # CentOS 8 / RHEL 8+ sudo dnf install -y bcc-tools kernel-devel-$(uname -r) # CentOS 7 需通过 ELRepo sudo yum install -y epel-release sudo yum install -y bcc-tools kernel-devel-$(uname -r) # 工具默认安装在 /usr/share/bcc/tools/ 目录下 ls /usr/share/bcc/tools/ 安装后建议将工具路径加入 PATH:...

November 13, 2024 · 5 分钟 · 953 字 · 徐保金

OpenTelemetry:统一可观测性标准

概述 在云原生和微服务时代,一个请求可能跨越数十个服务节点。传统的监控方式将 Metrics、Logs、Traces 分散在不同系统中——Prometheus 看指标、ELK 搜日志、Jaeger 追链路,三者之间没有统一的关联方式。当线上故障发生时,你需要在三个系统之间来回切换,手动拼接关联信息,效率低下。 OpenTelemetry(简称 OTel)是 CNCF 主导的可观测性统一标准,目标是用一套 SDK/API 统一采集三大信号(Metrics、Logs、Traces),通过统一的 Collector 处理后发送到任意后端。它不替代后端存储和可视化,而是解决"数据采集层碎片化"的问题。本文深入讲解 OTel 的规范、架构、实践和迁移策略。 参考来源:OpenTelemetry 官方文档、CNCF OpenTelemetry 规范 一、为什么需要 OpenTelemetry 1.1 可观测性碎片化问题 传统可观测性架构(碎片化): 应用代码 ├── Prometheus Client (Metrics) │ └── → Prometheus → Grafana ├── Logback + Filebeat (Logs) │ └── → Elasticsearch → Kibana └── Jaeger Client (Traces) └── → Jaeger → Jaeger UI 问题: 1. 三套 SDK,三套配置,三套运维 2. Metrics / Logs / Traces 之间无关联(TraceID 未关联到日志) 3....

November 11, 2024 · 9 分钟 · 1848 字 · 徐保金

Go 语言构建运维 CLI 工具

为什么 Go 适合运维工具 运维 CLI 工具对部署便捷性和执行效率有极高要求,Go 语言在这方面具有天然优势: 优势 说明 对比 Python 单二进制 编译产出独立可执行文件,无运行时依赖 需 Python 环境 + 依赖 跨平台 GOOS/GOARCH 交叉编译,一次编写到处运行 需虚拟环境管理 启动速度 毫秒级冷启动 解释执行有开销 并发模型 goroutine 轻量并发 需 threading/asyncio 内存占用 静态二进制内存占用低 解释器开销 生态成熟 标准库覆盖网络/文件/加密 依赖第三方库 Kubernetes、Docker、Terraform、Prometheus 等云原生核心工具均使用 Go 编写,Go 已成为云原生运维工具的事实标准语言。 cobra 框架快速上手 cobra 是 Go 生态最流行的 CLI 框架,提供命令树、flag 解析、自动补全等能力。根据 cobra 官方文档,它的设计理念是组合优于继承。 安装与项目初始化 # 安装 cobra CLI 工具 go install github.com/spf13/cobra/cobra@latest # 初始化项目 mkdir k8s-pod-cleaner && cd k8s-pod-cleaner go mod init github....

November 6, 2024 · 8 分钟 · 1559 字 · 徐保金

Python 运维自动化:从 paramiko 到 Ansible

paramiko:SSH 批量管理基础 paramiko 是 Python 实现的 SSHv2 协议库,是运维自动化的底层基石。当需要精细控制 SSH 连接、处理非标准场景时,paramiko 提供了最大灵活性。 基础连接与命令执行 import paramiko import time def ssh_exec(host, port, username, password, command): """基础 SSH 命令执行""" client = paramiko.SSHClient() # 自动添加主机密钥(生产环境建议使用 known_hosts) client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(host, port=port, username=username, password=password, timeout=10) stdin, stdout, stderr = client.exec_command(command) # 获取退出码 exit_code = stdout.channel.recv_exit_status() output = stdout.read().decode().strip() error = stderr.read().decode().strip() return { 'host': host, 'exit_code': exit_code, 'output': output, 'error': error } finally: client.close() # 使用示例 result = ssh_exec('10....

October 31, 2024 · 4 分钟 · 852 字 · 徐保金

SRE核心理念:SLI、SLO与错误预算

概述 SRE(站点可靠性工程)的核心理念是:用工程方法管理可靠性。其中最关键的工具就是 SLI、SLO 和错误预算。 SLI:服务等级指标 SLI 是衡量系统可靠性的量化指标。常见的 SLI 包括: 可用性:成功请求数 / 总请求数 延迟:P99 响应时间 < 200ms 吞吐量:QPS > 10000 正确性:数据一致性校验通过率 选择 SLI 的关键原则:从用户视角出发。用户不关心你的 CPU 使用率,只关心请求是否成功、是否够快。 SLO:服务等级目标 SLO 是 SLI 的目标值。例如: slo: availability: target: 0.999 # 99.9% 可用性 window: "30d" latency: target: 200 # P99 < 200ms window: "30d" 99.9% 的可用性意味着每月允许约 43.8 分钟 不可用。 错误预算 错误预算是 SRE 最精妙的设计: SLO 设为 99.9% → 错误预算 = 0.1% 预算未耗尽:可以发布新功能、做激进变更 预算耗尽:冻结发布,专注稳定性改进 这个机制让"稳定性 vs 迭代速度"不再是口角之争,而是可量化的工程决策。 实践建议 从核心服务开始:不要试图一次性定义所有服务的 SLO 先粗糙后精细:初始 SLO 可以基于历史数据粗略设定,逐步迭代 定期回顾:每月 review SLO 达成情况,调整不合理的指标 自动化告警:基于错误预算消耗速率设置告警,而非固定阈值 总结 SLI/SLO/错误预算构成了 SRE 的度量基石。没有度量就没有管理——这正是 SRE 区别于传统运维的核心。

October 28, 2024 · 1 分钟 · 86 字 · 徐保金

Kubernetes 灾难恢复与备份策略

概述 Kubernetes 集群的灾难恢复是运维中最容易被忽视的领域——直到灾难发生。etcd 损坏导致整个集群不可用、PV 数据误删无法恢复、集群升级失败无法回滚……这些场景没有备份就是灾难,有备份就是一次常规恢复。 详细梳理 K8s 灾难恢复的三个层次:etcd 备份恢复(集群元数据)、Velero 备份(K8s 资源)、PV 数据备份(持久化数据),以及跨集群恢复和恢复演练的实践。 本文基于 Kubernetes v1.30 和 Velero v1.14。参考 Kubernetes 灾难恢复文档 灾备基础概念 RTO 与 RPO 指标 全称 含义 目标 RTO Recovery Time Objective 恢复时间目标(多快恢复) < 30min RPO Recovery Point Objective 数据丢失目标(丢多少数据) < 5min 故障发生 恢复完成 |◄────── RTO ──────────►| | | |◄── RPO ──►| | | | | 最后一次备份 故障点 恢复点 备份层次 层次 备份对象 工具 RPO 恢复粒度 etcd 集群所有元数据 etcdctl snapshot 分钟级 整个集群 K8s 资源 Deployment/Service/ConfigMap 等 Velero 分钟级 命名空间/资源 PV 数据 持久化卷数据 Velero/Restic/Kasten 小时级 单个 PV 应用数据 数据库/对象存储 应用自身机制 秒级 应用级 灾备分类 类型 说明 适用场景 备份恢复 定期备份,故障时恢复 通用 活跃-备用 备集群 standby,故障切换 核心业务 活跃-活跃 多集群同时服务,故障切流 全球业务 混沌演练 模拟故障验证恢复能力 灾备成熟度 etcd 备份与恢复 为什么 etcd 备份最重要 etcd 是 K8s 的"大脑"——所有集群状态(Pod、Service、ConfigMap、Secret、Deployment 等)都存储在 etcd 中。etcd 损坏等于整个集群的数据丢失。没有 etcd 备份,其他备份都无意义。...

October 21, 2024 · 9 分钟 · 1797 字 · 徐保金

SRE 与传统运维的本质区别

概述 很多团队把 SRE 理解为"运维换个名字"——招几个会写脚本的人,改个 Title,就算转型了。这种认知忽略了一个根本事实:SRE 是一种工程方法论,不是一套工具链。Google 在 2003 年创建 SRE 职能时,核心理念就是"用软件工程方法解决运维问题",这从根本上改变了运维的定位、工作方式和文化。 从组织定位、文化差异、工程化实践和度量体系四个维度,系统性地剖析 SRE 与传统运维的本质区别,并给出团队转型路径建议。 一、组织定位:工程师 vs 支撑角色 传统运维的定位困境 传统运维团队通常被定位为"支撑角色"——开发负责写代码,运维负责让代码跑起来。这种分工看似清晰,实则制造了一个致命的对立面: 开发追求"快":快速上线、快速迭代,功能越多越好 运维追求"稳":变更越少越好,最好什么都别动 这种目标冲突导致的结果是:开发把运维当作发布的障碍,运维把开发当作故障的根源。最终演变为一个"拉锯战"——开发提需求,运维挡需求,谁的话语权大谁说了算。 SRE 的定位:工程师 SRE 的根本定位是软件工程师,只是专注于"可靠性"这个领域。Google SRE Book 第一章就明确指出: “SRE is what happens when you ask a software engineer to design an operations team.” 来源:Google SRE Book - Introduction 这意味着 SRE 的工作方式是工程化的: 遇到重复劳动 → 写工具自动化 遇到故障 → 做根因分析并修复系统性问题 遇到容量问题 → 建模型、做预测 遇到流程瓶颈 → 优化流程,而非增加人力 具体对比 维度 传统运维 SRE 定位 支撑角色,被动响应 工程师,主动设计 工作内容 工单处理、手动变更、故障排查 系统设计、自动化、可靠性工程 成功标准 系统没出事 系统在 SLO 范围内,错误预算可控 与开发关系 对立面(快 vs 稳) 协作伙伴(共同对 SLO 负责) 二、文化差异:工程文化 vs 经验文化 错误预算 vs 人工兜底 传统运维文化中,“可用性"是一个模糊的概念——领导说"要 4 个 9”,运维就拼命堆冗余、加监控、人工值守。一旦出了事故,就增加人手和流程来"防止再犯"。...

October 11, 2024 · 4 分钟 · 705 字 · 徐保金

合成监控:主动保障用户体验

概述 传统的监控方式是"被动式"的——等待用户访问触发系统行为,然后采集指标和日志。这种方式有一个根本缺陷:当监控发现问题时,用户已经受到影响。如果你的首页加载了 10 秒,你的监控告警可能在 5 分钟后才触发,而此时已有上千用户体验了糟糕的性能。 合成监控(Synthetic Monitoring)是"主动式"的监控方式——它通过模拟真实用户行为,定期访问关键路径,在用户感知到问题之前就发现并修复。就像一名"虚拟用户"24 小时不间断地测试你的系统,任何异常都能在第一时间被捕获。详细梳理合成监控的原理、实践和工具选型。 参考来源:Grafana Synthetic Monitoring 文档、Datadog Synthetics 文档 一、合成监控原理 1.1 什么是合成监控 合成监控通过预定义的脚本或配置,模拟用户行为(打开页面、点击按钮、提交表单、调用 API),定期执行并记录结果: ┌──────────────────────────────────────────────────────┐ │ 合成监控工作流程 │ │ │ │ ┌──────────────┐ │ │ │ 探测节点集群 │ ← 全球分布的探测节点 │ │ │ (Beijing/ │ │ │ │ Shanghai/ │ │ │ │ Overseas) │ │ │ └──────┬───────┘ │ │ │ │ │ │ 定时执行探测脚本 │ │ ▼ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 模拟用户行为 │ ──→ │ 目标系统 │ │ │ │ • 打开页面 │ │ (Web/API) │ │ │ │ • 点击按钮 │ └──────┬───────┘ │ │ │ • 填写表单 │ │ │ │ │ • 调用 API │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ ▼ │ │ │ ┌──────────────┐ │ │ │ │ 记录结果 │ ←─────────┘ │ │ │ • 状态码 │ │ │ │ • 响应时间 │ │ │ │ • 页面内容 │ │ │ │ • 截图 │ │ │ │ • Trace │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ 告警 + 仪表盘│ │ │ └──────────────┘ │ └──────────────────────────────────────────────────────┘ 1....

October 9, 2024 · 11 分钟 · 2223 字 · 徐保金

VictoriaMetrics 部署与实践:Prometheus 长期存储的高性能替代方案

概述 Prometheus 作为云原生监控的事实标准,几乎成为了微服务和 Kubernetes 监控的默认选择。然而,随着业务规模增长,Prometheus 的本地存储架构逐渐暴露出明显瓶颈:单机存储容量有限(默认 15 天保留期)、缺乏原生水平扩展能力、高基数场景下内存飙升、历史数据查询困难。很多团队在时间序列突破百万级别后,开始面临磁盘 IO 压力、存储成本膨胀和查询延迟增长的"三重困境"。 为解决这些问题,社区涌现了 Thanos、Cortex、VictoriaMetrics 等多种长期存储方案。其中 VictoriaMetrics(以下简称 VM)凭借卓越的压缩率、极简的运维复杂度和出色的查询性能,成为越来越多团队的首选。 将详细梳理 VictoriaMetrics 的架构设计、部署模式、数据迁移、性能调优和生产环境好的实践,帮助你在实际项目中做出正确的技术选型和落地。 为什么选择 VictoriaMetrics Prometheus 的存储瓶颈 理解 VictoriaMetrics 的价值,首先需要明白 Prometheus 的存储瓶颈在哪里: 问题 原因 影响 数据保留期短 默认 TSDB 仅保留 15 天 无法做长期趋势分析 无法水平扩展 单实例架构,无分片机制 单机内存和磁盘成为硬上限 高基数内存膨胀 标签组合爆炸导致内存索引激增 OOM 频发,监控不可用 全局查询困难 多实例数据分散 跨集群查询需额外方案 远程存储延迟 remote_write 同步模型 网络问题导致数据丢失 VictoriaMetrics 的核心优势 VictoriaMetrics 的设计理念是:在完全兼容 Prometheus 生态的前提下,提供更高的性能和更低的资源消耗。 1. 卓越的数据压缩 VM 采用自研的列式存储引擎,针对时间序列数据特征深度优化。根据官方基准测试和大量社区实践,在存储相同监控数据时,VM 所需磁盘空间通常只有 Prometheus TSDB 的 1/5 到 1/7。 # 数据压缩效果对比(基于 100 万活跃时间序列,30 天数据) 存储方案 磁盘占用 压缩比 内存占用 ───────────────────────────────────────────────────────── Prometheus (本地) 350 GB 1x 8 GB Thanos (S3) 120 GB 2....

September 13, 2024 · 12 分钟 · 2433 字 · 徐保金