在上一篇文章中,我們介紹了運(yùn)維監(jiān)控場(chǎng)景下,如何從OpenTSDB遷移到TDengine。
如果應(yīng)用特別復(fù)雜,或者應(yīng)用領(lǐng)域并不是運(yùn)維監(jiān)控場(chǎng)景,本文將更加全面深入地介紹將OpenTSDB應(yīng)用遷移到TDengine的高級(jí)話題。
其他場(chǎng)景的遷移評(píng)估與策略
1、TDengine 與 OpenTSDB 的差異
本節(jié)將詳細(xì)介紹OpenTSDB與TDengine在系統(tǒng)功能層面上存在的差異。
讀完本節(jié)之后,你可以全面地評(píng)估是否能將某些基于OpenTSDB的復(fù)雜應(yīng)用遷移到TDengine上,以及遷移之后應(yīng)該注意的問(wèn)題。
TDengine Database當(dāng)前只支持Grafana的可視化看板呈現(xiàn),所以如果應(yīng)用中使用的是其他看板(例如TSDash、Status Wolf等),那么暫時(shí)無(wú)法直接遷移到TDengine,需要將其重新適配到Grafana才可以正常運(yùn)行。
截止到2.3.0.x 版本,TDengine Database只能夠支持collectd和StatsD作為數(shù)據(jù)收集匯聚軟件,當(dāng)然后面會(huì)陸續(xù)提供更多的數(shù)據(jù)收集聚合軟件的接入支持。如果收集端使用了其他類(lèi)型的數(shù)據(jù)匯聚器,則需要適配到這兩個(gè)數(shù)據(jù)匯聚端系統(tǒng),才能正常寫(xiě)入。除了上述兩個(gè)數(shù)據(jù)匯聚端軟件協(xié)議以外,TDengine還支持通過(guò) InfluxDB的行協(xié)議和OpenTSDB的數(shù)據(jù)寫(xiě)入?yún)f(xié)議、Json格式將數(shù)據(jù)直接寫(xiě)入,可以重寫(xiě)數(shù)據(jù)推送端的邏輯,使用TDengine支持的行協(xié)議來(lái)寫(xiě)入數(shù)據(jù)。
此外,如果應(yīng)用中使用了OpenTSDB的以下特性,在遷移之前還需要了解以下注意事項(xiàng):
/api/stats:如果應(yīng)用中使用了該項(xiàng)特性來(lái)監(jiān)控OpenTSDB的服務(wù)狀態(tài),并在應(yīng)用中建立了相關(guān)的邏輯來(lái)聯(lián)動(dòng)處理,那么這部分狀態(tài)讀取和獲取的邏輯需要重新適配到TDengine。TDengine提供了全新的處理集群狀態(tài)監(jiān)控機(jī)制,來(lái)滿(mǎn)足應(yīng)用對(duì)其進(jìn)行的監(jiān)控和維護(hù)的需求。-
/api/tree:如果依賴(lài)于OpenTSDB的該項(xiàng)特性來(lái)進(jìn)行時(shí)間線的層級(jí)化組織和維護(hù),那么便無(wú)法將其直接遷移至TDengine。TDengine采用了數(shù)據(jù)庫(kù)->超級(jí)表->子表這樣的層級(jí)來(lái)組織和維護(hù)時(shí)間線,歸屬于同一個(gè)超級(jí)表的所有的時(shí)間線在系統(tǒng)中同一個(gè)層級(jí),但是可以通過(guò)不同標(biāo)簽值的特殊構(gòu)造來(lái)模擬應(yīng)用邏輯上的多級(jí)結(jié)構(gòu)。 Rollup And PreAggregates:采用了Rollup和PreAggregates,需要應(yīng)用來(lái)決定在合適的地方訪問(wèn)Rollup的結(jié)果,在某些場(chǎng)景下又要訪問(wèn)原始的結(jié)果,這種結(jié)構(gòu)的不透明性讓?xiě)?yīng)用處理邏輯變得極為復(fù)雜而且完全不具有移植性。我們認(rèn)為這種策略是時(shí)序數(shù)據(jù)庫(kù)無(wú)法提供高性能聚合情況下的妥協(xié)與折中。TDengine暫不支持多個(gè)時(shí)間線的自動(dòng)降采樣和(時(shí)間段范圍的)預(yù)聚合,由于 其擁有的高性能查詢(xún)處理邏輯,即使不依賴(lài)于Rollup 和 (時(shí)間段)預(yù)聚合計(jì)算結(jié)果,也能夠提供很高性能的查詢(xún)響應(yīng),而且讓你的應(yīng)用查詢(xún)處理邏輯更加簡(jiǎn)單。Rate: TDengine提供了兩個(gè)計(jì)算數(shù)值變化率的函數(shù),分別是Derivative(其計(jì)算結(jié)果與InfluxDB的Derivative行為一致)和IRate(其計(jì)算結(jié)果與Prometheus中的IRate函數(shù)計(jì)算結(jié)果一致)。但是這兩個(gè)函數(shù)的計(jì)算結(jié)果與 Rate 有細(xì)微的差別,但整體上功能更強(qiáng)大。此外,OpenTSDB提供的所有計(jì)算函數(shù),TDengine 均有對(duì)應(yīng)的查詢(xún)函數(shù)支持,并且TDengine的查詢(xún)函數(shù)功能遠(yuǎn)超過(guò)OpenTSDB支持的查詢(xún)函數(shù),可以極大地簡(jiǎn)化應(yīng)用處理邏輯。
通過(guò)上面的介紹,相信你應(yīng)該能夠了解OpenTSDB遷移到TDengine帶來(lái)的變化,這些信息也有助于你正確地判斷是否可以接受將應(yīng)用遷移到TDengine之上,體驗(yàn)TDengine提供的強(qiáng)大的時(shí)序數(shù)據(jù)處理能力。
2、遷移策略
首先將基于OpenTSDB的系統(tǒng)進(jìn)行遷移涉及到的數(shù)據(jù)模式設(shè)計(jì)、系統(tǒng)規(guī)模估算、數(shù)據(jù)寫(xiě)入端改造,進(jìn)行數(shù)據(jù)分流、應(yīng)用適配工作;之后將兩個(gè)系統(tǒng)并行運(yùn)行一段時(shí)間,再將歷史數(shù)據(jù)遷移到 TDengine 中。當(dāng)然如果你的應(yīng)用中有部分功能強(qiáng)依賴(lài)于上述OpenTSDB特性,同時(shí)又不希望停止使用,可以考慮保持原有的OpenTSDB系統(tǒng)運(yùn)行,同時(shí)啟動(dòng) TDengine來(lái)提供主要的服務(wù)。
數(shù)據(jù)模型設(shè)計(jì)
一方面,TDengine 要求其入庫(kù)的數(shù)據(jù)具有嚴(yán)格的模式定義。另一方面,TDengine 的數(shù)據(jù)模型相對(duì)于 OpenTSDB 來(lái)說(shuō)又更加豐富,多值模型能夠兼容全部的單值模型的建立需求。 現(xiàn)在讓我們假設(shè)一個(gè)運(yùn)維監(jiān)控場(chǎng)景,我們使用了collectd收集設(shè)備的基礎(chǔ)度量(metrics),包含了 memory、swap和disk 等幾個(gè)度量,其在 OpenTSDB 中的模式如下:
| 序號(hào) | 測(cè)量(metric) | 值名稱(chēng) | 類(lèi)型 | tag1 | tag2 | tag3 | tag4 | tag5 |
| 1 | memory | value | double | host | memory_type | memory_type_instance | source | |
| 2 | swap | value | double | host | swap_type | swap_type_instance | source | |
| 3 | disk | value | double | host | disk_point | disk_instance | disk_type | source |
TDengine要求存儲(chǔ)的數(shù)據(jù)具有數(shù)據(jù)模式,即寫(xiě)入數(shù)據(jù)之前需創(chuàng)建超級(jí)表并指定超級(jí)表的模式。對(duì)于數(shù)據(jù)模式的建立,有兩種方式來(lái)完成此項(xiàng)工作:
1)充分利用TDengine對(duì)OpenTSDB的數(shù)據(jù)原生寫(xiě)入的支持,調(diào)用TDengine提供的API將(文本行或 JSON 格式)數(shù)據(jù)寫(xiě)入,并自動(dòng)化地建立單值模型。采用這種方式不需要對(duì)數(shù)據(jù)寫(xiě)入應(yīng)用進(jìn)行較大的調(diào)整,也不需要對(duì)寫(xiě)入的數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換。 在C語(yǔ)言層面,TDengine提供了taos_insert_lines來(lái)直接寫(xiě)入OpenTSDB格式的數(shù)據(jù)(在2.3.x 版本中該函數(shù)對(duì)應(yīng)的是 taos_schemaless_insert )。其代碼參考示例請(qǐng)參見(jiàn)安裝包目錄下示例代碼 schemaless.c。
2)在充分理解TDengine數(shù)據(jù)模型的基礎(chǔ)上,結(jié)合生成數(shù)據(jù)的特點(diǎn),手動(dòng)建立OpenTSDB到TDengine的數(shù)據(jù)模型調(diào)整的映射關(guān)系。TDengine能夠支持多值模型和單值模型,考慮到OpenTSDB均為單值映射模型,這里推薦使用單值模型在TDengine中進(jìn)行建模。
- 單值模型
具體步驟如下:將度量(metrics)的名稱(chēng)作為 TDengine 超級(jí)表的名稱(chēng),該超級(jí)表建成后具有兩個(gè)基礎(chǔ)的數(shù)據(jù)列—時(shí)間戳(timestamp)和值(value),超級(jí)表的標(biāo)簽等效于 度量 的標(biāo)簽信息,標(biāo)簽數(shù)量等同于度量 的標(biāo)簽的數(shù)量。子表的表名采用具有固定規(guī)則的方式進(jìn)行命名:metric + '_' + tags1_value + '_' + tag2_value + '_' + tag3_value ... 作為子表名稱(chēng)。
在TDengine中建立3個(gè)超級(jí)表:
create stable memory(ts timestamp, val float) tags(host binary(12),memory_type binary(20), memory_type_instance binary(20), source binary(20));
create stable swap(ts timestamp, val double) tags(host binary(12), swap_type binary(20), swap_type_binary binary(20), source binary(20));
create stable disk(ts timestamp, val double) tags(host binary(12), disk_point binary(20), disk_instance binary(20), disk_type binary(20), source binary(20));
對(duì)于子表使用動(dòng)態(tài)建表的方式創(chuàng)建如下所示:
insert into memory_vm130_memory_bufferred_collectd using memory tags(‘vm130’, ‘memory’, 'buffer', 'collectd') values(1632979445, 3.0656);
最終系統(tǒng)中會(huì)建立 340 個(gè)左右的子表,3個(gè)超級(jí)表。需要注意的是,如果采用串聯(lián)標(biāo)簽值的方式導(dǎo)致子表名稱(chēng)超過(guò)系統(tǒng)限制(191字節(jié)),那么需要采用一定的編碼方式(例如 MD5)將其轉(zhuǎn)化為可接受的長(zhǎng)度。
- 多值模型
如果想利用TDengine的多值模型能力,需要首先滿(mǎn)足以下要求:不同的采集量具有相同的采集頻率,且能夠通過(guò)消息隊(duì)列同時(shí)到達(dá)數(shù)據(jù)寫(xiě)入端,從而確保使用SQL語(yǔ)句將多個(gè)指標(biāo)一次性寫(xiě)入。將度量的名稱(chēng)作為超級(jí)表的名稱(chēng),建立具有相同采集頻率且能夠同時(shí)到達(dá)的數(shù)據(jù)多列模型。子表的表名采用具有固定規(guī)則的方式進(jìn)行命名。上述每個(gè)度量均只包含一個(gè)測(cè)量值,因此無(wú)法將其轉(zhuǎn)化為多值模型。
數(shù)據(jù)分流與應(yīng)用適配
從消息隊(duì)列中訂閱數(shù)據(jù),并啟動(dòng)調(diào)整后的寫(xiě)入程序?qū)懭霐?shù)據(jù)。
數(shù)據(jù)開(kāi)始寫(xiě)入持續(xù)一段時(shí)間后,可以采用SQL語(yǔ)句檢查寫(xiě)入的數(shù)據(jù)量是否符合預(yù)計(jì)的寫(xiě)入要求。
統(tǒng)計(jì)數(shù)據(jù)量使用如下SQL語(yǔ)句:
select count(*) from memory
完成查詢(xún)后,如果寫(xiě)入的數(shù)據(jù)與預(yù)期的相比沒(méi)有差別,同時(shí)寫(xiě)入程序本身沒(méi)有異常的報(bào)錯(cuò)信息,那么可用確認(rèn)數(shù)據(jù)寫(xiě)入是完整有效的。
TDengine不支持采用OpenTSDB的查詢(xún)語(yǔ)法進(jìn)行查詢(xún)或數(shù)據(jù)獲取處理,但是針對(duì)OpenTSDB的每種查詢(xún)都提供了對(duì)應(yīng)的支持。具體可以參考相關(guān)文檔。
TDengine支持以標(biāo)準(zhǔn)的JDBC 3.0接口來(lái)操縱數(shù)據(jù)庫(kù),也可以使用其他類(lèi)型的高級(jí)語(yǔ)言的連接器來(lái)查詢(xún)讀取數(shù)據(jù),以適配應(yīng)用。具體的操作和使用幫助也請(qǐng)參閱用戶(hù)手冊(cè)。
歷史數(shù)據(jù)遷移
1、使用工具自動(dòng)遷移數(shù)據(jù)
為了方便歷史數(shù)據(jù)的遷移工作,我們?yōu)閿?shù)據(jù)同步工具DataX提供了插件,能夠?qū)?shù)據(jù)自動(dòng)寫(xiě)入到TDengine中,需要注意的是DataX的自動(dòng)化數(shù)據(jù)遷移只能夠支持單值模型的數(shù)據(jù)遷移過(guò)程。 DataX 具體的使用方式及如何使用DataX將數(shù)據(jù)寫(xiě)入TDengine請(qǐng)參見(jiàn)其使用幫助手冊(cè) github.com/taosdata/datax。
2、手動(dòng)遷移數(shù)據(jù)
如果需要使用多值模型寫(xiě)入數(shù)據(jù),就需要自行開(kāi)發(fā)一個(gè)將數(shù)據(jù)從OpenTSDB導(dǎo)出的工具,然后確認(rèn)哪些時(shí)間線能夠合并導(dǎo)入到同一個(gè)時(shí)間線,再將可以同時(shí)導(dǎo)入的時(shí)間通過(guò)SQL語(yǔ)句寫(xiě)入數(shù)據(jù)庫(kù)中。
手動(dòng)遷移數(shù)據(jù)需要注意以下兩個(gè)問(wèn)題:
1)在磁盤(pán)中存儲(chǔ)導(dǎo)出數(shù)據(jù)時(shí),磁盤(pán)需要有足夠的存儲(chǔ)空間以便能夠充分容納導(dǎo)出的數(shù)據(jù)文件。為了避免全量數(shù)據(jù)導(dǎo)出后導(dǎo)致磁盤(pán)文件存儲(chǔ)緊張,可以采用部分導(dǎo)入的模式,對(duì)于歸屬于同一個(gè)超級(jí)表的時(shí)間線優(yōu)先導(dǎo)出,然后將導(dǎo)出部分的數(shù)據(jù)文件導(dǎo)入到TDengine系統(tǒng)中。
2)在系統(tǒng)全負(fù)載運(yùn)行下,如果有足夠的剩余計(jì)算和IO資源,可以建立多線程的導(dǎo)入機(jī)制,最大限度地提升數(shù)據(jù)遷移效率??紤]到數(shù)據(jù)解析對(duì)于CPU帶來(lái)的巨大負(fù)載,需要控制最大的并行任務(wù)數(shù)量,以避免因?qū)霘v史數(shù)據(jù)而觸發(fā)的系統(tǒng)整體過(guò)載。
由于TDegnine本身操作簡(jiǎn)易性,所以不需要在整個(gè)過(guò)程中進(jìn)行索引維護(hù)、數(shù)據(jù)格式的變化處理等工作,整個(gè)過(guò)程只需要順序執(zhí)行即可。
當(dāng)歷史數(shù)據(jù)完全導(dǎo)入到TDengine以后,此時(shí)兩個(gè)系統(tǒng)處于同時(shí)運(yùn)行的狀態(tài),之后便可以將查詢(xún)請(qǐng)求切換到TDengine上,從而實(shí)現(xiàn)無(wú)縫的應(yīng)用切換。



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



-1.png)




.png)


證.png)


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



