
2023年双11大促期间,我所在的电商平台订单创建峰值突破800万QPS。在备战阶段,我们面临三个核心痛点:
作为系统规划与管理师,我主导设计了一套成本可控、渐进式演进的可观测性体系。本文将分享从0到1的建设方法论,涵盖架构选型、技术博弈、成本控制三大维度。
选型博弈:Zabbix vs Prometheus
维度 | Zabbix | Prometheus |
|---|---|---|
数据模型 | 时序数据库 | 多维Label模型 |
查询语言 | 类SQL | PromQL(灵活聚合) |
云原生 | 需适配 | 原生支持K8s服务发现 |
集群规模 | 单点瓶颈 | 支持联邦+远程存储 |
我们最终选择Prometheus + Thanos Receiver架构:
# Thanos Receiver配置片段
receiver:
default_tenant_id: "default-tenant"
tenants:
- name: "production"
endpoints:
- http://prometheus-prod:9090/api/v1/write
- name: "staging"
endpoints:
- http://prometheus-staging:9090/api/v1/write
compactor:
retention_resolution_raw: 30d # 原始数据保留30天
retention_resolution_5m: 180d # 降采样数据保留180天
retention_resolution_1h: 5y # 年同比数据保留5年关键设计:
relabel_config丢弃高基数Label(如pod_ip),将__name__与核心Label组合成唯一标识,减少60% 的时序数痛点:ES热数据节点磁盘IOPS经常打满,月成本超30万
替代方案:ClickHouse(MergeTree引擎)
-- 日志表设计
CREATE TABLE otel_logs (
timestamp DateTime64(9) CODEC(Delta, ZSTD(1)),
trace_id String CODEC(ZSTD(3)),
span_id String CODEC(ZSTD(3)),
severity_text LowCardinality(String),
body String CODEC(ZSTD(9)),
resource_attributes Map(LowCardinality(String), String),
-- 分区与排序
INDEX idx_trace trace_id TYPE bloom_filter GRANULARITY 4
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (severity_text, timestamp)
TTL timestamp + INTERVAL 30 DAY
SETTINGS index_granularity = 8192;收益:
body模糊匹配)从8秒降至800ms采样策略演进:
阶段 | 采样率 | 问题 |
|---|---|---|
初期 | 固定1% | 异常链路漏采 |
中期 | 头部采样(错误全采) | 高QPS下错误数依旧巨大 |
当前 | 尾部采样 + 概率采样 | 平衡成本与质量 |
Jaeger + OpenTelemetry Collector配置:
processors:
probabilistic_sampler:
sampling_percentage: 5 # 正常流量5%
tail_sampling:
decision_wait: 10s
policies:
- name: error-policy
type: status_code
status_code: { status_codes: [ERROR] }
- name: slow-policy
type: latency
latency: { threshold_ms: 500 }
- name: priority-policy
type: probabilistic
probabilistic: { sampling_percentage: 100 }持续分析(Profiling) 接入Pyroscope,定位到P99延迟来自Golang GC频繁(每次STW达12ms),通过调整GOGC=200降低GC频率,P99从380ms降至220ms。
需求 | 开源方案 | 商业方案 | 我们的选择 |
|---|---|---|---|
APM | SkyWalking/Pinpoint | Datadog/ARMS | 自研Agent(基于SkyWalking二次开发) |
日志 | ELK/ClickHouse | LogService | ClickHouse(成本优势明显) |
告警 | AlertManager | 云监控 | AlertManager + 自研去重收敛模块 |
大屏 | Grafana | DataV | Grafana(JSON as Code管理) |
SkyWalking改造点:
biz_env标签用于环境隔离踩坑实录:
buffer_size=2000,启用堆外内存我们为核心服务定义4个黄金信号:
指标 | SLO目标 | 错误预算 |
|---|---|---|
可用性(Availability) | 99.99% | 52.6分钟/季度 |
延迟(Latency P99) | ≤200ms | - |
错误率(Error Rate) | ≤0.1% | - |
饱和度(Saturation) | CPU≤70% | - |
错误预算策略:
基于决策树的故障定位:
故障现象:订单创建成功率下降
├── 依赖服务(库存/支付/风控)?
│ ├── 库存服务RT升高 → 检查DB连接池
│ └── 支付服务错误码500 → 检查支付网关证书
├── 自身资源瓶颈?
│ ├── GC频繁 → 分析Heap Dump
│ └── 线程池满 → 检查业务逻辑锁
└── 网络/基础设施?
├── 机房专线丢包 → 切换备用链路
└── 宿主机Steal Time高 → 迁移Pod实现方式:将运维经验编码为Prometheus Rules + Python脚本,自动标注故障根因,MTTR从25分钟降至6分钟。
数据层级 | 存储介质 | 保留周期 | 压缩策略 |
|---|---|---|---|
热(实时查询) | SSD | 7天 | ZSTD(1) |
温(近线查询) | HDD | 30天 | ZSTD(6) |
冷(归档审计) | 对象存储 | 1年 | Parquet + ZSTD(9) |
高基数治理三板斧:
kube_pod_info中的pod_ip(已有pod_name唯一标识)qps by service)提前计算,查询性能提升10倍trace_id、service_name建Bloom Filter索引,body字段仅存错误日志(≥ERROR级别)动态阈值算法选型:
算法 | 适用场景 | 准确率 | 误报率 |
|---|---|---|---|
3-Sigma | 正态分布指标 | 90% | 5% |
Seasonal ESD | 周期性指标(如日活) | 95% | 2% |
Prophet | 强趋势+季节性 | 98% | 1% |
我们最终选择Prophet + 人工确认闭环,告警准确率从65% 提升至92%。
教训:AI不是银弹,初期投入需控制,先解决确定性运维问题(如自动扩缩容、自动切流)。
最终成果:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。