摘要:目前已提交至社區(qū),正在接受社區(qū)評審。表示統(tǒng)計數(shù)據(jù),是通過腳本或硬編碼對源數(shù)據(jù)進行聚合分析后生成的存儲模型。由于該方案丟失了需要索引的,所以需要通過硬編碼記錄需要索引的及。
該項目來自于開源軟件供應鏈點亮計劃 - 暑期2021的Apache IoTDB - Apache Skywalking適配器項目。目前已提交至Skywalking社區(qū)(IoTDB storage plugin #7766),正在接受社區(qū)評審。
項目目標是為Skywalking開發(fā)一個使用IoTDB進行相關數(shù)據(jù)讀寫的適配器??梢詤⒖糞kywalking目前已有的采用InfluxDB、H2和Elasticsearch的適配器。Skywalking給出了存儲拓展的開發(fā)指南,參考鏈接。此外,需要使用Skywalking和InfluxDB的調(diào)試過程,以便充分了解Skywalking的接口和使用方式。
IoTDB建議使用其提供的原生客戶端封裝: Session或Session Pool與IoTDB服務端進行交互。
開發(fā)平臺:Win10,IoTDB版本:0.12.2
Skywalking 8.0+的存儲模型大致分為4類:Record,Metrics,NoneStream,ManagementData。它們都實現(xiàn)了StorageData接口。StorageData接口必須實現(xiàn)id()方法,下面分別介紹4類存儲模型:
Record:Record大部分是原始日志數(shù)據(jù)或任務記錄。這些數(shù)據(jù)需要持久化,無需進一步分析。所有Record類的模型均具備time_bucket字段,用于記錄當前Record所在的時間窗口。具體例子有:SegmentRecord,AlarmRecord,BrowserErrorLogs,LogRecord,ProfileTaskLogRecord, ProfileThreadSnapshotRecord,TopN。
Metrics:Metrics表示統(tǒng)計數(shù)據(jù),是通過OAL腳本或硬編碼對源(Source)數(shù)據(jù)進行聚合分析后生成的存儲模型。它的生命周期由TTL(生存時間)控制。所有Metrics類的模型均具備time_bucket和entity_id字段。例如:NetworkAddressAlias,Event,InstanceTraffic,EndpointTraffic, ServiceTraffic,EndpointRelationServerSideMetrics,ServiceInstanceRelationServerSideMetrics, ServiceInstanceRelationClientSideMetrics,ServiceRelationServerSideMetrics,ServiceRelationClientSideMetrics
NoneStream:NoneStream基于Record,支持time_bucket轉(zhuǎn)換為TTL。例如:ProfileTaskRecord
ManagementData:UI模板管理相關的數(shù)據(jù),默認只有一個UITemplate實現(xiàn)類
部分參考《Apache Skywalking實戰(zhàn)》第9章:SkyWalking OAP Server存儲模型
參考IoTDB官方數(shù)據(jù)模型介紹。簡單來說,可以用樹結(jié)構(gòu)來認識IoTDB的數(shù)據(jù)模型。如果按照層級劃分,從高到低依次為:Storage Group -> (LayerName) -> Device -> Timeseries。從最上層到其下某一層稱為一條路徑(Path),最上層是Storage Group,倒數(shù)第二層是Device,倒數(shù)第一層是Timeseries,中間可以有很多層,每一層姑且稱之為LayerName。
值得注意的是,每個Storage Group需要一個線程,所以Storage Group過多會導致存儲性能下降。此外,LayerName的值存儲在內(nèi)存中,而Timeseries的值及其下的數(shù)據(jù)存儲在硬盤中。
Skywalking的每個存儲模型可以認為是一個Model,Model中包含了多個Column,每個Column中具備ColumnName和ColumnType屬性,分別表示Column的名字和類型,每個ColumnName下存儲多個數(shù)據(jù)類型為ColumnType的數(shù)據(jù)Value。從關系型數(shù)據(jù)庫的角度來看的話,Model即是關系表,Column即是關系表中的字段。
將Skywalking的所有存儲模型都寫入IoTDB的一個存儲組中,例如root.skywalking存儲組。Model對應Device,Column對應Timeseries。即Skywalking的“Database -> Model -> Column”對應到IoTDB的“Storage Group -> Device -> Timeseries”。該方案的IoTDB存儲路徑只有4層:root.skywalking.ModelName.ColumnName。該方案的優(yōu)點是邏輯清晰,實現(xiàn)難度較低,但由于數(shù)據(jù)都存儲在硬盤上,查詢效率相對較差。
驗證結(jié)果:該方案無法實現(xiàn)
原因:部分存儲接口需要實現(xiàn)group by entity_id的查詢功能,但IoTDB只支持group by time。需要采用方案二并通過group by level來實現(xiàn)。
由于IoTDB的每個LayerName存儲于內(nèi)存中,可以將其認為是一種索引,可以充分利用LayerName的這個特性提高IoTDB的查詢性能。
依然將Skywalking的所有存儲模型都寫入IoTDB的一個存儲組中,例如root.skywalking存儲組。Model對應一個LayerName,需要索引的Column也對應于LayerName,不過LayerName并不存儲ColumnName,而是存儲對應的Value,相當于需要索引的一個Column的不同Value存儲在同一分支下的同一層。不需要索引的Column依然對應Timeseries,即路徑的最后一層。最終將導致同一個Model的數(shù)據(jù)分散到多個Device中。
由于該方案丟失了需要索引的ColumnName,所以需要通過硬編碼記錄需要索引的ColumnName及ColumnType。此外為了避免存儲的混亂,還需要保證一個Model下多個索引Column的順序。計劃通過硬編碼存儲Model需要索引的Column的存儲順序。
該方案的IoTDB存儲路徑長度是不定的,索引的Column越多,路徑的長度越長。例如:
當前有model1(column11, column12),model2(column21, column22, column23),model3(column31),下劃線說明該字段需要索引。
root.skywalking.model1_name.column11_value.column12_name
root.skywalking.model2_name.column21_value.column22_value.column23_name
root.skywalking.model3_name.column31_Name
插入:
-- 插入model1insert into root.skywalking.model1_name.column11_valuevalues (timestamp, column12_value);-- 插入model2insert into root.skywalking.model2_name.column21_value.column22_valuevalues (timestamp, column23_name);
查詢:
-- 查找model1的所有數(shù)據(jù)select *from root.skywalking.model1_name;-- 查找model2中column22_value="test"的數(shù)據(jù)select *from root.skywalking.model2_name.*.test;-- 按照column21分組統(tǒng)計model2中column23的和select sum(column23)from root.skywalking.model2_name.*.*group by level = 3;
該方案的優(yōu)點是實現(xiàn)了索引功能,類似InfluxDB的tag,但邏輯較復雜,實現(xiàn)難度較大。另一方面還需進一步確定哪些Column需要作為索引列,這一點可以參考Elasticsearch(StorageEsInstaller),InfluxDB(TableMetaInfo),MySQL(MySQLTableInstaller)的實現(xiàn),以及ModelColumn的isStorageOnly屬性。
該方案將部分數(shù)據(jù)通過LayerName存儲在內(nèi)存中,在海量數(shù)據(jù)的情況下可能會導致內(nèi)存開銷較大。此外,由于同一個Model的數(shù)據(jù)被分散到了多個Device中,所以查詢往往需要跨多個Device進行查詢。但在這一方面,IoTDB對于跨Device的聚合查詢、排序查詢、分頁查詢的支持還不夠完善,在一些情況下需要使用暴力法將所有符合條件的數(shù)據(jù)都查出來,然后再自行實現(xiàn)聚合、排序、分頁的功能。具體描述可參考下文在IoTDB社區(qū)提交的Issue和Discussion。
已確定采用索引的字段
id
entity_id
node_type
service_group
service_id
trace_id
此外,可以將time_bucket轉(zhuǎn)換為IoTDB自帶的時間戳timestamp后進行存儲,而無需另行存儲time_bucket
參考來自開源軟件供應鏈點亮計劃 - 暑期2021的兼容InfluxDB協(xié)議或客戶端項目的設計文檔,可以看到,使用索引的情況和不使用索引的情況在查詢時間上有數(shù)倍的差距。
127.0.0.1
6667
root
root
root.skywalking
16
1000
問題1:Skywalking部分存儲接口要求
order by
查詢,但IoTDB僅支持order by time
。這本來可以使用選擇函數(shù)top_k
和bottom_k
來過濾數(shù)據(jù)。但在使用索引方案的情況下,由于數(shù)據(jù)點分散在多個device中,top_k
和bottom_k
函數(shù)無法過濾數(shù)據(jù),也無法使用類似group by level
的合并device的查詢方法,具體的描述可參考:Discussion #3888, Issue #3905
- 解決方案:目前除暴力法全部查詢出來再排序以外暫無其他解決方案。
問題2:Skywalking部分存儲接口要求
group by entity_id
的分組聚合查詢,但IoTDB僅支持group by time
和group by level
- 解決方案:采用方案二,并將entity_id作為LayerName存儲,通過group by level實現(xiàn)分組查詢。
問題3:在使用索引方案的情況下,由于數(shù)據(jù)點分散在多個device中,聚合函數(shù)的使用必須要通過
group by level
才能正確統(tǒng)計數(shù)據(jù)。但在此情況下,group by level
和where
同時使用得不到預期的結(jié)果。應該要加上align by device
語義才行,但加上以后就會引起IllegalPathException,推測是因為IoTDB不能同時支持group by level
和align by device
的語義。具體描述可以參考Discussion #3907
- 解決方案:運用
align by device
和where
過濾查詢所有數(shù)據(jù)后自行實現(xiàn)聚合函數(shù)的功能。
問題4:Skywalking的存儲接口要求模糊查詢,但IoTDB使用like的模糊查詢并不支持跨device查詢,不適用于方案二。此外,IoTDB的字符串函數(shù)string_contains只能返回true/false,并不會對數(shù)據(jù)進行過濾。具體描述可以參考:Issue #3945
問題5:Skywalking的存儲接口要求模糊查詢和過濾查詢。由于采用了索引方案,所以需要跨device查詢,但使用
string_contains
函數(shù)的過濾查詢對多個device之間采用了and的語義,無法正確過濾數(shù)據(jù),如果是or的語義應該就可以正確過濾數(shù)據(jù)了。同時string_contains
也不支持使用align by device
。以上這種情況僅支持對time的過濾。
- 解決方案:最初使用
select *, string_contains from root.skywalking.xxx.* where time > ?
獲得結(jié)果后自行對其他條件過濾。后來采用類似問題4的解決方案,直接使用類似MySQL的模糊查詢和過濾查詢即可。
當前的存儲方案還存在使用暴力法進行查詢的情況,即使通過Skywalking社區(qū)的審查,性能也是不足的,具有數(shù)據(jù)傳輸開銷大、系統(tǒng)處理資源占用大的問題。暫時還沒有好的方法可以解決,要等后續(xù)IoTDB針對這類場景增加不同語義的關鍵字或者完善現(xiàn)有的查詢語義才行。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121619.html
摘要:通過跟蹤請求的處理過程,來對應用系統(tǒng)在前后端處理服務端調(diào)用的性能消耗進行跟蹤,關于的介紹可以看這個鏈接,大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng)作者刀把五鏈接來源知乎著作權(quán)歸作者所有。 手把手教你搭APM之Skywalking 前言 什么是APM?全稱:Application Performance Management 可以參考這里: 現(xiàn)代APM體系,基本都是參考Google的Dapper(大規(guī)模...
摘要:安裝可以去下載最新版本的壓縮包,然后解壓。然后進入目錄下,直接雙擊即可運行然后訪問即可看到的登錄頁面初始賬號和密碼均為登錄進去即可看到下圖因為還沒有配置登錄進來之后是沒有數(shù)據(jù)的。 skywalking安裝 可以去http://skywalking.apache.org/downloads/下載最新版本的skywalking壓縮包,然后解壓。 然后進入/apache-skywalking...
摘要:服務網(wǎng)關服務網(wǎng)關涵蓋的功能包括路由,鑒權(quán),限流,熔斷,降級等對入站請求的統(tǒng)一攔截處理。具體可以進一步劃分為外部網(wǎng)關面向互聯(lián)網(wǎng)和內(nèi)部網(wǎng)關面向服務內(nèi)部管理。應用服務應用服務是企業(yè)業(yè)務核心。到此實際上已經(jīng)完成服務遷移工作。 導讀 Spring Cloud基于Spring Boot開發(fā),提供一套完整的微服務解決方案,具體包括服務注冊與發(fā)現(xiàn),配置中心,全鏈路監(jiān)控,API...
閱讀 2349·2021-09-30 09:47
閱讀 2966·2019-08-30 11:05
閱讀 2537·2019-08-29 17:20
閱讀 1926·2019-08-29 13:01
閱讀 1735·2019-08-26 13:39
閱讀 1265·2019-08-26 13:26
閱讀 3220·2019-08-23 18:40
閱讀 1836·2019-08-23 17:09