高效寫入數據
TDengine 支持多(duo)種接(jie)口寫入(ru)(ru)(ru)數(shu)(shu)據(ju)(ju),包括 SQL,Prometheus,Telegraf,collectd,StatsD,EMQX MQTT Broker,HiveMQ Broker,CSV 文件等(deng),后續還將提(ti)供(gong) Kafka,OPC 等(deng)接(jie)口。數(shu)(shu)據(ju)(ju)可(ke)以(yi)(yi)單條插入(ru)(ru)(ru),也(ye)(ye)可(ke)以(yi)(yi)批(pi)量插入(ru)(ru)(ru),可(ke)以(yi)(yi)插入(ru)(ru)(ru)一個數(shu)(shu)據(ju)(ju)采集點的數(shu)(shu)據(ju)(ju),也(ye)(ye)可(ke)以(yi)(yi)同時插入(ru)(ru)(ru)多(duo)個數(shu)(shu)據(ju)(ju)采集點的數(shu)(shu)據(ju)(ju)。支持多(duo)線程插入(ru)(ru)(ru),支持時間亂(luan)序(xu)數(shu)(shu)據(ju)(ju)插入(ru)(ru)(ru),也(ye)(ye)支持歷史數(shu)(shu)據(ju)(ju)插入(ru)(ru)(ru)。
SQL 寫入
應用(yong)通過 C/C++, Java, Go, C#, Python, Node.js 連接器執行 SQL insert 語(yu)句來插入數(shu)據(ju),用(yong)戶還可以通過 TAOS Shell,手動輸(shu)入 SQL insert 語(yu)句插入數(shu)據(ju)。比如下(xia)面(mian)這(zhe)條 insert 就將一條記錄寫入到(dao)表 d1001 中(zhong):
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
TDengine 支持一次寫入多條(tiao)記(ji)錄,比如下(xia)面這條(tiao)命令就將兩條(tiao)記(ji)錄寫入到表(biao) d1001 中:
INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25);
TDengine 也(ye)支(zhi)持一次向多個(ge)表寫(xie)入(ru)數據(ju),比如(ru)下面這(zhe)條命(ming)令就向 d1001 寫(xie)入(ru)兩條記錄(lu),向 d1002 寫(xie)入(ru)一條記錄(lu):
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31);
詳細的 SQL INSERT 語法規則請見 TAOS SQL 的數據寫入 章節。
Tips:
- 要提高寫入效率,需要批量寫入。一批寫入的記錄條數越多,插入效率就越高。但一條記錄不能超過 48K(2.1.7.0 之前的版本為 16K),一條 SQL 語句總長度不能超過 1M 。
- TDengine 支持多線程同時寫入,要進一步提高寫入速度,一個客戶端需要打開 20 個以上的線程同時寫。但線程數達到一定數量后,無法再提高,甚至還會下降,因為線程頻繁切換,帶來額外開銷。
- 對同一張表,如果新插入記錄的時間戳已經存在,默認情形下(UPDATE=0)新記錄將被直接拋棄,也就是說,在一張表里,時間戳必須是唯一的。如果應用自動生成記錄,很有可能生成的時間戳是一樣的,這樣,成功插入的記錄條數會小于應用插入的記錄條數。如果在創建數據庫時使用了 UPDATE 1 選項,插入相同時間戳的新記錄將覆蓋原有記錄。
- 寫入的數據的時間戳必須大于當前時間減去配置參數 keep 的時間。如果 keep 配置為3650天,那么無法寫入比 3650 天還早的數據。寫入數據的時間戳也不能大于當前時間加配置參數 days。如果 days 為 2,那么無法寫入比當前時間還晚2天的數據。
無模式(Schemaless)寫入
前言
在物聯網應用中,常會采集比較多的數據項,用于實現智能控制、業務分析、設備監控等。由于應用邏輯的版本升級,或者設備自身的硬件調整等原因,數據采集項就有可能比較頻繁地出現變動。為了在這種情況下方便地完成數據記錄工作,TDengine 從 2.2.0.0 版本開始,提供調用 Schemaless 寫入方式,可以免于預先創建超級表/子表的步驟,隨著數據寫入接口能夠自動創建與數據對應的存儲結構。并且在必要時,Schemaless 將自動增加必要的數據列,保證用戶寫入的數據可以被正確存儲。
目前,TDengine 的所有官方支持的連接器支持 Schemaless 的操作接口,詳情請參見 Schemaless 方式寫入接口章節。這里對 Schemaless 的數據表達格式進行了描述。
無模式寫入方式建(jian)(jian)(jian)立(li)的(de)(de)超級(ji)表(biao)(biao)(biao)(biao)及其對(dui)應的(de)(de)子表(biao)(biao)(biao)(biao)與通(tong)(tong)過(guo) SQL 直接建(jian)(jian)(jian)立(li)的(de)(de)超級(ji)表(biao)(biao)(biao)(biao)和子表(biao)(biao)(biao)(biao)完(wan)全(quan)沒有區(qu)別,您(nin)也(ye)可以(yi)通(tong)(tong)過(guo) SQL 語句直接向其中寫入數據。需要(yao)注意(yi)的(de)(de)是,通(tong)(tong)過(guo)無模式寫入方式建(jian)(jian)(jian)立(li)的(de)(de)表(biao)(biao)(biao)(biao),其表(biao)(biao)(biao)(biao)名(ming)是基于標(biao)簽值按(an)照固定的(de)(de)映射規則生成(cheng),所以(yi)無法明確地(di)進行表(biao)(biao)(biao)(biao)意(yi),缺乏可讀性。
無模式寫入行協議
TDengine 的(de)無(wu)模式(shi)寫入(ru)的(de)行(xing)協(xie)議(yi)兼容 InfluxDB 的(de) 行(xing)協(xie)議(yi)(Line Protocol)、OpenTSDB 的(de) telnet 行(xing)協(xie)議(yi)、OpenTSDB 的(de) JSON 格式(shi)協(xie)議(yi)。但是(shi)使用這三種協(xie)議(yi)的(de)時(shi)候,需要在 API 中指定(ding)輸(shu)入(ru)內容使用解(jie)析協(xie)議(yi)的(de)標準。
對于(yu) InfluxDB、OpenTSDB 的(de)標準(zhun)寫入協議(yi)請參考(kao)各自(zi)的(de)文檔。下面首(shou)先以(yi) InfluxDB 的(de)行協議(yi)為(wei)基礎,介紹 TDengine 擴展的(de)協議(yi)內容,允許(xu)用戶采(cai)用更加(jia)精細的(de)方(fang)式控(kong)制(超級(ji)表(biao))模式。
Schemaless 采用一個字符串來表達(da)一個數據行(可以向寫(xie)入 API 中一次(ci)傳入多行字符串來實現多個數據行的(de)批(pi)量寫(xie)入),其(qi)格(ge)式約定(ding)如下:
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 即本行數據對應的主鍵時間戳。
tag_set 中的所有的數據自動轉化為 nchar 數據類型,并不需要使用雙引號(")。
在無(wu)模式寫入數據行(xing)協議中,field_set 中的每個(ge)數據項(xiang)都需要對自身的數據類型進行(xing)描述(shu)。具體來說:
- 如果兩邊有英文雙引號,表示 BINARY(32) 類型。例如
"abc"。 - 如果兩邊有英文雙引號而且帶有 L 前綴,表示 NCHAR(32) 類型。例如
L"報錯信息"。 - 對空格、等號(=)、逗號(,)、雙引號("),前面需要使用反斜杠(\)進行轉義。(都指的是英文半角符號)
- 數值類型將通過后綴來區分數據類型:
| 序號 | 后綴 | 映射類型 | 大小(字節) |
|---|---|---|---|
| 1 | 無或f64 | double | 8 |
| 2 | f32 | float | 4 |
| 3 | i8 | TinyInt | 1 |
| 4 | i16 | SmallInt | 2 |
| 5 | i32 | Int | 4 |
| 6 | i64或i | Bigint | 8 |
- t, T, true, True, TRUE, f, F, false, False 將直接作為 BOOL 型來處理。
例如(ru)如(ru)下數(shu)據(ju)行表(biao)示:向名為(wei)(wei) st 的(de)(de)(de)超級表(biao)下的(de)(de)(de) t1 標(biao)簽為(wei)(wei) "3"(NCHAR)、t2 標(biao)簽為(wei)(wei) "4"(NCHAR)、t3 標(biao)簽為(wei)(wei) "t3"(NCHAR)的(de)(de)(de)數(shu)據(ju)子表(biao),寫入 c1 列(lie)為(wei)(wei) 3(BIGINT)、c2 列(lie)為(wei)(wei) false(BOOL)、c3 列(lie)為(wei)(wei) "passit"(BINARY)、c4 列(lie)為(wei)(wei) 4(DOUBLE)、主鍵時間戳為(wei)(wei) 1626006833639000000 的(de)(de)(de)一行數(shu)據(ju)。
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000
需要注(zhu)意的是,如果描述(shu)數據(ju)類型后(hou)綴(zhui)時(shi)使(shi)用了錯(cuo)誤(wu)的大小寫,或者為數據(ju)指定(ding)的數據(ju)類型有(you)誤(wu),均可能引發(fa)報錯(cuo)提示而(er)導致(zhi)數據(ju)寫入失(shi)敗。
無模式寫入的主要處理邏輯
無模式寫入按照如下原則來處理行數據:
1. 將使(shi)用如(ru)下規則來生成子(zi)表(biao)名:首先(xian)將 measurement 的(de)名稱和(he)標簽的(de) key 和(he) value 組合成為如(ru)下的(de)字符串
"measurement,tag_key1=tag_value1,tag_key2=tag_value2"
需要注意的是,這里的 tag_key1, tag_key2 并不是用戶輸入的標簽的原始順序,而是使用了標簽名稱按照字符串升序排列后的結果。所以,tag_key1 并不是在行協議中輸入的第一個標簽。
排列完成以后計算該字符串的 MD5 散列值 "md5_val"。然后將計算的結果與字符串組合生成表名:“t_md5val”。其中的 “t” 是固定的前綴,每個通過該映射關系自動生成的表都具有該前綴。
2. 如果解析行協議獲得的超級表不存在,則會創建這個超級表。
3. 如果解析行協議獲得子表不存在,則 Schemaless 會按照步驟 1 或 2 確定的子表名來創建子表。
4. 如果數據行中指定的標簽列或普通列不存在,則在超級表中增加對應的標簽列或普通列(只增不減)。
5. 如果超級表中存在一些標簽列或普通列未在一個數據行中被指定取值,那么這些列的值在這一行中會被置為 NULL。
6. 對 BINARY 或 NCHAR 列,如果數據行中所提供值的長度超出了列類型的限制,自動增加該列允許存儲的字符長度上限(只增不減),以保證數據的完整保存。
7. 如果指定的數據子表已經存在,而且本次指定的標簽列取值跟已保存的值不一樣,那么最新的數據行中的值會覆蓋舊的標簽列取值。
8. 整個處(chu)理(li)過程中(zhong)(zhong)遇(yu)到的錯(cuo)誤(wu)會(hui)中(zhong)(zhong)斷寫入過程,并返回錯(cuo)誤(wu)代碼。
備注:
無模式所有的處理邏輯,仍會遵循 TDengine 對數據結構的底層限制,例如每行數據的總長度不能超過 48K 字節(2.1.7.0 之前的版本為 16K)。這方面的具體限制約束請參見 TAOS SQL 邊界限制 章節。
時間分辨率識別
無模式(shi)寫(xie)入(ru)過程中支持三個(ge)指定的模式(shi),具體如(ru)下(xia)
| 序號 | 值 | 說明 |
|---|---|---|
| 1 | SML_LINE_PROTOCOL | InfluxDB行協議(Line Protocol) |
| 2 | SML_TELNET_PROTOCOL | OpenTSDB 文本行協議 |
| 3 | SML_JSON_PROTOCOL | JSON 協議格式 |
在 SML_LINE_PROTOCOL 解析模式下,需要用戶指定輸入的時間戳的時間分辨率。可用的時間分辨率如下表所示:
| 序號 | 時間分辨率定義 | 含義 |
|---|---|---|
| 1 | TSDB_SML_TIMESTAMP_NOT_CONFIGURED | 未定義(無效) |
| 2 | TSDB_SML_TIMESTAMP_HOURS | 小時 |
| 3 | TSDB_SML_TIMESTAMP_MINUTES | 分鐘 |
| 4 | TSDB_SML_TIMESTAMP_SECONDS | 秒 |
| 5 | TSDB_SML_TIMESTAMP_MILLI_SECONDS | 毫秒 |
| 6 | TSDB_SML_TIMESTAMP_MICRO_SECONDS | 微秒 |
| 7 | TSDB_SML_TIMESTAMP_NANO_SECONDS | 納秒 |
在(zai) SML_TELNET_PROTOCOL 和 SML_JSON_PROTOCOL 模(mo)式下,根據時間戳(chuo)的長度來確定時間精度(與 OpenTSDB 標(biao)準操作方式相(xiang)同),此時會忽(hu)略用戶指定的時間分辨率。
數據模式映射規則
本節(jie)將(jiang)說明行(xing)協議的(de)數據(ju)如(ru)何映(ying)射成為(wei)具(ju)有(you)模(mo)式的(de)數據(ju)。每個行(xing)協議中(zhong)數據(ju) measurement 映(ying)射為(wei) 超級表名(ming)稱(cheng)。tag_set 中(zhong)的(de) 標簽名(ming)稱(cheng)為(wei) 數據(ju)模(mo)式中(zhong)的(de)標簽名(ming),field_set 中(zhong)的(de)名(ming)稱(cheng)為(wei)列名(ming)稱(cheng)。以如(ru)下數據(ju)為(wei)例,說明映(ying)射規(gui)則:
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000
該(gai)行(xing)數據(ju)映射(she)生成一個超級表: st, 其包含了(le) 3 個類型(xing)為 nchar 的標簽,分別是:t1, t2, t3。五個數據(ju)列,分別是ts(timestamp),c1 (bigint),c3(binary),c2 (bool), c4 (bigint)。映射(she)成為如下(xia) SQL 語句:
create stable st (_ts timestamp, c1 bigint, c2 bool, c3 binary(6), c4 bigint) tags(t1 nchar(1), t2 nchar(1), t3 nchar(2))
數據模式變更處理
本節將說明不同(tong)行數據(ju)(ju)寫入情況(kuang)下,對于數據(ju)(ju)模式(shi)的影響(xiang)。
在使用行協議寫入一個明(ming)確的(de)標識的(de)字段類(lei)型的(de)時候,后續更改(gai)該字段的(de)類(lei)型定義,會(hui)出現明(ming)確的(de)數據模式錯誤(wu)(wu),即(ji)會(hui)觸(chu)發(fa)寫入 API 報告(gao)錯誤(wu)(wu)。如下所示,
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4 1626006833639000000
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4i 1626006833640000000
第(di)一行(xing)的(de)數據類型映射將 c4 列定義為 Double, 但是(shi)第(di)二行(xing)的(de)數據又(you)通過(guo)數值(zhi)后(hou)綴方式(shi)聲明該列為 BigInt, 由此會(hui)觸發無模式(shi)寫(xie)入的(de)解析錯誤。
如果列前面的行協議將數(shu)據列聲明為(wei)了 binary, 后續的要求長(chang)度更長(chang)的binary長(chang)度,此時會觸發超級(ji)表模式的變更。
st,t1=3,t2=4,t3=t3 c1=3i64,c5="pass" 1626006833639000000
st,t1=3,t2=4,t3=t3 c1=3i64,c5="passit" 1626006833640000000
第一行(xing)中行(xing)協議解析(xi)會聲(sheng)明 c5 列是(shi)一個 binary(4)的字(zi)段,第二次行(xing)數據寫(xie)入會提取列 c5 仍然是(shi) binary 列,但是(shi)其寬(kuan)度(du)為 6,此時需要將binary的寬(kuan)度(du)增加到能夠容納(na) 新字(zi)符串(chuan)的寬(kuan)度(du)。
st,t1=3,t2=4,t3=t3 c1=3i64 1626006833639000000
st,t1=3,t2=4,t3=t3 c1=3i64,c6="passit" 1626006833640000000
第二行(xing)(xing)數據相對于第一行(xing)(xing)來說增加(jia)了一個(ge)列 c6,類型為 binary(6)。那么此時會(hui)自動(dong)增加(jia)一個(ge)列 c6, 類型為 binary(6)。
寫入完整性
TDengine 提供數據(ju)寫(xie)(xie)入(ru)(ru)(ru)的(de)冪(mi)等性保證,即(ji)您可以(yi)反復調用 API 進(jin)行出錯數據(ju)的(de)寫(xie)(xie)入(ru)(ru)(ru)操作。但是不提供多行數據(ju)寫(xie)(xie)入(ru)(ru)(ru)的(de)原(yuan)子性保證。即(ji)在多行數據(ju)一批次寫(xie)(xie)入(ru)(ru)(ru)過程中(zhong),會出現部分數據(ju)寫(xie)(xie)入(ru)(ru)(ru)成(cheng)功(gong),部分數據(ju)寫(xie)(xie)入(ru)(ru)(ru)失敗的(de)情況。
錯誤碼
如果是無模式寫入過程中的數據本身錯誤,應用會得到 TSDB_CODE_TSC_LINE_SYNTAX_ERROR 錯誤信息,該錯誤信息表明錯誤發生在寫入文本中。其他的錯誤碼與原系統一致,可以通過 taos_errstr() 獲取具體的錯誤原因。
除(chu)使用(yong) C 版(ban)本(ben)(ben)的(de) API,也可以使用(yong)官網連接器(qi),包括 Java/Go/Python/C#/Node.js/Rust 等。此外,在 TDengine v2.4 及后續版(ban)本(ben)(ben)中(zhong),您還可以通過 taosAdapter 采用(yong) RESTful 的(de)方式直接寫入(ru)無(wu)模式數據。
Prometheus 直接寫入(通過 taosAdapter)
remote_read 和(he) remote_write 是 Prometheus 數據讀寫分離的集群(qun)方案。 只需要將(jiang) remote_read 和(he) remote_write url 指向 taosAdapter 對應的 url 同時(shi)設置 Basic 驗證即可使用。
- remote_read url :
//host_to_taosAdapter:port(default 6041)/prometheus/v1/remote_read/:db - remote_write url :
//host_to_taosAdapter:port(default 6041)/prometheus/v1/remote_write/:db
Basic驗證:
- username: TDengine 連接用戶名
- password: TDengine 連接密碼
示例 prometheus.yml 如(ru)下:
remote_write:
- url: "//localhost:6041/prometheus/v1/remote_write/prometheus_data"
basic_auth:
username: root
password: taosdata
remote_read:
- url: "//localhost:6041/prometheus/v1/remote_read/prometheus_data"
basic_auth:
username: root
password: taosdata
remote_timeout: 10s
read_recent: true
Telegraf 直接寫入(通過 taosAdapter)
安裝 Telegraf 請參(can)考。
TDengine 新(xin)版本(2.3.0.0+)包(bao)含一個 taosAdapter 獨立程序(xu),負責接收包(bao)括 Telegraf 的多種應(ying)用的數據寫入(ru)。
配置方法(fa),在 /etc/telegraf/telegraf.conf 增加如(ru)下文字,其中 database name 請填(tian)寫希望在 TDengine 保存 Telegraf 數據的數據庫名(ming),TDengine server/cluster host、username和 password 填(tian)寫 TDengine 實際值:
[[outputs.http]]
url = "//<TDengine server/cluster host>:6041/influxdb/v1/write?db=<database name>"
method = "POST"
timeout = "5s"
username = "<TDengine's username>"
password = "<TDengine's password>"
data_format = "influx"
influx_max_line_bytes = 250
然(ran)后重(zhong)啟 telegraf:
sudo systemctl start telegraf
即可在 TDengine 中查詢 metrics 數(shu)據(ju)庫中 Telegraf 寫入的數(shu)據(ju)。
taosAdapter 相關配(pei)置參數(shu)請參考(kao) taosadapter --help 命(ming)令輸出以(yi)及相關文檔。
collectd 直接寫入(通過 taosAdapter)
安裝 collectd,請參考。
TDengine 新版本(2.3.0.0+)包(bao)含一個(ge) taosAdapter 獨立(li)程序(xu),負責接收包(bao)括 collectd 的多種應用(yong)的數據寫(xie)入(ru)。
在 /etc/collectd/collectd.conf 文件中(zhong)增加(jia)如下內容,其(qi)中(zhong) host 和(he) port 請填寫 TDengine 和(he) taosAdapter 配(pei)置的實(shi)際值:
LoadPlugin network
<Plugin network>
Server "<TDengine cluster/server host>" "<port for collectd>"
</Plugin>
重啟(qi) collectd
sudo systemctl start collectd
taosAdapter 相關(guan)配置參數請參考 taosadapter --help 命(ming)令輸(shu)出以及(ji)相關(guan)文檔。
StatsD 直接寫入(通過 taosAdapter)
安裝 StatsD 請參考。
TDengine 新版本(2.3.0.0+)包含一個 taosAdapter 獨(du)立程序,負責接收包括(kuo) StatsD 的多(duo)種(zhong)應用的數據寫入。
在 config.js 文件(jian)中增加如下內(nei)容(rong)后啟動 StatsD,其中 host 和 port 請填寫 TDengine 和 taosAdapter 配置的實(shi)際(ji)值:
backends 部分添加 "./backends/repeater"
repeater 部分添加 { host:'<TDengine server/cluster host>', port: <port for StatsD>}
示例配置文件:
{
port: 8125
, backends: ["./backends/repeater"]
, repeater: [{ host: '127.0.0.1', port: 6044}]
}
taosAdapter 相關配置參(can)數請參(can)考(kao) taosadapter --help 命令輸(shu)出以及(ji)相關文(wen)檔(dang)。
icinga2 可(ke)以收(shou)集監控和性能(neng)數(shu)據并(bing)寫入(ru) OpenTSDB,taosAdapter 可(ke)以支持接收(shou) icinga2 的數(shu)據并(bing)寫入(ru)到 TDengine 中(zhong)。
icinga2 直接寫入(通過 taosAdapter)
- 參考鏈接
//icinga.com/docs/icinga-2/latest/doc/14-features/#opentsdb-writer使能 opentsdb-writer - 使能 taosAdapter 配置項 opentsdb_telnet.enable
- 修改配置文件 /etc/icinga2/features-enabled/opentsdb.conf
object OpenTsdbWriter "opentsdb" {
host = "host to taosAdapter"
port = 6048
}
taosAdapter 相關(guan)配置參數請參考(kao) taosadapter --help 命令(ling)輸出以(yi)及相關(guan)文檔。
TCollector 直接寫入(通過 taosAdapter)
TCollector 是一(yi)個在(zai)客戶側(ce)收(shou)集本地收(shou)集器并發送數據(ju)(ju)到(dao) OpenTSDB 的進(jin)程,taosAdapter 可以(yi)支持接收(shou) TCollector 的數據(ju)(ju)并寫入到(dao) TDengine 中。
使能(neng) taosAdapter 配置項 opentsdb_telnet.enable 修改 TCollector 配置文(wen)件,修改 OpenTSDB 宿(su)主機地址為(wei) taosAdapter 被部署的地址,并修改端(duan)口號(hao)為(wei) taosAdapter 使用的端(duan)口(默認6049)。
taosAdapter 相(xiang)關配(pei)置參數請參考 taosadapter --help 命令輸出(chu)以(yi)及相(xiang)關文檔。
EMQX Broker 直接寫入
MQTT 是(shi)流行的(de)物聯網數(shu)(shu)(shu)據(ju)傳輸協議, 是(shi)一開(kai)源的(de) MQTT Broker 軟件,無需(xu)任何代(dai)碼,只需(xu)要(yao)在 EMQX Dashboard 里使用(yong)“規則”做(zuo)簡單配置,即可將(jiang) MQTT 的(de)數(shu)(shu)(shu)據(ju)直接寫入 TDengine。EMQX 支持通過 發送到 Web 服務的(de)方(fang)式保存數(shu)(shu)(shu)據(ju)到 TDengine,也在企業版(ban)上提供原生的(de) TDengine 驅動實(shi)現(xian)直接保存。詳細使用(yong)方(fang)法請(qing)參(can)考 。
HiveMQ Broker 直接寫入
是一個提供免(mian)費個人版和(he)企業版的 MQTT 代理(li),主要用于企業和(he)新(xin)興的機(ji)器到機(ji)器M2M通(tong)訊(xun)和(he)內部(bu)傳輸,滿(man)足可伸縮(suo)性、易管理(li)和(he)安(an)全特性。HiveMQ 提供了開源(yuan)的插件開發包。可以通(tong)過 HiveMQ extension - TDengine 保存數據到 TDengine。詳細使用方法(fa)請參考 。

