溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

influxdb的原理是什么

發(fā)布時(shí)間:2021-07-02 16:36:18 來(lái)源:億速云 閱讀:979 作者:chen 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“influxdb的原理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“influxdb的原理是什么”吧!

  • 參考

    • LSM樹(shù)詳解 https://zhuanlan.zhihu.com/p/181498475

    • https://www.jianshu.com/p/a3a2f8f5dd65

    • http://hbasefly.com/2017/12/08/influxdb-1/?qytefg=c4ft23

    • http://hbasefly.com/2017/11/19/timeseries-database-2/?fypwxu=zot6w

    • https://blog.fatedier.com/2016/08/05/detailed-in-influxdb-tsm-storage-engine-one/

  • 什么是時(shí)序數(shù)據(jù)庫(kù)

    • 數(shù)據(jù)模式: 時(shí)序數(shù)據(jù)隨時(shí)間增長(zhǎng),相同維度重復(fù)取值,指標(biāo)平滑變化

    • 寫(xiě)入: 持續(xù)高并發(fā)寫(xiě)入,無(wú)更新操作:時(shí)序數(shù)據(jù)庫(kù)面對(duì)的往往是百萬(wàn)甚至千萬(wàn)數(shù)量級(jí)終端設(shè)備的實(shí)時(shí)數(shù)據(jù)寫(xiě)入(如摩拜單車(chē)2017年全國(guó)車(chē)輛數(shù)為千萬(wàn)級(jí)),但數(shù)據(jù)大多表征設(shè)備狀態(tài),寫(xiě)入后不會(huì)更新

    • 查詢(xún): 按不同維度對(duì)指標(biāo)進(jìn)行統(tǒng)計(jì)分析,且存在明顯的冷熱數(shù)據(jù),一般只會(huì)頻繁查詢(xún)近期數(shù)據(jù)

  • 可以看到時(shí)序數(shù)據(jù)庫(kù)需要解決以下幾個(gè)問(wèn)題:

    • 時(shí)序數(shù)據(jù)的寫(xiě)入:如何支持每秒鐘上千萬(wàn)上億數(shù)據(jù)點(diǎn)的寫(xiě)入。

    • 時(shí)序數(shù)據(jù)的讀?。喝绾沃С衷诿爰?jí)對(duì)上億數(shù)據(jù)的分組聚合運(yùn)算。

    • 成本敏感:由海量數(shù)據(jù)存儲(chǔ)帶來(lái)的是成本問(wèn)題。如何更低成本的存儲(chǔ)這些數(shù)據(jù),將成為時(shí)序數(shù)據(jù)庫(kù)需要解決的重中之重。

  • LSM樹(shù)

    influxdb的原理是什么

    更通俗的講,LSM樹(shù)原理就是把一棵大樹(shù)拆分成N棵小樹(shù),它首先寫(xiě)入內(nèi)存中,隨著小樹(shù)越來(lái)越大,內(nèi)存中的小樹(shù)會(huì)批量flush到磁盤(pán)中獨(dú)立的文件中以提高IO性能,而為了提高讀性能磁盤(pán)中的樹(shù)定期可以做merge操作,合并成一棵大樹(shù)。

    • SSTable 就是 MemTable 中的數(shù)據(jù)在磁盤(pán)上的有序存儲(chǔ),其內(nèi)部數(shù)據(jù)是根據(jù) key 從小到大排列的。通常為了加快查找的速度,需要在 SSTable 中加入數(shù)據(jù)索引,可以快讀定位到指定的 k-v 數(shù)據(jù)。 influxdb的原理是什么

    • 顧名思義,Immutable Memtable 就是在內(nèi)存中只讀的 MemTable,由于內(nèi)存是有限的,通常我們會(huì)設(shè)置一個(gè)閥值,當(dāng) MemTable 占用的內(nèi)存達(dá)到閥值后就自動(dòng)轉(zhuǎn)換為 Immutable Memtable,Immutable Memtable 和 MemTable 的區(qū)別就是它是只讀的,系統(tǒng)此時(shí)會(huì)生成新的 MemTable 供寫(xiě)操作繼續(xù)寫(xiě)入。之所以要使用 Immutable Memtable,就是為了避免將 MemTable 中的內(nèi)容序列化到磁盤(pán)中時(shí)會(huì)阻塞寫(xiě)操作。

    • MemTable 對(duì)應(yīng)的就是 WAL 文件,是該文件內(nèi)容在內(nèi)存中的存儲(chǔ)結(jié)構(gòu),通常用 SkipList 來(lái)實(shí)現(xiàn)。MemTable 提供了 k-v 數(shù)據(jù)的寫(xiě)入、刪除以及讀取的操作接口。其內(nèi)部將 k-v 對(duì)按照 key 值有序存儲(chǔ),這樣方便之后快速序列化到 SSTable 文件中,仍然保持?jǐn)?shù)據(jù)的有序性。

    • MemTable

    • Immutable Memtable

    • SSTable

  • TSM(Time-Structured Merge Tree)

    • InfluxDB底層的存儲(chǔ)引擎經(jīng)歷了從LevelDB到BlotDB,再到選擇自研TSM的過(guò)程,整個(gè)選擇轉(zhuǎn)變的思考可以在其官網(wǎng)文檔里看到。整個(gè)思考過(guò)程很值得借鑒,對(duì)技術(shù)選型和轉(zhuǎn)變的思考總是比平白的描述某個(gè)產(chǎn)品特性讓人印象深刻的多。

    • 它的整個(gè)存儲(chǔ)引擎選型轉(zhuǎn)變的過(guò)程,第一階段是LevelDB,選型LevelDB的主要原因是其底層數(shù)據(jù)結(jié)構(gòu)采用LSM,對(duì)寫(xiě)入很友好,能夠提供很高的寫(xiě)入吞吐量,比較符合時(shí)序數(shù)據(jù)的特性。在LevelDB內(nèi),數(shù)據(jù)是采用KeyValue的方式存儲(chǔ)且按Key排序,InfluxDB使用的Key設(shè)計(jì)是SeriesKey+Timestamp的組合,所以相同SeriesKey的數(shù)據(jù)是按timestamp來(lái)排序存儲(chǔ)的,能夠提供很高效的按時(shí)間范圍的掃描。

    • 不過(guò)使用LevelDB的一個(gè)最大的問(wèn)題是,InfluxDB支持歷史數(shù)據(jù)自動(dòng)刪除(Retention Policy),在時(shí)序數(shù)據(jù)場(chǎng)景下數(shù)據(jù)自動(dòng)刪除通常是大塊的連續(xù)時(shí)間段的歷史數(shù)據(jù)刪除。LevelDB不支持Range delete也不支持TTL(time to live),所以要?jiǎng)h除只能是一個(gè)一個(gè)key的刪除,會(huì)造成大量的刪除流量壓力,且在LSM這種數(shù)據(jù)結(jié)構(gòu)下,真正的物理刪除不是即時(shí)的,在compaction時(shí)才會(huì)生效。

  • 時(shí)序數(shù)據(jù)庫(kù)結(jié)構(gòu)

influxdb的原理是什么

  • OpenTSDB/HBase

    OpenTSDB基于HBase存儲(chǔ)時(shí)序數(shù)據(jù),在HBase層面設(shè)計(jì)RowKey規(guī)則為:metric+timestamp+datasource(tags)

    • 問(wèn)題一:存在很多無(wú)用的字段。一個(gè)KeyValue中只有rowkey是有用的,其他字段諸如columnfamily、column、timestamp以及keytype從理論上來(lái)講都沒(méi)有任何實(shí)際意義,但在HBase的存儲(chǔ)體系里都必須存在,因而耗費(fèi)了很大的存儲(chǔ)成本。

    • 問(wèn)題二:數(shù)據(jù)源和采集指標(biāo)冗余。KeyValue中rowkey等于metric+timestamp+datasource,試想同一個(gè)數(shù)據(jù)源的同一個(gè)采集指標(biāo),隨著時(shí)間的流逝不斷吐出采集數(shù)據(jù),這些數(shù)據(jù)理論上共用同一個(gè)數(shù)據(jù)源(datasource)和采集指標(biāo)(metric),但在HBase的這套存儲(chǔ)體系下,共用是無(wú)法體現(xiàn)的,因此存在大量的數(shù)據(jù)冗余,主要是數(shù)據(jù)源冗余以及采集指標(biāo)冗余。

    • 問(wèn)題三:無(wú)法有效的壓縮。HBase提供了塊級(jí)別的壓縮算法-snappy、gzip等,這些通用壓縮算法并沒(méi)有針對(duì)時(shí)序數(shù)據(jù)進(jìn)行設(shè)置,壓縮效率比較低。HBase同樣提供了一些編碼算法,比如FastDiff等等,可以起到一定的壓縮效果,但是效果并不佳。效果不佳的主要原因是HBase沒(méi)有數(shù)據(jù)類(lèi)型的概念,沒(méi)有schema的概念,不能針對(duì)特定數(shù)據(jù)類(lèi)型進(jìn)行特定編碼,只能選擇通用的編碼,效果可想而知。

    • 問(wèn)題四:不能完全保證多維查詢(xún)能力。HBase本身沒(méi)有schema,目前沒(méi)有實(shí)現(xiàn)倒排索引機(jī)制,所有查詢(xún)必須指定metric、timestamp以及完整的tags或者前綴tags進(jìn)行查詢(xún),對(duì)于后綴維度查詢(xún)也勉為其難。

  • influxdb

    相比OpenTSDB以及Druid,可能很多童鞋對(duì)InfluxDB并不特別熟悉,然而在時(shí)序數(shù)據(jù)庫(kù)排行榜單上InfluxDB卻是遙遙領(lǐng)先。InfluxDB是一款專(zhuān)業(yè)的時(shí)序數(shù)據(jù)庫(kù),只存儲(chǔ)時(shí)序數(shù)據(jù),因此在數(shù)據(jù)模型的存儲(chǔ)上可以針對(duì)時(shí)序數(shù)據(jù)做非常多的優(yōu)化工作。

    為了保證寫(xiě)入的高效,InfluxDB也采用LSM結(jié)構(gòu),數(shù)據(jù)先寫(xiě)入內(nèi)存,當(dāng)內(nèi)存容量達(dá)到一定閾值之后flush到文件 influxdb的原理是什么 InfluxDB在時(shí)序數(shù)據(jù)模型設(shè)計(jì)方面提出了一個(gè)非常重要的概念:seriesKey,seriesKey實(shí)際上就是measurement+datasource(tags).時(shí)序數(shù)據(jù)寫(xiě)入內(nèi)存之后按照seriesKey進(jìn)行組織: influxdb的原理是什么

    • 內(nèi)存中實(shí)際上就是一個(gè)Map:<SeriesKey+fieldKey, List<Timestamp|Value>>,Map中一個(gè)SeriesKey+fieldKey對(duì)應(yīng)一個(gè)List,List中存儲(chǔ)時(shí)間線(xiàn)數(shù)據(jù)。數(shù)據(jù)進(jìn)來(lái)之后根據(jù)measurement+datasource(tags)拼成SeriesKey,加上fieldKey,再將Timestamp|Value組合值寫(xiě)入時(shí)間線(xiàn)數(shù)據(jù)List中。內(nèi)存中的數(shù)據(jù)flush的文件后,同樣會(huì)將同一個(gè)SeriesKey中的時(shí)間線(xiàn)數(shù)據(jù)寫(xiě)入同一個(gè)Block塊內(nèi),即一個(gè)Block塊內(nèi)的數(shù)據(jù)都屬于同一個(gè)數(shù)據(jù)源下的同一個(gè)field。

    • 將datasource(tags)和metric拼成SeriesKey,不是也不能實(shí)現(xiàn)多維查找。確實(shí)是這樣,不過(guò)InfluxDB內(nèi)部實(shí)現(xiàn)了倒排索引機(jī)制,即實(shí)現(xiàn)了tag到SeriesKey的映射關(guān)系,如果用戶(hù)想根據(jù)某個(gè)tag查找的話(huà),首先根據(jù)tag在倒排索引中找到對(duì)應(yīng)的SeriesKey,再根據(jù)SeriesKey定位具體的時(shí)間線(xiàn)數(shù)據(jù)。InfluxDB的這種存儲(chǔ)引擎稱(chēng)為T(mén)SM,全稱(chēng)為T(mén)imestamp-Structure Merge Tree,基本原理類(lèi)似于LSM。后期筆者將會(huì)對(duì)InfluxDB的數(shù)據(jù)寫(xiě)入、文件格式、倒排索引以及數(shù)據(jù)讀取進(jìn)行專(zhuān)題介紹。

  • InfluxDB 數(shù)據(jù)模型 influxdb的原理是什么

    • Measurement:從原理上講更像SQL中表的概念

    • Tags:維度列

      在InfluxDB中,表中Tags組合會(huì)被作為記錄的主鍵,因此主鍵并不唯一,比如上表中第一行和第三行記錄的主鍵都為’location=1,scientist=langstroth’。所有時(shí)序查詢(xún)最終都會(huì)基于主鍵查詢(xún)之后再經(jīng)過(guò)時(shí)間戳過(guò)濾完成。

    • Fields:數(shù)值列。數(shù)值列存放用戶(hù)的時(shí)序數(shù)據(jù)

    • Point:類(lèi)似SQL中一行記錄,而并不是一個(gè)點(diǎn)。

  • InfluxDB 系統(tǒng)架構(gòu) influxdb的原理是什么

到此,相信大家對(duì)“influxdb的原理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI