在物聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)采集項的頻繁變化是一個普遍挑戰(zhàn)。設(shè)備硬件升級、應(yīng)用邏輯迭代等因素都可能導(dǎo)致數(shù)據(jù)結(jié)構(gòu)變化。時序數(shù)據(jù)庫的無模式寫入功能正是為解決這一痛點而設(shè)計的,它能夠大幅簡化時序數(shù)據(jù)庫的數(shù)據(jù)記錄流程,降低運維成本。
為什么需要無模式寫入
物聯(lián)網(wǎng)應(yīng)用通常需要采集大量數(shù)據(jù)項,以實現(xiàn)自動化管理、業(yè)務(wù)分析和設(shè)備監(jiān)控等功能。然而,應(yīng)用邏輯升級和設(shè)備硬件調(diào)整等原因,可能導(dǎo)致數(shù)據(jù)采集項頻繁變化。
在傳統(tǒng)的數(shù)據(jù)庫操作模式下,每次數(shù)據(jù)結(jié)構(gòu)變更都需要手動執(zhí)行DDL語句修改表結(jié)構(gòu)。設(shè)備數(shù)量達(dá)到成千上萬級別時,這種手動管理方式效率低下且容易出錯。時序數(shù)據(jù)庫提供的無模式寫入方式,讓開發(fā)者無需預(yù)先創(chuàng)建超級表或子表,時序數(shù)據(jù)庫會根據(jù)實際寫入的數(shù)據(jù)自動創(chuàng)建相應(yīng)的存儲結(jié)構(gòu)。
無模式寫入的核心機制
無模式寫入的核心思想是”數(shù)據(jù)驅(qū)動結(jié)構(gòu)”。數(shù)據(jù)寫入時,時序數(shù)據(jù)庫會自動完成以下工作:
- 自動創(chuàng)建超級表:如果目標(biāo)超級表不存在,時序數(shù)據(jù)庫會根據(jù)寫入數(shù)據(jù)自動創(chuàng)建
- 自動創(chuàng)建子表:如果目標(biāo)子表不存在,時序數(shù)據(jù)庫會自動創(chuàng)建
- 自動添加列:寫入數(shù)據(jù)包含新列時,時序數(shù)據(jù)庫會自動增加(只增不減)
- 自動擴展列長度:BINARY或NCHAR列數(shù)據(jù)超出預(yù)設(shè)限制時,時序數(shù)據(jù)庫會自動擴展
這種自動化的處理機制使得開發(fā)者可以專注于業(yè)務(wù)邏輯,無需關(guān)心時序數(shù)據(jù)庫底層的表結(jié)構(gòu)維護(hù)。
行協(xié)議格式詳解
時序數(shù)據(jù)庫的無模式寫入行協(xié)議兼容InfluxDB的行協(xié)議、OpenTSDB的TELNET行協(xié)議和OpenTSDB的JSON格式協(xié)議。其中,InfluxDB行協(xié)議是時序數(shù)據(jù)庫中最常用的格式:
measurement,tag_set field_set timestamp
各部分的含義如下:
- measurement:數(shù)據(jù)表名,對應(yīng)時序數(shù)據(jù)庫中的子表
- tag_set:標(biāo)簽列數(shù)據(jù),用于標(biāo)識時序數(shù)據(jù)庫中的數(shù)據(jù)來源
- field_set:普通數(shù)據(jù)列
- timestamp:主鍵時間戳
以下是一個行協(xié)議示例,展示了時序數(shù)據(jù)庫如何解析無模式寫入數(shù)據(jù):
meters,location=California.SanFrancisco,groupId=2 current=10.3,voltage=219,phase=0.31 1648432611249
在這個示例中,meters是measurement名稱,location和groupId是標(biāo)簽,current、voltage和phase是數(shù)據(jù)字段,最后是毫秒級時間戳。時序數(shù)據(jù)庫會自動解析這些信息并創(chuàng)建對應(yīng)的存儲結(jié)構(gòu)。
無模式寫入的處理規(guī)則
時序數(shù)據(jù)庫在處理無模式寫入請求時,遵循以下規(guī)則:
規(guī)則一:子表名自動生成。 通過measurement名稱和標(biāo)簽組合計算MD5散列值,前綴為”t_”。
規(guī)則二:超級表自動創(chuàng)建。 如果超級表不存在,時序數(shù)據(jù)庫會根據(jù)首次寫入數(shù)據(jù)自動創(chuàng)建。
規(guī)則三:子表自動創(chuàng)建。 如果子表不存在,時序數(shù)據(jù)庫會自動創(chuàng)建并關(guān)聯(lián)到對應(yīng)的超級表。
規(guī)則四:列自動增加。 寫入數(shù)據(jù)包含新列時,時序數(shù)據(jù)庫會自動添加,但列只能增加不能減少。
規(guī)則五:列長度自動擴展。 BINARY或NCHAR列數(shù)據(jù)超出預(yù)設(shè)長度時,時序數(shù)據(jù)庫會自動擴展。
協(xié)議兼容性
時序數(shù)據(jù)庫的無模式寫入支持三種主流協(xié)議格式:
InfluxDB行協(xié)議: 語法簡潔,可讀性好。如果團(tuán)隊之前使用InfluxDB,可以幾乎零成本地遷移到時序數(shù)據(jù)庫。
OpenTSDB TELNET行協(xié)議: 兼容OpenTSDB的數(shù)據(jù)格式,適合從OpenTSDB遷移到時序數(shù)據(jù)庫的場景。
OpenTSDB JSON格式協(xié)議: 以JSON格式傳輸數(shù)據(jù),適合結(jié)構(gòu)化數(shù)據(jù)傳輸場景。
這種多協(xié)議兼容的設(shè)計,使得時序數(shù)據(jù)庫能無縫接入現(xiàn)有物聯(lián)網(wǎng)數(shù)據(jù)采集體系。
數(shù)據(jù)一致性保證
在使用無模式寫入時,需了解以下一致性特性:
冪等性保證: 時序數(shù)據(jù)庫提供數(shù)據(jù)寫入的冪等性保證,相同的寫入請求重復(fù)執(zhí)行不會產(chǎn)生重復(fù)數(shù)據(jù)。
非原子性: 時序數(shù)據(jù)庫的無模式寫入不提供多行寫入的原子性保證,部分行可能寫入成功而部分失敗。開發(fā)者需在應(yīng)用層做好錯誤處理和重試機制。
物聯(lián)網(wǎng)場景最佳實踐
在物聯(lián)網(wǎng)數(shù)據(jù)采集場景中,使用無模式寫入時建議遵循以下實踐:
合理設(shè)計標(biāo)簽: 標(biāo)簽是時序數(shù)據(jù)庫中數(shù)據(jù)分區(qū)的基礎(chǔ)。建議將設(shè)備標(biāo)識、地理位置等元信息作為標(biāo)簽,將采集值作為數(shù)據(jù)列。
關(guān)注列擴展策略: 雖然時序數(shù)據(jù)庫支持自動添加列,但頻繁的列變更可能影響寫入性能。建議在設(shè)備上線前確定完整的數(shù)據(jù)采集項列表。
利用協(xié)議兼容性: 如果現(xiàn)有系統(tǒng)已使用InfluxDB或OpenTSDB,可直接復(fù)用原有寫入邏輯,快速接入時序數(shù)據(jù)庫。
處理寫入失?。?/strong> 由于時序數(shù)據(jù)庫的多行寫入不保證原子性,建議在應(yīng)用層實現(xiàn)寫入結(jié)果的檢查和重試機制。
總結(jié)
無模式寫入是時序數(shù)據(jù)庫面向物聯(lián)網(wǎng)場景的重要特性。它通過自動建表、自動添加列等機制,大幅簡化了時序數(shù)據(jù)庫中的數(shù)據(jù)采集流程。TDengine在無模式寫入方面的設(shè)計,為海量設(shè)備的數(shù)據(jù)接入時序數(shù)據(jù)庫提供了高效且靈活的解決方案。



互聯(lián)網(wǎng).png)



-1.png)







證.png)


伙伴.png)
伙伴.png)
伙伴.png)



