物聯(lián)網(wǎng)應(yīng)用的核心挑戰(zhàn)在于如何高效管理海量設(shè)備產(chǎn)生的時序數(shù)據(jù)。作為專為時序數(shù)據(jù)設(shè)計的時序數(shù)據(jù)庫,能夠天然適配物聯(lián)網(wǎng)場景下的數(shù)據(jù)特征。合理的建模和寫入策略,直接決定了時序數(shù)據(jù)庫的性能表現(xiàn)和可維護(hù)性。本文將圍繞時序數(shù)據(jù)庫在物聯(lián)網(wǎng)場景中的實(shí)踐,詳細(xì)介紹數(shù)據(jù)模型設(shè)計和寫入方式的選擇方法。
物聯(lián)網(wǎng)數(shù)據(jù)的特征分析
在物聯(lián)網(wǎng)場景中,數(shù)據(jù)通常具有以下特征:大量設(shè)備持續(xù)產(chǎn)生數(shù)據(jù)、每條數(shù)據(jù)都帶有時間戳、設(shè)備元信息相對固定而采集值不斷變化。這些特征正是時序數(shù)據(jù)庫所擅長處理的場景。
在開始建模之前,需要根據(jù)數(shù)據(jù)特征決定建立一個還是多個庫。如果不同類型設(shè)備的數(shù)據(jù)結(jié)構(gòu)差異較大,或者需要獨(dú)立的保留策略,時序數(shù)據(jù)庫支持分庫存儲,便于獨(dú)立管理。
超級表的設(shè)計原則
超級表是時序數(shù)據(jù)庫數(shù)據(jù)模型的核心概念,它定義了一類設(shè)備的通用數(shù)據(jù)結(jié)構(gòu)。設(shè)計超級表時,最關(guān)鍵的一步是分清靜態(tài)標(biāo)簽和采集量。
- 靜態(tài)標(biāo)簽:描述設(shè)備的固有屬性,如設(shè)備分組、安裝位置等,數(shù)據(jù)寫入后不再變化
- 采集量:隨時間不斷變化的測量值,如電流、電壓、相位等
以電力監(jiān)控場景為例,可以設(shè)計如下超級表:
CREATE STABLE IF NOT EXISTS power.meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
phase FLOAT
) TAGS (groupId INT, location BINARY(24))
在這個結(jié)構(gòu)中:
ts TIMESTAMP是時間戳列,每張表必須有,作為數(shù)據(jù)的時序索引current FLOAT、voltage INT、phase FLOAT是采集量,記錄設(shè)備的實(shí)時測量數(shù)據(jù)groupId INT、location BINARY(24)是靜態(tài)標(biāo)簽,標(biāo)識設(shè)備所屬的分組和安裝位置
子表的創(chuàng)建方式
每個數(shù)據(jù)采集點(diǎn)對應(yīng)一張子表,子表繼承超級表的結(jié)構(gòu)并攜帶具體的標(biāo)簽值。時序數(shù)據(jù)庫提供了自動建表語法,可以在寫入數(shù)據(jù)的同時創(chuàng)建子表:
INSERT INTO power.d1001 USING power.meters TAGS(2,'California.SanFrancisco')
VALUES (NOW + 1a, 10.30000, 219, 0.31000)
這條語句的含義是:使用 power.meters 超級表的結(jié)構(gòu),創(chuàng)建名為 power.d1001 的子表,標(biāo)簽 groupId 設(shè)為 2,location 設(shè)為 California.SanFrancisco,并寫入一條采集數(shù)據(jù)。
自動建表語法極大地簡化了物聯(lián)網(wǎng)場景中的表管理工作。在設(shè)備數(shù)量龐大時,時序數(shù)據(jù)庫無需預(yù)先為每個設(shè)備創(chuàng)建子表,而是在數(shù)據(jù)首次寫入時自動完成建表操作。
寫入方式的選擇策略
時序數(shù)據(jù)庫提供了兩種主要的寫入方式,適用于不同的物聯(lián)網(wǎng)場景。
標(biāo)準(zhǔn)SQL寫入
標(biāo)準(zhǔn)SQL寫入使用INSERT語句,適合數(shù)據(jù)格式已知、表結(jié)構(gòu)預(yù)先定義的場景。它支持單條寫入和批量寫入,配合自動建表語法可以靈活處理新設(shè)備的接入。時序數(shù)據(jù)庫還支持參數(shù)綁定寫入,通過預(yù)編譯SQL避免重復(fù)解析開銷,進(jìn)一步提升寫入效率。
對于大規(guī)模數(shù)據(jù)采集場景,還可以啟用高效寫入模式。連接器將自動創(chuàng)建寫入線程與專屬隊列,將數(shù)據(jù)按子表切分緩存,在達(dá)到數(shù)據(jù)量閾值或超時條件時批量發(fā)送,以此減少網(wǎng)絡(luò)請求、提升吞吐量。
Schemaless模式寫入
Schemaless模式無需預(yù)先建表,直接寫入數(shù)據(jù),時序數(shù)據(jù)庫會自動解析數(shù)據(jù)并創(chuàng)建對應(yīng)的表結(jié)構(gòu)。該模式兼容InfluxDB行協(xié)議、OpenTSDB的TELNET行協(xié)議和JSON格式協(xié)議,適合數(shù)據(jù)格式不固定或需要快速原型開發(fā)的場景。
寫入性能優(yōu)化建議
在物聯(lián)網(wǎng)場景中,寫入性能往往是系統(tǒng)瓶頸。以下是基于時序數(shù)據(jù)庫特性的優(yōu)化建議:
合理配置批量參數(shù):通過調(diào)整批大小和緩存大小參數(shù),可以在內(nèi)存占用和吞吐量之間取得平衡。時序數(shù)據(jù)庫默認(rèn)的批大小為1000行,緩存大小為10000行,適合大多數(shù)中等規(guī)模的物聯(lián)網(wǎng)應(yīng)用。
利用多線程寫入:時序數(shù)據(jù)庫的寫入能力與寫入線程數(shù)配置呈線性相關(guān)。對于高并發(fā)場景,可以適當(dāng)增加后臺寫入線程數(shù),每個寫入線程擁有獨(dú)占的固定大小的消息隊列。
啟用自動重連:在物聯(lián)網(wǎng)環(huán)境中,網(wǎng)絡(luò)波動較為常見。建議開啟自動重連功能,并配置合理的重試間隔和重試次數(shù),確保數(shù)據(jù)寫入的可靠性。
數(shù)據(jù)訂閱與消費(fèi)
物聯(lián)網(wǎng)平臺通常需要將采集數(shù)據(jù)實(shí)時推送到下游系統(tǒng)。時序數(shù)據(jù)庫提供了內(nèi)置的數(shù)據(jù)訂閱功能,支持創(chuàng)建主題和消費(fèi)組,能夠替代傳統(tǒng)的消息隊列產(chǎn)品。采用時序數(shù)據(jù)庫的原生訂閱能力,不僅簡化了系統(tǒng)架構(gòu),也降低了運(yùn)維成本。
總結(jié)
在物聯(lián)網(wǎng)場景中,時序數(shù)據(jù)庫的數(shù)據(jù)建模關(guān)鍵在于正確劃分靜態(tài)標(biāo)簽和采集量,利用超級表和子表的層次結(jié)構(gòu)管理海量設(shè)備數(shù)據(jù)。配合自動建表語法和高效寫入模式,時序數(shù)據(jù)庫能夠?qū)崿F(xiàn)從設(shè)備接入到數(shù)據(jù)存儲的全流程優(yōu)化。如果你正在為物聯(lián)網(wǎng)項目選型,TDengine提供了從建模到寫入的一站式解決方案。



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



-1.png)







證.png)


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



