本文介紹Lindorm時(shí)序引擎數(shù)據(jù)建模的過程。

創(chuàng)建時(shí)序數(shù)據(jù)庫

Lindorm實(shí)例創(chuàng)建成功后,系統(tǒng)會(huì)默認(rèn)創(chuàng)建default數(shù)據(jù)庫,將數(shù)據(jù)默認(rèn)寫入該數(shù)據(jù)庫,您無法刪除default數(shù)據(jù)庫。時(shí)序引擎也支持創(chuàng)建多個(gè)數(shù)據(jù)庫,不同的數(shù)據(jù)庫在存儲(chǔ)層面進(jìn)行物理隔離,支持設(shè)置不同的數(shù)據(jù)有效期(TTL)、時(shí)間分區(qū)和冷熱存儲(chǔ)分界線。創(chuàng)建數(shù)據(jù)庫的具體操作,請(qǐng)參見CREATE DATABASE

示例

  • 創(chuàng)建一個(gè)名為DB1的數(shù)據(jù)庫,設(shè)置數(shù)據(jù)為不過期。
    CREATE DATABASE DB1;
  • 創(chuàng)建一個(gè)名為DB2的數(shù)據(jù)庫,設(shè)置TTL為60天。
    CREATE DATABASE DB2 WITH (ttl=60);
  • 創(chuàng)建一個(gè)名為DB3的數(shù)據(jù)庫,設(shè)置TTL為60天,冷存周期為30天。
    CREATE DATABASE DB3 WITH (cold_boundary=30, ttl=60);

時(shí)間分區(qū)

時(shí)間分區(qū)會(huì)按照時(shí)間維度進(jìn)行數(shù)據(jù)分區(qū)存儲(chǔ),存儲(chǔ)底層會(huì)將不同時(shí)間分區(qū)內(nèi)的數(shù)據(jù)進(jìn)行分段存儲(chǔ),一個(gè)時(shí)間分區(qū)內(nèi)的數(shù)據(jù)包含時(shí)間線索引和時(shí)序數(shù)據(jù)。時(shí)序引擎支持在數(shù)據(jù)庫設(shè)置時(shí)間分區(qū),一般情況下,如果創(chuàng)建周期性時(shí)間線導(dǎo)致了時(shí)間線膨脹,建議您開啟時(shí)間分區(qū)來避免同一個(gè)分區(qū)出現(xiàn)大量索引膨脹。時(shí)間分區(qū)不建議設(shè)置的過小,默認(rèn)時(shí)長為30天。具體操作,請(qǐng)參見CREATE DATABASE

示例

  • 創(chuàng)建一個(gè)名為DB4的數(shù)據(jù)庫,設(shè)置時(shí)間分區(qū)為60天。
    CREATE DATABASE DB4 WITH (partition_interval=60);
  • 對(duì)于已經(jīng)創(chuàng)建的數(shù)據(jù)庫,可以通過修改數(shù)據(jù)庫參數(shù)partition_interval的方式設(shè)置時(shí)間分區(qū)。但是目前需要等到下次分區(qū)自動(dòng)切換時(shí),修改后的時(shí)間分區(qū)才會(huì)生效,對(duì)于已經(jīng)創(chuàng)建的分區(qū)無法生效。
    ALTER DATABASE DB4 WITH (partition_interval=60);

冷熱存儲(chǔ)分界線

Lindorm時(shí)序引擎支持?jǐn)?shù)據(jù)的冷熱分層存儲(chǔ),但需要先開通冷存儲(chǔ),具體操作,請(qǐng)參見開通冷存儲(chǔ)。時(shí)序引擎支持在數(shù)據(jù)庫設(shè)置冷熱分層分界線,分界線設(shè)置完成后,分界線之前的數(shù)據(jù)會(huì)異步轉(zhuǎn)移到更低成本的存儲(chǔ)介質(zhì),需要等待數(shù)據(jù)轉(zhuǎn)移完成后冷存空間才會(huì)發(fā)生變化。

注意 已經(jīng)轉(zhuǎn)移至冷存儲(chǔ)的數(shù)據(jù)無法再轉(zhuǎn)移至熱存儲(chǔ)。

示例

  • 創(chuàng)建一個(gè)名為DB5的數(shù)據(jù)庫,設(shè)置冷熱存儲(chǔ)分界線為30天,即30天之前的數(shù)據(jù)會(huì)被轉(zhuǎn)移到冷存儲(chǔ)。
    CREATE DATABASE DB5 WITH (cold_boundary=30);
  • 對(duì)于已經(jīng)創(chuàng)建的數(shù)據(jù)庫,可以通過修改數(shù)據(jù)庫參數(shù)cold_boundary的方式設(shè)置冷熱存儲(chǔ)分界線。
    ALTER DATABASE DB5 WITH (cold_boundary=30);

自動(dòng)建表

Lindorm時(shí)序引擎提供三種Schema約束策略,分別是強(qiáng)約束、弱約束、無約束。通過Java Native SDK寫入數(shù)據(jù)和通過行協(xié)議寫入數(shù)據(jù)時(shí)可以指定Schema約束策略,更多信息,請(qǐng)參見關(guān)于時(shí)序數(shù)據(jù)的Schema約束。在弱約束條件下,寫入數(shù)據(jù)的表或者列不存在時(shí),時(shí)序引擎會(huì)自動(dòng)創(chuàng)建,并對(duì)已經(jīng)存在的列進(jìn)行數(shù)據(jù)類型校驗(yàn)。

創(chuàng)建時(shí)序數(shù)據(jù)表

創(chuàng)建時(shí)序數(shù)據(jù)表之前,需要先根據(jù)業(yè)務(wù)場景構(gòu)建數(shù)據(jù)模型,相關(guān)內(nèi)容,請(qǐng)參見數(shù)據(jù)模型如何設(shè)計(jì)時(shí)序數(shù)據(jù)表

時(shí)序引擎會(huì)創(chuàng)建倒排索引,在查詢數(shù)據(jù)時(shí),tag用來快速匹配時(shí)間線。除此以外,可以使用PRIMARY KEY來標(biāo)識(shí)分片鍵,通常建議選擇數(shù)據(jù)源的唯一標(biāo)識(shí)作為PRIMARY KEY,例如物聯(lián)網(wǎng)場景設(shè)備ID。時(shí)序引擎會(huì)根據(jù)分片鍵對(duì)數(shù)據(jù)進(jìn)行分片,然后路由到不同的后端節(jié)點(diǎn)進(jìn)行存儲(chǔ),查詢時(shí)如果查詢條件命中分片鍵,則直接查詢指定節(jié)點(diǎn)。

示例

  • 創(chuàng)建傳感器表。
    CREATE TABLE sensor (
        device_id VARCHAR TAG,
        region VARCHAR TAG,
        time   TIMESTAMP,
        temperature DOUBLE,
        humidity DOUBLE);
  • 創(chuàng)建傳感器表,并指定device_id作為分片鍵。
    CREATE TABLE sensor (
        device_id VARCHAR TAG,
        region VARCHAR TAG,
        time   TIMESTAMP,
        temperature DOUBLE,
        humidity DOUBLE,
        PRIMARY KEY(device_id));

單值模型與多值模型

使用OpenTSDB協(xié)議或時(shí)間序列數(shù)據(jù)庫TSDB接口單值寫入的數(shù)據(jù)為單值模型,目前不支持建表和SQL訪問。時(shí)序引擎底層數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)了對(duì)多值模型數(shù)據(jù)的存儲(chǔ)優(yōu)化,建議您將單值模型更改為多值模型,讓數(shù)據(jù)讀取更加高效。