每秒百万数据点 Go 应用监控系统演进
Goroutine 数量
GC Duration
Panic
infra_http_request_total
infra_http_client_dns_latency_bucket
infra_pubsubx_message_latencies_bucket
总 Tracking 查询量
Tracking 创建速率
某个 ENT 客户的 Tracking 查询失败率
无法查询超过 30 天的数据
查询慢,平均时间超过 2 分钟
跨集群指标无法聚合
Prometheus 集群经常崩溃
维护时 Prometheus 会丢数据
成本高,需要大容量 SSD 磁盘
兼容 Prometheus
长期存储
可跨集群查询
拓展性强
无入侵性
升级了 Thanos 的版本,为 query-frontend 和 storegateway 服务增加了 Redis 缓存,从而提升查询的性能。
我们为 store gateway 做了基于时间的分片。比如最近 30 天的数据使用一个独立的 store gateway,30-90 天前的数据使用另外一个独立的 store gateway,90 天前的使用一个独立的 store gateway,从而提升长期数据的查询性能。
我们结合 Prometheus 的压力情况,根据业务线等纬度拆了多套 Prometheus 集群。因为 Thanos 的每一个查询需要他接入的每一个 Prometheus 都返回,因此 Thanos 的查询性能取决于最慢的 Prometheus 集群或者 store gateway。所以我们这么拆分的主要目的是提高 Prometheus 返回查询结果的性能,最终实现提高 Thanos 查询返回的速度。
超 100+ 倍数据点增长导致查询缓慢
架构复杂,参数调优困难
频繁 OOM
集群规模受制于 Prometheus
集群成本上升
高性能,看板加载时间从 120s 降低到 10s
兼容 Prometheus,可以无缝迁移
成本更低,只需要 Thanos 的 50% 资源
扩展性强,所有组件支持水平扩容
4. Why VictoriaMetrics So Good?
根据容器可用的 CPU 数量计算协程数量
区分 IO 协程和计算协程,同时提供了协程优先级策略
使用 ZSTD 压缩传输内容降低磁盘性能要求
根据可用物理内存限制对象的总量,避免 OOM
区分 fast path 和 slow path,优化 fast path 避免 GC 压力过大
改进 XOR,通过应用 10^X 乘数将 value 浮点值转换为整数值
根据具体情况选择压缩算法
数值相同,那么只存储第一个值
数值是等差数列,那么只存存储第一个值和 Delta 值
Gauges 类型的 value 先用一阶增量编码( Delta )压缩,然后再用 zigzag 算法压缩
Counters 类型的 value 先用二阶增量编码( Delta of Delta )压缩,然后再用 zigzag 算法压缩
最后再应用 ZSTD 算法进行二次压缩
由于其完全的性能取向,数据完整性校验缺失
可能会丢数据
没有 WAL(Write-Ahead Log)
扩容/维护时可能容易崩溃
vmstorage 没有服务自动发现
兼容性需要关注
与 Prometheus 一些设计思路有差异
5. 总结和展望
查询性能大幅提升,用户体验好
稳定性大幅提升,OOM 率大幅下降
资源成本得到降低,至少降低 30% 的成本
成本优化
使用 vmagent 替换 Prometheus
根据实际需求调整指标存储周期
性能优化
优化高基数指标
不同阶段选型侧重点不同
兼容 Prometheus 是首要关注点随着业务增长,性能和成本需要重点关注
不要相信互联网上的报告
你可以并行运行多个方案,然后再决定