1代文件格式回顧
如下圖所示,文件格式分為幾大塊:
1、文件頭(magic )
2、數據部分
3、元數據部分(索引部分)
4、文件尾(magic )
讀取的流程如下:
1、讀取文件元數據信息,把所有的都反序列化到內存中;
2、二分查找,找到對應的的;
3、讀取該下所有的到內存中;
4、二分查找,然后讀取對應的數據。
實際生產過程中會遇到一個設備有幾十萬的傳感器的情況,此時會加載大量與當前查詢無關的信息,對查詢性能也會有巨大的性能開銷。
如何進行優化?
02更高查詢性能
2.1 索引結構
既然每次查詢時,一次性序列化一個設備下所有的傳感器的元數據非常費時,比較直觀的方式是再抽象一層索引出來,提高查詢準確度,降低需要反序列化的元數據數量,帶來的性能開銷。
這里有一個權衡:是多讀一次磁盤開銷比較大,還是一次反序列化許多對象的時間比較大?
測試表明,當反序列化30萬元數據對象時大概耗時250ms,而讀一次磁盤大概也就8ms左右。因此當反序列化的對象比較多的時候,其開銷超過了讀磁盤的開銷,那此時進行元數據分層索引來降低反序列化的對象個數,收益更大。
因此做第二代文件格式設計上做兩點考慮:
?對元數據這塊引入多層索引結構來降低一個設備中測點非常多場景下的訪問開銷;?同理,因為每次讀取時會反序列化非常多的設備級別的元數據,一旦設備個數非常多,查詢時也會有非常高的性能開銷,因此也需要引入多層索引結構來降低反序列化設備索引的個數。
第二代文件格式如下圖所示:
有三個變化:
1、之前的改成多層級索引樹結構,分為和兩種節點:
2、添加新的索引層級,傳感器級索引,分為和兩種節點:
3、去掉,新增,之前是每個設備下的一批傳感器的所有索引在一起,現在改成按傳感器來索引。這樣組織,在只查詢某個傳感器的數據時,可以只加載與此傳感器相關的數據,對于只是關注某個傳感器的某段時間數據的查詢比較友好。
分析下新文件格式中的io次數。
讀取的流程如下:
1、讀取文件元數據信息,把層的設備級索引都反序列化到內存中;
2、二分查找設備級索引,找到對應的傳感器層的索引;
3、讀取傳感器層的索引,反序列化到內存中;
4、二分查找傳感器層的索引,找到并讀取該傳感器下;
5、根據讀取所有的到內存中;
6、二分查找,然后讀取對應的數據。
可以看到比文件格式的版要多一次io,但是其序列化的元數據列表因為只跟要查詢的傳感器相關,會比較小,綜合來看,查詢性能會提升。
2.2 文件格式
如下圖所示,文件格式仍然分為四大塊:
1、文件頭(magic )
2、數據部分
3、元數據部分(索引部分)
4、文件尾(magic )
2.2.1文件頭&文件尾
都是magic數據庫文件格式有哪些,共12字節
2.2.2數據部分
代表一個設備()的一段時間的數據,包含一系列Chunk,末尾還有一個(用來記錄信息)。
代表一個傳感器一段時間的數據,包含一個和一系列Page。
代表一個傳感器一小段時間的數據,包含一個和一系列點數據。其中點數據包含是時間列和數值列,一一對應。
2.3.3元數據部分
某個傳感器某段時間的數據索引。
某個傳感器所有的數據元數據()索引。
整個文件元數據根,包括索引樹,版本信息,bloom過濾器等。
索引樹的根,分層級架構,如上圖所示。
03支持更高效的壓縮
目前實時數據庫領域的有損壓縮方法主要分為兩大類:死區壓縮和趨勢壓縮。
1、死區壓縮:是將新值與上一次的記錄值進行比較,當兩者差的值小于誤差允許閾值時,就拋棄該數據,反之保留該數據。死區壓縮算法簡單,但是壓縮比低,很難滿足實時數據庫系統的要求。
2、趨勢壓縮:是根據測點的階段性趨勢進行壓縮,原則上只記錄滿足趨勢條件的起點和終點。趨勢算法以PI公司的旋轉門算法為代表,旋轉門算法大大提高了實時數據庫的壓縮率,一般可以達到30:1的壓縮比。
在設計第二代文件格式過程中,還引入了旋轉門壓縮算法來進一步提高壓縮效果。
3.1 旋轉門壓縮算法
3.1.1名詞解釋
3.1.2算法流程說明
3.1.2.1相關說明
= ( - - CD) / ( - ) = ( - + CD) / ( - ) = Math.max(, ) = Math.min(, )
3.1.2.2 壓縮過程如下
如上圖,數據加入及壓縮流程:
1、新加入數據點p0,設置為,并保存下來
= p0 當數據為個數據或者超過CD時,標記,并加入;
2、, 起始默認為關閉的(綠色虛線)
只能逆時針打開, 只能順時針打開;
3、新加入數據點p1,計算p1 的 ,;
4、當前計算的 > , <
5、新加入數據點p2,重新計算,。并更新,;
6、新加入數據點p3,重新計算,。并更新。不更新,因為 > , 只能順時針打開;
7、新加入數據點p4,重新計算數據庫文件格式有哪些,。并更新,不更新;
8、每次計算完上下斜率,進行 檢查是否超過平行;
9、加入p4 的時候。發現 >= ,兩扇門超過平行水平,數據范圍已經超過了CD,需要保存上一個數據點 p3
3.1.3算法總結
1、個數據點需要保存;
2、第二個及以后的數據點,通過比較last read point
3、 只能逆時針打開, 只能順時針打開;
4、若兩扇門處于或超過平行狀態,并且當前點和上一存儲點的時間間隔 >= comp min,存儲last read point,并開啟新的;
5、新的 , 計算通過當前數據和上一個 進行比較;
6、若當前點和上一存儲點的時間間隔 >= comp max,存儲當前點,開啟新的;
7、若當前點和上一存儲點的時間間隔