最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

時(shí)序數(shù)據(jù)庫TDengine寫入查詢的問題分析

 更新時(shí)間:2022年03月24日 16:08:39   作者:乒乓狂魔  
最近TDengine很火,本人也一直很早就有關(guān)注,其官方給出的測(cè)試性能結(jié)果很喜人,所以一開源,本人就進(jìn)行了相關(guān)調(diào)研,最終發(fā)現(xiàn)還是存在著一定的問題,期待后續(xù)的完善吧

寫入問題

必須為每個(gè)Tag組合起一個(gè)表名

付出的代價(jià):

  • 用戶必須要保證每個(gè)Tag組合起的表名唯一,并且一旦Tag組合數(shù)過多用戶很難記住每個(gè)Tag組合對(duì)應(yīng)的表名,在查詢時(shí)基本都是靠超級(jí)表STable來查詢。所以對(duì)用戶來說這個(gè)表名幾乎沒用到卻讓用戶來花代價(jià)來起名

這樣設(shè)計(jì)的最終目的是為了將相同Tag組合的數(shù)據(jù)放到一起,但是系統(tǒng)設(shè)計(jì)時(shí)完全可以自己內(nèi)部針對(duì)這個(gè)Tag組合記錄一個(gè)唯一id或者唯一字符串來作為內(nèi)部隱藏的表名,來替換讓用戶自己起表名的操作,對(duì)用戶只需要呈現(xiàn)一個(gè)超級(jí)表STable即可,減輕用戶負(fù)擔(dān)。

其實(shí)可以看到上述其實(shí)是將系統(tǒng)內(nèi)部判斷唯一的負(fù)擔(dān)轉(zhuǎn)交給用戶,麻煩了用戶。假如系統(tǒng)內(nèi)部自動(dòng)判斷Tag組合是否唯一,則在數(shù)據(jù)寫入過程中一直需要判斷當(dāng)前Tag組合是否存在以及查找對(duì)應(yīng)的底層唯一id或者唯一字符串,而讓用戶起表名則省去了上述代價(jià),因?yàn)橛脩羝鸬谋砻褪且粋€(gè)唯一的字符串,所以寫入性能自然好一些

Tag支撐與管理

  • 最多支持6個(gè)Tag,如果想要支持更多就要重新源碼編譯
  • 超級(jí)表STable對(duì)Tag組合的索引是全內(nèi)存的,終將會(huì)遇到瓶頸的,InfluxDB已經(jīng)走過這條路了,從之前的全內(nèi)存到后面的tsi
  • 超級(jí)表STable對(duì)Tag組合的索引僅僅是對(duì)第一個(gè)Tag作為key來構(gòu)建一個(gè)skiplist,也就是說當(dāng)你的查詢用到第一個(gè)tag時(shí)可以利用下上述索引,當(dāng)你的查詢沒用到第一個(gè)tag時(shí),那就是暴力全掃,所以這種在Tag組合數(shù)過多的時(shí)候過濾查詢能力還是很有限的。而像其他時(shí)序數(shù)據(jù)庫InfluxDB、Druid都在寫入過程中針對(duì)Tag組合構(gòu)建了倒排索引來應(yīng)對(duì)任意維度的過濾,寫入性能比TDengine自然就會(huì)差一些
  • 對(duì)于不再使用的Tag組合的過期目前也是個(gè)麻煩的事情

不支持亂序?qū)懭?/h3>

每張表會(huì)記錄該表目前寫入的最大時(shí)間,一旦后續(xù)的寫入時(shí)間小于該時(shí)間則不允許寫入。假如你不小心向某張表寫入2021-07-24 00:00:00時(shí)間的數(shù)據(jù),那么該時(shí)間之前的數(shù)據(jù)都無法寫入了

這樣做帶來的好處,簡(jiǎn)化了寫入過程,寫入過程永遠(yuǎn)是append操作。舉個(gè)簡(jiǎn)單例子,比如用數(shù)組來存放內(nèi)存數(shù)據(jù),數(shù)組中的數(shù)據(jù)是按時(shí)間排序的,如果后來的數(shù)據(jù)的時(shí)間不是遞增,那么就需要將數(shù)據(jù)插入到數(shù)組中間的某個(gè)位置,并且需要將該位置之后的數(shù)據(jù)全部后移。假如后來的數(shù)據(jù)的時(shí)間都是遞增的,那么直接往數(shù)組的最后面放即可,所以不支持亂序?qū)懭爰匆誀奚脩羰褂脼榇鷥r(jià)來簡(jiǎn)化寫入過程提高寫入性能

不支持亂序?qū)懭脒€省去的一個(gè)麻煩就是:LSM中常見的compact。如果允許亂序?qū)懭耄敲淳蜁?huì)存在2個(gè)文件中時(shí)間范圍是有重疊的,那么就需要像RocksDB那樣來進(jìn)行compact來消滅重疊,進(jìn)而減少查詢時(shí)要查詢的文件個(gè)數(shù),所以你就會(huì)發(fā)現(xiàn)HBase、RocksDB、InfluxDB等等辛辛苦苦設(shè)計(jì)的compact在TDengine中基本不存在

總結(jié)一下就是:不支持亂序?qū)懭胧且誀奚脩舻氖褂脼榇鷥r(jià)來提高寫入性能以及簡(jiǎn)化設(shè)計(jì)

查詢問題

求topN的group

order by只能對(duì)時(shí)間、以及tag進(jìn)行排序。top或者bottom只能對(duì)某個(gè)field求topN

時(shí)序領(lǐng)域非常常見的topN的group,比如求CPU利用率最大的3臺(tái)機(jī)器,目前也無法滿足

downsampling和aggregation

downsampling:將同一根時(shí)間線上1s粒度的數(shù)據(jù)聚合成10s粒度的數(shù)據(jù)

aggregation:將同一時(shí)刻多根時(shí)間線聚合成1根時(shí)間線

比如每個(gè)appId有多臺(tái)機(jī)器,每臺(tái)機(jī)器每秒都會(huì)記錄該機(jī)器的連接數(shù),目前想畫出每個(gè)appId的總連接數(shù)的曲線

假如使用標(biāo)準(zhǔn)SQL則可能表示如下:

select sum(avg_host_conn),appid,new_time from (
		select avg(connection) as avg_host_conn,
				appid,host,time/10 as new_time 
		from t1 group by appid,host,time/10
) as t2 group by appid, new_time

內(nèi)部的子查詢會(huì)先將每個(gè)appid的host 10s內(nèi)的connection求平均值,即downsampling,外部的查詢將每個(gè)appid下的host的上述平均值求和,即aggregation

由于這類需求在時(shí)序查詢中太常見了,使用上述SQL書寫非常麻煩,有些系統(tǒng)就通過函數(shù)嵌套的方式來簡(jiǎn)化這類查詢的書寫

目前TDengine的聚合函數(shù)要么只能是downsampling要么只能是aggregation,也不支持子查詢,那么是無法滿足上述需求的

查詢聚合架構(gòu)

查詢分2階段:第一階段請(qǐng)求管理節(jié)點(diǎn),獲取符合tag過濾的所有表的meta信息(包含每個(gè)表在哪個(gè)數(shù)據(jù)節(jié)點(diǎn)上),假如滿足條件的表有上百萬個(gè),這這個(gè)階段的查詢基本也吃不消,第二階段向數(shù)據(jù)節(jié)點(diǎn)查詢聚合每個(gè)表的數(shù)據(jù),返回給客戶端,客戶端再做最終的聚合。

這種查詢方案終究還是會(huì)面臨客戶端聚合瓶頸的,還是要上多機(jī)協(xié)調(diào)的分布式查詢方案比如類似Presto、Impala等等

以上就是時(shí)序數(shù)據(jù)庫TDengine寫入問題分析的詳細(xì)內(nèi)容,更多關(guān)于時(shí)序數(shù)據(jù)庫TDengine寫入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

雅江县| 浦东新区| 大洼县| 西乌| 台中县| 佛坪县| 庆阳市| 郎溪县| 定西市| 乐陵市| 义马市| 新乡县| 邹城市| 土默特右旗| 大姚县| 巧家县| 宜宾市| 商河县| 龙游县| 乌兰浩特市| 襄汾县| 新疆| 广宗县| 潜江市| 英德市| 镇江市| 平陆县| 土默特左旗| 乌兰察布市| 南汇区| 澳门| 南部县| 子长县| 五家渠市| 新巴尔虎左旗| 根河市| 明水县| 桦南县| 秦皇岛市| 方山县| 太白县|