【廣告】
BlueSky高性能時序數(shù)據(jù)庫算法
算法 是將之前使用的一個大的查找結(jié)構(gòu)(造成隨機讀寫,影響寫性能的結(jié)構(gòu),比如 B 樹),變換為將寫操作順序的保存到有序文件中,且每個文件只保存短時間內(nèi)的改動。文件是有序的,所以讀取的時候,查找會非???。且文件不可修改,新的更新操作只會寫入到新的文件中。讀操作檢查有序的文件。然后周期性的合并文件來減少文件的個數(shù)。
寫入操作
數(shù)據(jù)先在內(nèi)存中緩存(memtable) 中,memtable 使用樹的結(jié)構(gòu)來保持 key 是有序的,同時使用 WAL 的方式備份數(shù)據(jù)到磁盤。當(dāng) memtable 中數(shù)據(jù)達(dá)到一定規(guī)模后會刷新數(shù)據(jù)到磁盤生成文件。更新寫入操作
文件不允許被編輯,所以新的內(nèi)容或修改只是簡單的生成新的文件。當(dāng)越多的數(shù)據(jù)存儲到系統(tǒng)中,就會有越多的不可修改、順序的有序文件被創(chuàng)建。但比較舊的文件不會被更新,重復(fù)的激流只會通過創(chuàng)建新的記錄來達(dá)到覆蓋的目的,但這這就產(chǎn)生了冗余的數(shù)據(jù)。
系統(tǒng)會周期性的執(zhí)行合并的操作,合并操作用于移除重復(fù)的更新或者刪除記錄,同時還能夠減少文件個數(shù)的增加,保證讀操作的性能。讀取操作
查詢的時候首先檢查內(nèi)存數(shù)據(jù)(memtable),如果沒有找到這個 key,就會逆序的一個個的檢查磁盤上的文件,但讀操作耗時會隨著磁盤上文件個數(shù)的增加而增加。(O(K log N), K為文件個數(shù), N 為文件平均大?。???梢允褂萌缦虏呗詼p少耗時將文件按照 LRU 緩存到內(nèi)存中周期性的合并文件,減少文件的個數(shù)使用布隆過濾器避免大量的讀文件操作(如果bloom說一個key不存在,就一定不存在,而當(dāng)bloom說一個文件存在是,可能是不存在的,只是通過概率來保證)
時序數(shù)據(jù)庫的秘密 —— 快速檢索
碼洞是通過 Lucene 的倒排索引技術(shù)實現(xiàn)比關(guān)系型數(shù)據(jù)庫更快的過濾。特別是它對多條件的過濾支持非常好,比如年齡在 18 和 30 之間,性別為女性這樣的組合查詢。倒排索引很多地方都有介紹,但是其比關(guān)系型數(shù)據(jù)庫的 b-tree 索引快在哪里?到底為什么快呢?
籠統(tǒng)的來說,b-tree 索引是為寫入優(yōu)化的索引結(jié)構(gòu)。當(dāng)我們不需要支持快速的更新的時候,可以用預(yù)先排序等方式換取更小的存儲空間,更快的檢索速度等好處,其代價就是更新慢。要進(jìn)一步深入的化,還是要看一下 Lucene 的倒排索引是怎么構(gòu)成的
時序數(shù)據(jù)庫在風(fēng)電控制系統(tǒng)的中的應(yīng)用
分析了風(fēng)電監(jiān)控系統(tǒng)對海量數(shù)據(jù)的存儲和訪問需求,提出了引入時序數(shù)據(jù)庫技術(shù)來解決傳統(tǒng)數(shù)據(jù)庫在處理海量數(shù)據(jù)時碰到的存儲容量和訪問效率方面的問題。所采用的時序數(shù)據(jù)庫和關(guān)系數(shù)據(jù)庫相結(jié)合的解決方案,在滿足海量數(shù)據(jù)存儲和訪問需求的同時,很好地解決了數(shù)據(jù)模型的描述和存儲問題。介紹了基于時序數(shù)據(jù)庫開發(fā)的一些風(fēng)電應(yīng)用。
時間序列數(shù)據(jù)庫垂直(縱向)切分垂直切分
常見有垂直分庫和垂直分表兩種。
垂直分庫就是根據(jù)業(yè)務(wù)耦合性,將關(guān)聯(lián)度低的不同表存儲在不同的數(shù)據(jù)庫。做法與大系統(tǒng)拆分為多個小系統(tǒng)類似,按業(yè)務(wù)分類進(jìn)行獨立劃分。與"微服務(wù)治理"的做法相似,每個微服務(wù)使用單獨的一個數(shù)據(jù)庫。垂直分表是基于數(shù)據(jù)庫中的"列"進(jìn)行,某個表字段較多,可以新建一張擴展表,將不經(jīng)常用或字段長度較大的字段拆分出去到擴展表中。在字段很多的情況下(例如一個大表有100多個字段),通過"大表拆小表",更便于開發(fā)與維護(hù),也能避免跨頁問題,MySQL底層是通過數(shù)據(jù)頁存儲的,一條記錄占用空間過大會導(dǎo)致跨頁,造成額外的性能開銷。另外數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內(nèi)存中,這樣表中字段長度較短且訪問頻率較高,內(nèi)存能加載更多的數(shù)據(jù),命中率更高,減少了磁盤IO,從而提升了數(shù)據(jù)庫性能。