基数是什么
序列基数指 measurement 与全部标签取值组合出的唯一序列数量。时序库按序列组织写入与查询,每条序列都要维护索引与内存结构,所以基数不是抽象指标,而是直接决定内存占用与写入速度的硬约束;基数失控是时序库最常见的性能故障源。
基本信息
| 适用产品 | InfluxDB 1.x / 2.x、Prometheus 等标签模型时序库 |
|---|---|
| 基数来源 | 标签键数量 × 每个键的取值数量,组合相乘 |
| 危险信号 | 内存持续增长、写入变慢、查询超时、日志出现 too many series |
| 控制手段 | 移除无界标签、限制取值、预聚合采样、按维度分桶拆库 |
| 查看方式 | InfluxDB 用 SHOW SERIES CARDINALITY,Prometheus 用 promtool tsdb analyze |
典型使用场景
- 接入新数据源前预估基数:标签键能取多少值,能不能枚举穷举
- 容量评审按增长算:标签取值随业务扩张翻倍,内存需求也跟着涨
- 排查内存只见涨不见落:先区分是查询缓存还是序列索引
- 排查写入变慢:批量写超时往往先命中序列索引这一环
- 重新设计标签方案:决定哪些字段进标签、哪些留在字段里
示例
示例
# InfluxDB v1:查看序列基数(需开启相关统计)
SHOW SERIES CARDINALITY
SHOW SERIES CARDINALITY FROM "cpu"
# InfluxDB v1:看某个 measurement 下的标签键与取值规模
SHOW TAG KEYS FROM "cpu"
SHOW TAG VALUES FROM "cpu" WITH KEY = "host"
# InfluxDB 2.x:用 CLI 检查 bucket 相关统计
influx bucket list
# Prometheus:用 promtool 检查本地 TSDB 的序列规模
promtool tsdb analyze /var/lib/prometheus异常信号与应对
| 信号 | 表现 | 应对 |
|---|---|---|
| 内存持续增长 | 序列索引常驻内存且不随查询结束释放 | 定位高基数标签从设计上移除 |
| 写入变慢 | 每批写入都要更新序列索引与 WAL | 减少标签取值数量,或改批量提交 |
| 查询超时 | 高基数标签过滤要扫过大量序列 | 换更粗粒度标签,或用预聚合表回答 |
| 日志出现 too many series | 触达服务端保护阈值 | 先治理标签组合,再考虑拆分实例 |
| 备份与压缩变慢 | 元数据体积随序列数膨胀 | 按业务或地域拆分实例,缩小单实例规模 |
设计阶段就把标签取值枚举化:区域、机型、状态这类可控维度适合当标签;用户 ID、URL、容器 ID、请求 ID 通常不适合,它们会把序列数推向无界。
高基数维度放字段(field)而不是标签(tag):在 InfluxDB 的模型里字段不参与序列索引,同样的取值放对位置,基数可以差出好几个数量级。
标签里放高精度数值(毫秒时间戳、浮点采样值、递增主键)等于给每个数据点建一条序列,写入几条就会把内存打满;这类值一律进字段。