成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Skywalking IoTDB存儲插件設計說明

paulquei / 2348人閱讀

摘要:目前已提交至社區(qū),正在接受社區(qū)評審。表示統(tǒng)計數(shù)據(jù),是通過腳本或硬編碼對源數(shù)據(jù)進行聚合分析后生成的存儲模型。由于該方案丟失了需要索引的,所以需要通過硬編碼記錄需要索引的及。

該項目來自于開源軟件供應鏈點亮計劃 - 暑期2021的Apache IoTDB - Apache Skywalking適配器項目。目前已提交至Skywalking社區(qū)(IoTDB storage plugin #7766),正在接受社區(qū)評審。

實現(xiàn)思路

項目目標是為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的存儲模型

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。

    • SegmentRecord:Trace Segment明細記錄模型。由skywalking-trace-receiver-plugin插件接收并解析Skywalking Agent發(fā)送來的鏈路數(shù)據(jù)后得到TraceSegment。
    • AlarmRecord:報警明細記錄模型。在指標觸發(fā)報警規(guī)則時,會產(chǎn)生對應的報警明細數(shù)據(jù)模型。
    • TopN:TopN是采樣模型,具備statement字段(用于描述采樣數(shù)據(jù)的關鍵信息),latency字段(用于記錄采樣數(shù)據(jù)的延遲),
      trace_id字段(用于描述采樣數(shù)據(jù)的關聯(lián)分布式鏈路ID),service_id字段(用于記錄服務ID)。目前采樣模型默認只有TopNDatabaseStatement。
      • TopNDatabaseStatement:按照延遲排序的DB采樣記錄。
  • 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ù)模型

參考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的IoTDB-adapter存儲方案

概念劃分

Skywalking的每個存儲模型可以認為是一個Model,Model中包含了多個Column,每個Column中具備ColumnName和ColumnType屬性,分別表示Column的名字和類型,每個ColumnName下存儲多個數(shù)據(jù)類型為ColumnType的數(shù)據(jù)Value。從關系型數(shù)據(jù)庫的角度來看的話,Model即是關系表,Column即是關系表中的字段。

方案一:類似關系型數(shù)據(jù)庫的存儲方案(無法實現(xiàn))

將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),下劃線說明該字段需要索引。

  • 需要具備索引的Model:
    • root.skywalking.model1_name.column11_value.column12_name
    • root.skywalking.model2_name.column21_value.column22_value.column23_name
  • 不需要具備索引的Model:
    • 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ù)倍的差距。

Skywalking-IoTDB適配器的設置參數(shù)

  1. host,IoTDB主機IP,默認127.0.0.1
  2. rpcPort,IoTDB監(jiān)聽端口,默認6667
  3. username,用戶名,默認root
  4. password,密碼,默認root
  5. storageGroup,存儲組名稱,默認root.skywalking
  6. sessionPoolSize,SessionPool大小,默認16
  7. fetchTaskLogMaxSize,在一次請求中獲取的TaskLog數(shù)量的最大值,默認1000

遇到的問題及解決方案

問題1:Skywalking部分存儲接口要求order by查詢,但IoTDB僅支持order by time。這本來可以使用選擇函數(shù)top_kbottom_k來過濾數(shù)據(jù)。但在使用索引方案的情況下,由于數(shù)據(jù)點分散在多個device中,top_kbottom_k函數(shù)無法過濾數(shù)據(jù),也無法使用類似group by level的合并device的查詢方法,具體的描述可參考:Discussion #3888, Issue #3905

  • 解決方案:目前除暴力法全部查詢出來再排序以外暫無其他解決方案。

問題2:Skywalking部分存儲接口要求group by entity_id的分組聚合查詢,但IoTDB僅支持group by timegroup by level

  • 解決方案:采用方案二,并將entity_id作為LayerName存儲,通過group by level實現(xiàn)分組查詢。

問題3:在使用索引方案的情況下,由于數(shù)據(jù)點分散在多個device中,聚合函數(shù)的使用必須要通過group by level才能正確統(tǒng)計數(shù)據(jù)。但在此情況下,group by levelwhere同時使用得不到預期的結(jié)果。應該要加上align by device語義才行,但加上以后就會引起IllegalPathException,推測是因為IoTDB不能同時支持group by levelalign by device的語義。具體描述可以參考Discussion #3907

  • 解決方案:運用align by devicewhere過濾查詢所有數(shù)據(jù)后自行實現(xiàn)聚合函數(shù)的功能。

問題4:Skywalking的存儲接口要求模糊查詢,但IoTDB使用like的模糊查詢并不支持跨device查詢,不適用于方案二。此外,IoTDB的字符串函數(shù)string_contains只能返回true/false,并不會對數(shù)據(jù)進行過濾。具體描述可以參考:Issue #3945

  • 解決方案:最初使用select *, string_contains獲得查詢結(jié)果后再根據(jù)true/false循環(huán)過濾。后來@ijihang提交的PR#3953 ,使like支持跨device查詢和align by device。所以該問題可以直接使用類似MySQL的模糊查詢即可,再次感謝。

問題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的模糊查詢和過濾查詢即可。

總結(jié)

當前的存儲方案還存在使用暴力法進行查詢的情況,即使通過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

相關文章

  • 手把手教你搭APM之Skywalking搭建指南(支持Java/C#/Node.js)

    摘要:通過跟蹤請求的處理過程,來對應用系統(tǒng)在前后端處理服務端調(diào)用的性能消耗進行跟蹤,關于的介紹可以看這個鏈接,大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng)作者刀把五鏈接來源知乎著作權(quán)歸作者所有。 手把手教你搭APM之Skywalking 前言 什么是APM?全稱:Application Performance Management 可以參考這里: 現(xiàn)代APM體系,基本都是參考Google的Dapper(大規(guī)模...

    ingood 評論0 收藏0
  • windows系統(tǒng)下skywalking的安裝和配置

    摘要:安裝可以去下載最新版本的壓縮包,然后解壓。然后進入目錄下,直接雙擊即可運行然后訪問即可看到的登錄頁面初始賬號和密碼均為登錄進去即可看到下圖因為還沒有配置登錄進來之后是沒有數(shù)據(jù)的。 skywalking安裝 可以去http://skywalking.apache.org/downloads/下載最新版本的skywalking壓縮包,然后解壓。 然后進入/apache-skywalking...

    AaronYuan 評論0 收藏0
  • 服務遷移之路 | Spring Cloud向Service Mesh轉(zhuǎn)變

    摘要:服務網(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...

    rickchen 評論0 收藏0

發(fā)表評論

0條評論

paulquei

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<