數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)經過數據引擎,對數據進行建立、查詢、修改和刪除的操做。不一樣的存儲引擎提供不一樣的存儲機制、索引技巧、鎖定水平等功能,使用不一樣的存儲引擎,還能夠得到數據庫特定的功能。數據庫
做爲數據庫的支撐底盤,一個成熟的存儲引擎必需要考慮各個方面,包括數據讀寫的效率,包括如何成本最低風險最小地運做,而TcaplusDB在考慮了以上這些因素後,結合咱們是一個鍵值型數據庫的特色,咱們選擇了騰訊徹底自研的TXHDB存儲引擎來落地TcaplusDB的數據。 下面介紹一下TXHDB存儲引擎的格式和優點所在。數組
TcaplusDB的數據文件大體能夠分爲3個區,頭部區、內存映射區和文件訪問區,見下圖。其中內存映射區和文件訪問區是用於存放真實數據的。緩存
其中:分佈式
更詳細的格式內容以下: 優化
整個文件分爲頭部控制信息區和數據區域;設計
數據文件打開時,從文件最開始創建文件映射對象,對於寫操做,至少將控制頭部區域放入內存映射範圍;3d
Key-value數據記錄經過hash表進行組織,hash衝突解決策略有二叉平衡樹和線性鏈兩種,經過引擎文件建立時經過參數能夠決定使用哪一種衝突解決策略;二叉樹平衡樹經過對key計算另一個hash值(稱爲二次hash)創建;對象
數據在mmap區域外時,對數據的訪問經過基於文件起始位置的偏移,使用pread/pwrite來訪問。blog
頭部控制區域分爲如下幾個部分:索引
數據記錄的大小不一,數據記錄在存儲過程當中,大小改變或刪除會致使文件中出現一些空閒塊,爲減小大小不一空閒塊的整理利用的開銷。TXHDB採用塊空間來存儲數據記錄,塊空間經過一個apow的參數設定其對齊方式,即經過apow定義數據塊的最少大小;整個存儲塊由按照最小對齊單元進行逐層線性增加的塊數組組成,數據塊的級數經過fpow參數決定,若是apow爲8,fpow爲10,則空閒數據塊起示意圖以下:
實際數據key或value經過某一級別的一個或多個空閒塊來存儲,空閒塊分配原則:
若是記錄均爲小記錄,那麼整個文件可能會存在過多的離散記錄,能夠經過數據搬遷整理的方式按期對數據作整理。
基於HASH表存儲數據記錄,每一個數據的讀寫都必須訪問數據的Key,TXHDB採用Key-value分離的思路,優化數據檢索效率,具體以下:
將Key和Value分離存儲,分別存儲到Key結點和Value結點,Hash值映射到Key結點,Key結點再映射到Value結點。Key結點優先存儲在內存中,Value結點有可能存儲在內存中也有可能存儲在磁盤中。
具體說明以下:
爲記錄數據的訪問熱點,對mmap區域內的數據創建多級LRU鏈來跟蹤,LRU鏈的級數經過參數能夠定製,採用多級LRU而非一級LRU鏈主要是淘汰時除考慮最近訪問時間外,還評估最近訪問次數。
咱們已經瞭解了 TcaplusDB 個分佈式的 NoSql數據庫搜素引擎的基本結構,後續咱們將揭開更多TcaplusDB設計的特殊奧祕。