TDengine 集成 collectd:通过 taosAdapter 接入系统监控数据的完整指南
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
collectd 是一个广泛使用的系统性能采集守护进程,通过插件机制可以将采集到的 CPU、内存、磁盘、网络等指标以多种协议输出。本文以 TDengine 开源仓库官方文档为主体,完整讲解如何将 collectd 采集的数据写入 TDengine:包括 write_tsdb 插件(OpenTSDB 协议)与二进制协议(network 插件)两种接入方式、taosAdapter 与 collectd 两侧的完整配置、参数语义、验证方法以及底层数据模型,帮助你快速搭建"collectd 采集 → taosAdapter 转发 → TDengine 存储查询"的监控数据链路,充分利用 TDengine 对时序数据的高效存储、查询性能和集群处理能力。
collectd 写入 TDengine 的工作原理
collectd 是一个用来收集系统性能的守护进程。它提供各种存储方式来存储不同值的机制,会在系统运行和存储信息时周期性地统计系统的相关统计信息。利用这些信息有助于查找当前系统性能瓶颈和预测系统未来的负载。
collectd 采用插件机制将采集到的监控数据以不同格式写入不同的数据存储软件。TDengine 支持写入两种来源的 collectd 数据,对应的接入路径如下(详见 taosAdapter 参考手册 中的相关章节):
- collectd write_tsdb 插件:这是 collectd 官方插件,将监控数据转换为 OpenTSDB 协议格式并发送给后端存储系统。taosAdapter 通过
opentsdb_telnet端口组中的对应端口(默认 6047)接收。 - collectd 二进制协议数据:collectd 通过
network插件以二进制协议直接发送原始数据,taosAdapter 通过独立的[collectd]端口(默认 6045)接收。
两种方式都不需要编写任何自定义代码——只需要将 collectd 的配置指向运行 taosAdapter 的服务器域名(或 IP 地址)和相应端口,即可将 collectd 采集的数据写入 TDengine。
整体架构如下:
collectd ──(write_tsdb 插件, OpenTSDB telnet 协议, 端口 6047)──▶ taosAdapter ──▶ TDengine 集群 collectd ──(network 插件, 二进制协议, 端口 6045)──────────────▶ taosAdapter ──▶ TDengine 集群前置条件
要将 collectd 数据写入 TDengine,需要以下几方面的准备工作:
- TDengine 集群已经部署并正常运行。
- taosAdapter 已经安装并正常运行,具体细节请参考 taosAdapter 的使用手册。taosAdapter 是 TDengine 的配套工具,作为 TDengine 集群与应用之间的桥梁和适配器,负责接收数据采集代理(如 Telegraf、StatsD、collectd 等)的数据,并提供 InfluxDB/OpenTSDB 兼容的数据写入接口。
- collectd 已经安装,安装 collectd 请参考其官方文档。在主流 Linux 发行版上通常可通过系统包管理器直接安装,例如
apt install collectd或yum install collectd。
taosAdapter 作为 TDengine 服务端软件的一部分随服务器安装。安装完成后,可以通过systemctl start taosadapter启动 taosAdapter 服务。
方式一:通过 write_tsdb 插件写入(OpenTSDB telnet 协议)
配置 taosAdapter
在 taosAdapter 配置文件(默认位置为/etc/taos/taosadapter.toml)中开启对应配置项,使 taosAdapter 能够接收 collectd write_tsdb 插件的数据:
# 若设置为 true,则使用 schemaless 特性写入数据时自动创建数据库 smlAutoCreateDB = true [opentsdb_telnet] enable = true maxTCPConnections = 250 tcpKeepAlive = false dbs = ["opentsdb_telnet", "collectd", "icinga2", "tcollector"] ports = [6046, 6047, 6048, 6049] user = "root" password = "taosdata"- 默认情况下 taosAdapter 写入的数据库名为
collectd,你也可以修改配置文件中的dbs项来指定其他名称。上述dbs与ports数组按下标一一对应,分别服务于 OpenTSDB telnet、collectd write_tsdb、icinga2、tcollector 四类兼容 OpenTSDB telnet 协议的采集端;collectd write_tsdb 插件默认使用6047端口。 user和password请填写实际的 TDengine 配置值。- 修改配置文件后,需要重启 taosAdapter 使配置生效。
配置 collectd
修改 collectd 配置文件(默认位置为/etc/collectd/collectd.conf),加载write_tsdb插件并指向 taosAdapter:
LoadPlugin write_tsdb <Plugin write_tsdb> <Node> Host "<taosAdapter's host>" Port "<port for collectd write_tsdb plugin>" ... </Node> </Plugin><taosAdapter's host>填写运行 taosAdapter 的服务器域名或 IP 地址。<port for collectd write_tsdb plugin>填写 taosAdapter 用于接收 collectd write_tsdb 插件数据的端口,默认是6047。
完整示例:
LoadPlugin write_tsdb <Plugin write_tsdb> <Node> Host "127.0.0.1" Port "6047" HostTags "status=production" StoreRates false AlwaysAppendDS false </Node> </Plugin>上述示例中还展示了几个常用可选配置:HostTags用于为所有指标附加公共标签(如status=production),StoreRates控制是否以速率形式存储计数值,AlwaysAppendDS控制是否始终追加数据源(DS)名称。
方式二:通过 collectd 二进制协议写入(network 插件)
配置 taosAdapter
在 taosAdapter 配置文件(默认位置为/etc/taos/taosadapter.toml)中开启[collectd]配置段:
... [collectd] enable = true port = 6045 db = "collectd" user = "root" password = "taosdata" worker = 10 ...- 默认情况下 taosAdapter 写入的数据库名为
collectd,你可以修改配置文件中的db项来指定其他名称。 user和password请填写实际的 TDengine 配置值。- 修改配置文件后,需要重启 taosAdapter 使配置生效。
配置 collectd
修改 collectd 配置文件(默认位置为/etc/collectd/collectd.conf),加载network插件:
LoadPlugin network <Plugin network> Server "<taosAdapter's host>" "<port for collectd direct>" </Plugin><taosAdapter's host>填写运行 taosAdapter 的服务器域名或 IP 地址。<port for collectd direct>填写 taosAdapter 用于接收 collectd 二进制数据的端口,默认是6045。
示例:
LoadPlugin network <Plugin network> Server "127.0.0.1" "6045" </Plugin>然后重启 collectd:
systemctl restart collectd两种方式对比与选型建议
| 对比维度 | write_tsdb 插件(方式一) | network 插件二进制协议(方式二) |
|---|---|---|
| collectd 侧插件 | write_tsdb | network |
| 数据格式 | OpenTSDB telnet 文本协议 | collectd 二进制协议 |
| taosAdapter 配置段 | [opentsdb_telnet] | [collectd] |
| 默认端口 | 6047 | 6045 |
| 默认数据库 | collectd(由dbs数组指定) | collectd(由db指定) |
| 附加能力 | 可配置 HostTags、StoreRates 等 | 可配置 worker 线程数 |
两种方式最终都通过 taosAdapter 内部的 schemaless 写入链路进入 TDengine,实际选择取决于 collectd 实例中已启用的插件:若已有 OpenTSDB 相关输出习惯或需要与其他 OpenTSDB 生态工具共用端口组,可选择方式一;若希望直接复用 collectd 二进制协议、配置最简,可选择方式二。
taosAdapter 相关配置参数详解
除上面的示例配置外,taosAdapter 参考手册 对相关配置参数给出了完整的默认值与语义,理解这些参数有助于针对生产环境进行调优。
collectd 二进制协议参数([collectd]段)
collectd.enable:是否启用 collectd 协议支持,默认false。collectd.port:collectd 服务监听端口,默认6045。collectd.db:collectd 数据的目标数据库,默认"collectd"。collectd.user:数据库用户名,默认"root"。collectd.password:数据库密码,默认"taosdata"。collectd.token:数据库令牌,默认""(TDengine 企业版 3.4.0.0 及以上可用)。collectd.ttl:数据生存时间,默认0表示永不过期。collectd.worker:写入工作线程数,默认10。
OpenTSDB telnet 参数([opentsdb_telnet]段)
opentsdb_telnet.enable:是否启用 OpenTSDB Telnet 协议,默认false(注意该协议本身不携带鉴权信息)。opentsdb_telnet.ports:监听端口数组,默认[6046, 6047, 6048, 6049],依次对应 OpenTSDB telnet、collectd write_tsdb、icinga2、tcollector。opentsdb_telnet.dbs:目标数据库数组,与ports一一对应,参考手册中给出的默认值为["opentsdb_telnet", "collectd_tsdb", "icinga2_tsdb", "tcollector_tsdb"];在 collectd 接入文档的示例配置中则将其中的 collectd 数据库显式指定为"collectd",二者按实际部署需求选用即可。opentsdb_telnet.user:数据库用户名,默认"root"。opentsdb_telnet.password:数据库密码,默认"taosdata"。opentsdb_telnet.ttl:数据 TTL,默认0。opentsdb_telnet.token:数据库令牌,默认""(TDengine 企业版 3.4.0.0 及以上可用)。opentsdb_telnet.batchSize:批量写入大小,默认1。opentsdb_telnet.flushInterval:刷新间隔,默认0s。opentsdb_telnet.maxTCPConnections:最大 TCP 连接数,默认250。opentsdb_telnet.tcpKeepAlive:是否启用 TCP KeepAlive,默认false。
公共参数
smlAutoCreateDB:从 3.0.4.0 版本起提供,控制写入 schemaless 协议时是否自动创建数据库。当设置为true时,如果目标数据库不存在,taosAdapter 会在收到数据时自动创建;当为false(默认值)时,需要手动创建数据库,否则写入失败。该参数同样作用于 collectd 数据写入等 schemaless 相关接口。- 连接池参数:collectd 数据写入与 RESTful API、InfluxDB v1 写入、OpenTSDB 写入等接口共享同一个连接池,可通过
pool.maxConnect、pool.maxIdle、pool.idleTimeout、pool.waitTimeout、pool.maxWait等参数调节并发能力。
此外,taosAdapter 支持通过命令行参数、环境变量和配置文件三种方式配置,优先级为:命令行参数 > 环境变量 > 配置文件。命令行用法为arg=val形式,例如taosadapter -p=30000 --debug=true。除了配置文件外,也可以用 taosAdapter 命令行参数或设置环境变量来启动,以开启接收 collectd 数据的能力,更多细节可查阅 taosAdapter 参考手册。
验证方法
重启 collectd
sudo systemctl restart collectd使用 TDengine CLI 验证数据写入
使用taosshell 验证从 collectd 向 TDengine 写入数据并能够正确读出。首先确认数据库已创建:
taos> show databases; name | ================================= information_schema | performance_schema | collectd | Query OK, 3 row(s) in set (0.003266s)切换到 collectd 数据库并查看超级表:
taos> use collectd; Database changed. taos> show stables; name | ================================= load_1 | memory_value | df_value | load_2 | load_0 | interface_1 | irq_value | entropy_value | swap_value | Query OK, 10 row(s) in set (0.002236s)查询写入的内存监控数据:
taos> select * from collectd.memory_value limit 10; ts | value | host | type_instance | type | ========================================================================================================================================================= 2022-04-20 09:27:45.459653462 | 54689792.000000000 | shuduo-1804 | buffered | memory | 2022-04-20 09:27:55.453168283 | 57212928.000000000 | shuduo-1804 | buffered | memory | 2022-04-20 09:28:05.453004291 | 57942016.000000000 | shuduo-1804 | buffered | memory | 2022-04-20 09:27:45.459653462 | 6381330432.000000000 | shuduo-1804 | free | memory | 2022-04-20 09:27:55.453168283 | 6357643264.000000000 | shuduo-1804 | free | memory | 2022-04-20 09:28:05.453004291 | 6349987840.000000000 | shuduo-1804 | free | memory | 2022-04-20 09:27:45.459653462 | 107040768.000000000 | shuduo-1804 | slab_recl | memory | 2022-04-20 09:27:55.453168283 | 107536384.000000000 | shuduo-1804 | slab_recl | memory | 2022-04-20 09:28:05.453004291 | 107634688.000000000 | shuduo-1804 | slab_recl | memory | 2022-04-20 09:27:45.459653462 | 309137408.000000000 | shuduo-1804 | used | memory | Query OK, 10 row(s) in set (0.010348s)如果上述输出与预期一致,说明 collectd → taosAdapter → TDengine 的整条链路已经打通,数据可以正常写入和读出。
数据模型:超级表、子表与标签
从上面的验证输出可以看出,collectd 数据进入 TDengine 后被组织为一张张超级表(STable),表名与 collectd 的类型体系一一对应,例如:
load_0、load_1、load_2:对应 collectd 的 load 类型(系统 1/5/15 分钟负载)。memory_value:内存指标。df_value:磁盘文件系统空间指标。interface_0、interface_1:网络接口流量指标。irq_value、entropy_value、swap_value:中断、系统熵、交换分区等指标。
每张超级表统一包含以下列(以memory_value为例):
| 列名 | 说明 |
|---|---|
ts | 数据采集时间戳(纳秒精度),作为主时间戳列 |
value | 采集到的指标值 |
host | 采集主机标识(标签),来自 collectd 的 host 字段 |
type_instance | 类型实例(标签),例如内存的buffered、free、slab_recl、used等细分项 |
type | collectd 类型名称(标签),例如memory |
其中host、type_instance、type等作为标签(TAG)列用于过滤与聚合,指标值作为普通列存储,符合 TDengine 对时序数据"时间戳 + 多标签 + 多指标"的建模方式。
需要注意的是:TDengine 自动生成的子表名是按照规则生成的唯一 ID 值,因此在show tables中看到的子表名并不是类似host-name的可读名称,而是唯一的数字 ID。如果需要以可读的方式检索,可以基于host等标签列进行查询。
常见问题与注意事项
- 数据库不存在导致写入失败:如果
smlAutoCreateDB为false(默认),需要提前手动创建数据库,例如执行create database collectd;,否则写入会失败;也可以将smlAutoCreateDB设为true让 taosAdapter 自动建库。 - 端口与协议对应关系:6045 端口接收的是 collectd 二进制协议(network 插件),6047 端口接收的是 write_tsdb 插件转换后的 OpenTSDB telnet 协议,配置时不要混淆。
- 修改配置后必须重启服务:无论是修改 taosAdapter 的
/etc/taos/taosadapter.toml还是 collectd 的/etc/collectd/collectd.conf,都需要重启对应服务(systemctl restart taosadapter/sudo systemctl restart collectd)才能生效。 - 鉴权配置:请将
user、password(以及企业版的token)配置为实际的 TDengine 用户凭据,避免使用默认口令暴露在生产环境。 - 安全说明:OpenTSDB telnet 协议本身不携带鉴权信息,启用
opentsdb_telnet时建议在受控网络内使用。
更完整的 taosAdapter 功能(如连接池、内存保护、日志配置等)可继续参阅 taosAdapter 参考手册;本文所依赖的 collectd 接入细节(两种写入方式的标准配置)收录于其 collectd 资源配置片段。至此,你已可以在自己的环境中完成 collectd 与 TDengine 的对接,并把系统性能监控数据沉淀到 TDengine 中做进一步分析与可视化。
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考