监控数据
监控数据的分类
监控数据分为三大类:
- StaticMonitoringData:静态信息,采集后一般不会变化(CPU 型号、系统版本、GPU 型号等)
- DynamicMonitoringData:动态信息,随系统实时变化(CPU 使用率、内存、磁盘、网络等)
- DynamicMonitoringSummaryData:动态摘要信息,将动态数据的关键指标扁平化存储(非 JSON),便于高效查询与聚合
动态监控数据摘要和全量动态监控数据的储存
对于轻度用户而言,所需要获取的信息是服务器 CPU/内存/硬盘/网络等的基本数值信息。
而有的用户需要更加详细的数据来满足运维和监控需求,比如每个磁盘的占用比和 IO,每个网络设备的状态等。
对于前者,NodeGet 提供了 动态监控数据摘要,对于后者则提供了 全量动态监控数据,这两个数据储存在不同的数据库表里。
动态监控数据摘要 的储存结构比较固定,因此采用多列宽表来储存不同的监控信息,即使储存较长时间的数据也不会占用过多磁盘空间。
而 全量动态监控数据 则不同,因为不同设备的磁盘分布和网络设备分布各有不同,很难扁平化为固定的表结构,因此其采用了 JSON 数据储存。
具体来说,全量动态监控数据 在 PostgreSQL 上使用 JSONB 类型储存,在 SQLite 上则以 TEXT 列储存 JSON 字符串(SQLite 无原生 JSONB 类型)。PostgreSQL 的 JSONB 储存效率与压缩效能优于 SQLite 的纯文本 JSON 储存。虽然如此,利用 SQL 数据库储存 JSON 仍然是一种性价比较低的操作,储存效率远低于 动态监控数据摘要 ,仅适合储存短期内的数据以供实时分析。
为了能权衡磁盘占用与信息全面程度的关系,允许用户通过 Agent 的配置文件和 Kv 里的特殊变量来决定以下内容:
动态监控数据摘要和全量动态监控数据的数据上报频率可以分别通过 Agent 配置调整动态监控数据摘要和全量动态监控数据的最大储存时长可以通过 特殊 Kv 变量 来配置- 可以在 Agent 节点设置功能里面轻松地设定各个监控(及 Task 数据)的储存时效
流量统计数据的储存
除了上面三类监控数据,NodeGet 还有一套独立的周期流量统计(回答"某段时间用了多少流量"这类问题),数据存储方式和上面三类都不一样,用了三张专门的表:
- 总流量表:每台设备的每块网卡各存一行,记录到目前为止的累计收发字节数,随每次上报更新(Upsert,不新增行)
- 流量快照表:每块网卡定时记一行"到这一刻为止的累计流量",用来支持按任意时间段查询流量。快照由 JS Worker(
traffic-snapshot-worker)定时写入,服务端自己不生成 - 可能丢失数据记录表:网卡计数器发生重置(比如重启)且中断时间超过 10 分钟时,记一段时间区间,提醒这段时间内的统计可能不准
只有出口网卡(真正连接外网的网卡)才会被计入,容器、隧道类虚拟网卡默认不算,避免流量被重复统计;这个判断规则和动态监控数据摘要的网络流量统计是共用的一套,可以通过 Agent 配置里的 dynamic_summary_select_network_interface 手动指定要统计哪些网卡。详见流量统计功能和接口文档。
数据清理
NodeGet 通过 Js Worker 的 onCron 定时任务实现数据清理逻辑(参见定时任务 )。清理策略通过 特殊 Kv 变量 中的 database_limit_* 键来配置。
流量统计的三张表不在上面这套
database_limit_*清理范围内。总流量表和"可能丢失数据"记录表增长很慢(前者每台设备每网卡固定一行,后者只在重启等场景才新增);会持续增长的流量快照表(每块网卡每 15 分钟一行)由流量统计 Worker 定时清理,保留时长也通过 Kv 配置,详见流量统计功能。没有安装这个 Worker 时,既不会有快照,也没有清理。
