InfluxDB是一款Go語言寫的時序數(shù)據(jù)庫。時序數(shù)據(jù)庫主要用于存儲基于時間序列的指標數(shù)據(jù),例如一個Web頁面的PV、UV等指標,將其定期采集,并打上時間戳,就是一份基于時間序列的指標。時序數(shù)據(jù)庫通常用來配合前端頁面來展示一段時間的指標曲線。
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了呈貢免費建站歡迎大家使用!
時序數(shù)據(jù)庫較傳統(tǒng)的關系型數(shù)據(jù)庫以及NOSQL究竟有什么優(yōu)勢,下面會結合相關模型的特性進行分析
LSM tree是基于Google的BigTable架構,數(shù)據(jù)以K-V方式存儲。
寫數(shù)據(jù)首先會插入到內(nèi)存中的樹。當內(nèi)存中的樹中的數(shù)據(jù)超過一定閾值時,會進行合并操作。合并操作會從左至右遍歷內(nèi)存中的樹的葉子節(jié)點與磁盤中的樹的葉子節(jié)點進行合并,當被合并的數(shù)據(jù)量達到磁盤的存儲頁的大小時,會將合并后的數(shù)據(jù)持久化到磁盤,同時更新父親節(jié)點對葉子節(jié)點的指針。
這種機制保證了寫入的效率,因為數(shù)據(jù)會在合并后順序寫入磁盤頁。但會推遲磁盤回寫,因此為保障讀數(shù)據(jù)的一致性,會先在內(nèi)存中查詢,如果內(nèi)存中沒有,則到磁盤上查詢。
刪除數(shù)據(jù)時,在內(nèi)存(C0)中查找,如果沒有,則在內(nèi)存中新建一個索引,將鍵值設置刪除標記(創(chuàng)建墓碑),這樣后續(xù)的滾動合并操作時,再有查詢操作,就會被直接返回該鍵值不存在。 數(shù)據(jù)會在之后的Compaction當中從數(shù)據(jù)文件中刪除。
當日志文件超過一定大小的閾值是 (默認為 1MB):
建立一個新的memtable和日志文件,以后的操作都是用新的memtable和日志文件
后臺進行如下操作:
將舊的 memtable寫到SSTable中(過程為先轉為immtable_table,然后遍歷寫入)
廢棄舊的 memtable
刪除舊的 memtable和日志文件
將新的SSTable加到level 0中.
對于時序數(shù)據(jù)而言,LSM tree的讀寫效率很高。但是熱備份以及數(shù)據(jù)批量清理的效率不高。
B+ Tree,很多關系型數(shù)據(jù)庫像 Berkerly DB , sqlite , MySQL 數(shù)據(jù)庫都使用了B+樹算法處理索引。B+ Tree的特點是數(shù)據(jù)按照索引有序排放,犧牲一定寫入性能,保證了讀取效率。但數(shù)據(jù)量很大時(GB),查詢效率就會很低。因為數(shù)據(jù)量越大,樹分叉就越多,遍歷時的開銷就越大。
influxdb在v0.9.5版本引入TSM引擎,該引擎修改自LSM
當前日志文件達到2MB大小后封閉,并開始寫新的日志文件
寫數(shù)據(jù)時,日志文件落盤(fsync)且數(shù)據(jù)索引加入內(nèi)存表后返回成功。這樣的設計保證了數(shù)據(jù)的一致性。同時對寫盤的吞吐性能提出要求,建議批量提交數(shù)據(jù)(influxdb提供了批量提交的API)。日志遵循TLV格式,并采用較精簡的數(shù)據(jù)結構,來減少寫操作的開銷。
文件結構一個文件的中數(shù)據(jù)塊按照時序進行排列
對照LevelDB的結構,增加了min和max time, 基于一段時間范圍的數(shù)據(jù)提取會非常簡單
Data Block結構ID由存放的key (measurement name + tagset) 以及 field name進行hash(fnv64-a hash)生成
Compressd block當中會存儲metric值,數(shù)據(jù)壓縮算法后面會進行詳述
Index Block結構
首先會根據(jù)查詢請求的時間范圍,在數(shù)據(jù)文件中進行二進制搜索,找到符合范圍的文件。之后在內(nèi)存中的映射表根據(jù)查詢指標項HASH獲取ID,并通過索引找到數(shù)據(jù)塊的起始地址。之后根據(jù)數(shù)據(jù)塊及其下一數(shù)據(jù)塊的timestamp我們可以推算出需要取出多少個數(shù)據(jù)塊,最后將數(shù)據(jù)塊中的數(shù)據(jù)解壓,得到結果
如果多個更新在同一個時間范圍內(nèi),預寫日志會緩存起來一起更新。
兩階段式處理,第一階段,預寫日志會將其持久化在日志中,并通知索引維護內(nèi)存中的墓碑. 此時查詢數(shù)據(jù),就會返回不存在。第二階段,預寫日志寫索引文件,會優(yōu)先處理刪除,之后再處理刪除操作之后的其他插入(包括刪除的序列以及其他序列),并清除內(nèi)存中的墓碑。
數(shù)據(jù)壓縮的目的是為了減少存儲空間以及降低寫磁盤的開銷每個壓縮數(shù)據(jù)塊當中會包含一個系列的點(壓縮時間戳、壓縮值), 因為時間戳是一個單調(diào)遞增的序列,因此壓縮時填入的時間的偏移量
influxdb的數(shù)據(jù)存儲結構實現(xiàn)了數(shù)據(jù)基于系列以及時間戳2個維度的有序存取。并通過壓縮數(shù)據(jù)來降低I/O開銷。在取一個系列在一定時間范圍內(nèi)的數(shù)據(jù)這個場景下,能夠提高處理速度。 由于數(shù)據(jù)按時間進行歸并,對Retention操作而言,可以以數(shù)據(jù)文件為單位進行操作,效率會比較高。
本文題目:InfluxDB引擎原理
網(wǎng)址分享:http://www.chinadenli.net/article0/pgeeoo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、外貿(mào)建站、定制開發(fā)、自適應網(wǎng)站、企業(yè)建站、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)