小 T 导读:家喻户晓,TDengine 反对多种写入协定,包含 SQL、InfluxDB Line 协定、OpenTSDB Telnet 协定、OpenTSDB JSON 格局协定。但说到如何进行写入操作,很多读者可能都是一头雾水,本篇文章为大家汇总了一系列的写入教程,不便有须要的开发者作为写入指南珍藏应用。
TDengine 中的 SQL 写入即模式化写入,在写入到 Database 之前,须要事后定义好数据表的 Schema 模式,具体来说就是数据表蕴含多少列,每列寄存的数据类型是什么。即在建表时应用规范的 SQL 语句指定表的 Schema,再遵循事后建好的列跟标签值的数量和类型进行数据写入。
除了 SQL 写入外,TDengine 还反对三种无模式写入协定,别离是 InfluxDB Line 协定、OpenTSDB Telnet 协定和 OpenTSDB JSON 格局协定。如果你对 NoSQL 比拟相熟,那对无模式写入应该就不会生疏了。艰深来讲,无模式写入为用户提供了一种以文本格式将数据写入到 TDengine 的形式,更加便捷。
物联网场景中的利用常常须要采集比拟多的数据项,用于实现智能管制、业务剖析和设施监控等,因为应用逻辑的版本升级,或者设施本身的硬件调整等起因,数据采集项有可能比拟频繁地呈现变动,为了在这种状况下仍能不便地实现数据记录工作,TDengine 从 2.2 版本开始就提供了无模式写入形式,写入时无需提前创立超级表和子表,其引擎能自适应数据并对表构造进行调整。
在应用 TDengine 写入数据时,数据能够单条插入,也能够批量插入,能够插入一个数据采集点的数据,也能够同时插入多个数据采集点的数据。此外,TDengine 不仅反对多线程插入、工夫乱序数据插入,也反对历史数据插入。上面将对四种写入协定进行阐明,以供参考。
SQL 写入
用户能够让利用通过连接器执行 INSERT 语句来插入数据,还能够通过 TAOS Shell,手动输出 INSERT 语句来实现。
一次写入一条
上面这条 INSERT 就将一条记录写入到表 d1001 中:
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
一次写入多条
TDengine 反对一次写入多条记录,比方上面这条命令就将两条记录写入到表 d1001 中:
INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25);
一次写入多表
TDengine 也反对一次向多个表写入数据,比方上面这条命令就向 d1001 写入两条记录,向 d1002 写入一条记录:
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31);
注意事项
如果想要进步写入效率,咱们能够应用批量写入,这样一批写入的记录条数越多,插入效率就会越高,但须要留神的是,一条记录不能超过 48 KB,一条 SQL 语句总长度不能超过 1MB。此外,TDengine 反对多线程同时写入,如果要进一步提高写入速度,一个客户端须要关上 20 个以上的线程同时写。但要留神,线程数达到肯定数量后将无奈再进步,甚至还会降落,因为线程频繁切换会带来额定开销。
对同一张表来说,如果新插入记录的工夫戳曾经存在,那默认情景下(UPDATE=0)新记录将被间接摈弃,也就是说,在一张表里工夫戳必须是惟一的。如果让利用主动生成记录,很可能生成的工夫戳是一样的,这样一来,胜利插入的记录条数就会小于利用插入的记录条数。如果在创立 Database 时应用了 UPDATE 为 1 的选项,插入雷同工夫戳的新记录将笼罩原有记录。
最初一点,写入数据的工夫戳必须大于以后工夫减去配置参数 keep 的工夫,如果 keep 配置为 3650 天,那么将无奈写入比 3650 天还早的数据;而且写入数据的工夫戳也不能大于以后工夫加配置参数 days,即如果 days 为 2,那么也将无奈写入比以后工夫还晚 2 天的数据。
对于 SQL 写入的更具体语法规定可参考此前公布的应用 TDengine 如何进行 SQL 写入 一文。
InfluxDB 行协定
InfluxDB Line 协定采纳一行字符串来示意一行数据。分为四局部:measurement,tag_set field_set timestamp
- measurement 将作为超级表名。它与 tag_set 之间应用一个英文逗号来分隔。
- tag_set 将作为标签数据,其格局形如 <tag_key>=<tag_value>,<tag_key>=<tag_value>,也即能够应用英文逗号来分隔多个标签数据。它与 field_set 之间应用一个半角空格来分隔。
- field_set 将作为一般列数据,其格局形如 <field_key>=<field_value>,<field_key>=<field_value>,同样是应用英文逗号来分隔多个一般列的数据。它与 timestamp 之间应用一个半角空格来分隔。
- timestamp 即本行数据对应的主键工夫戳。
例如:
meters,location=California.LosAngeles,groupid=2 current=13.4,voltage=223,phase=0.29 1648432611249500
注意事项
- tag_set 中的所有数据会主动转化为 nchar 数据类型;
- field_set 中的每个数据项都须要对本身的数据类型进行形容,比方 1.2f32 代表 float 类型的数值 1.2,如果不带类型后缀会被当作 double 解决;
- timestamp 反对多种工夫精度。写入数据时须要用参数指定工夫精度,反对从小时到纳秒的 6 种工夫精度。
OpenTSDB 行协定
OpenTSDB 行协定同样采纳一行字符串来示意一行数据。因为 OpenTSDB 采纳的是单列模型,因而一行只能蕴含一个一般数据列,但标签列仍然能够有多个。该协定同样分为四局部,具体格局约定如下:
<metric> <timestamp> <value> <tagk_1>=<tagv_1>[<tagk_n>=<tagv_n>]
须要留神的是:
- metric 将作为超级表名。
- timestamp 为本行数据对应的工夫戳。依据工夫戳的长度自动识别工夫精度。反对秒和毫秒两种工夫精度
- value 为度量值,必须为一个数值。对应的列名也是“value”。
- 最初一部分是标签集,用空格分隔不同标签,所有标签主动转化为 nchar 数据类型;
例如:
meters.current 1648432611250 11.3 location=California.LosAngeles groupid=3
具体能够参考 OpenTSDB Telnet API 文档:http://opentsdb.net/docs/buil…
OpenTSDB JSON 格局协定
OpenTSDB JSON 格局协定采纳一个 JSON 字符串示意一行或多行数据。例如:
[
{
"metric": "sys.cpu.nice",
"timestamp": 1346846400,
"value": 18,
"tags": {
"host": "web01",
"dc": "lga"
}
},
{
"metric": "sys.cpu.nice",
"timestamp": 1346846400,
"value": 9,
"tags": {
"host": "web02",
"dc": "lga"
}
}
]
与 OpenTSDB 行协定相似,在此种写入协定中,metric 将作为超级表名,timestamp 示意工夫戳,value 示意度量值,tags 示意标签集。具体能够参考 OpenTSDB HTTP API 文档:http://opentsdb.net/docs/buil…
注意事项
- 对于 JSON 格局协定,TDengine 并不会主动把所有标签转成 nchar 类型,仅会将字符串转为 nchar 类型,数值将转换为 double 类型。
- TDengine 只接管 JSON 数组格局的字符串,即便一行数据也须要转换成数组模式。
写在最初
为了更高效地向 TDengine 写入数据,客户端程序要充沛且失当地利用以下几个因素:数据在不同表(或子表)之间的散布,即要写入数据的相邻性;单次写入的数据量;并发连接数。在单次写入中尽量只向同一张表(或子表)写入数据,每批次写入的数据量通过测试和调优,设定为一个最适宜以后零碎解决能力的数值,并发写入的连接数同样通过测试和调优后,设定为一个最适宜以后零碎解决能力的数值,以实现在以后零碎中的最佳写入速度。此外,TDengine 提供的独特参数绑定写入,也是一个有助于实现高效写入的办法。
但要留神的是,如果无论怎么调节客户端程序,taosd 过程的 CPU 使用率始终都很低,那很可能须要减少 vgroup 的数量,服务端的配置同样重要。如果大家在写入操作时遇到了艰难,首先能够进入 TDengine 官网 - 技术文档页面进行查问,如果仍然无奈解决,咱们还有专门的社区技术人员可能为你答疑解惑。
此外,如果大家想理解 Java、Python、Go、Rust、Node.js、C#、C 不同语言的写入示例代码,也能够进入 TDengine 官网 - 技术文档页面查看更多详情。
想理解更多 TDengine Database 的具体细节,欢送大家在 GitHub 上查看相干源代码。