[TcaplusDB知識庫]TXHDB存儲引擎的介紹

存儲引擎的介紹

數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)經過數據引擎,對數據進行建立、查詢、修改和刪除的操做。不一樣的存儲引擎提供不一樣的存儲機制、索引技巧、鎖定水平等功能,使用不一樣的存儲引擎,還能夠得到數據庫特定的功能。數據庫

做爲數據庫的支撐底盤,一個成熟的存儲引擎必需要考慮各個方面,包括數據讀寫的效率,包括如何成本最低風險最小地運做,而TcaplusDB在考慮了以上這些因素後,結合咱們是一個鍵值型數據庫的特色,咱們選擇了騰訊徹底自研的TXHDB存儲引擎來落地TcaplusDB的數據。 下面介紹一下TXHDB存儲引擎的格式和優點所在。數組

存儲引擎格式

TcaplusDB的數據文件大體能夠分爲3個區,頭部區、內存映射區和文件訪問區,見下圖。其中內存映射區和文件訪問區是用於存放真實數據的。緩存

在這裏插入圖片描述

其中:分佈式

  • 頭部區,用於存放元數據、統計數據、Hash桶、空閒塊鏈表頭,擴展數據等信息。
  • 內存映射區,這部分空間會在數據文件加載時,經過mmap的方式映射到內存地址空間中,使用讀寫內存的方式讀寫該區域,間接地達到緩存在內存中的效果。該區域位於數據文件的前部,默認大小爲1G。
  • 文件訪問區,緊接着內存映射區後面就是所謂的文件訪問區,該區域的數據讀寫經過普通的文件讀寫接口進行。

更詳細的格式內容以下: 在這裏插入圖片描述優化

整個文件分爲頭部控制信息區和數據區域;設計

數據文件打開時,從文件最開始創建文件映射對象,對於寫操做,至少將控制頭部區域放入內存映射範圍;3d

Key-value數據記錄經過hash表進行組織,hash衝突解決策略有二叉平衡樹和線性鏈兩種,經過引擎文件建立時經過參數能夠決定使用哪一種衝突解決策略;二叉樹平衡樹經過對key計算另一個hash值(稱爲二次hash)創建;對象

數據在mmap區域外時,對數據的訪問經過基於文件起始位置的偏移,使用pread/pwrite來訪問。blog

頭部控制區域分爲如下幾個部分:索引

  1. 基本控制信息區:包含magic、版本信息、文件類型、記錄對齊參數、空閒塊參數、壓縮屬性、桶數、記錄數、文件大小、首條記錄位置、桶信息、空閒塊信息等。
  2. Hash桶信息區:存儲hash每一個桶首條記錄的存儲偏移;
  3. 內存空閒鏈表頭:此文件中處於mmap區域範圍內的空閒數據塊鏈表表頭;
  4. 文件空閒塊表頭:mmap區域外空閒數據塊鏈表的表頭;
  5. LRU信息區域:跟蹤mmap區域數據記錄訪問狀況的LRU鏈;
  6. 擴展區域:對txhdb透明存儲區域,tcapsvr經過此區域存儲數據表描述信息;

空閒塊管理

數據記錄的大小不一,數據記錄在存儲過程當中,大小改變或刪除會致使文件中出現一些空閒塊,爲減小大小不一空閒塊的整理利用的開銷。TXHDB採用塊空間來存儲數據記錄,塊空間經過一個apow的參數設定其對齊方式,即經過apow定義數據塊的最少大小;整個存儲塊由按照最小對齊單元進行逐層線性增加的塊數組組成,數據塊的級數經過fpow參數決定,若是apow爲8,fpow爲10,則空閒數據塊起示意圖以下:

在這裏插入圖片描述

實際數據key或value經過某一級別的一個或多個空閒塊來存儲,空閒塊分配原則:

  • 優先使用內存空閒塊,而後使用文件塊
  • 基於內存優先使用連續塊,而後使用離散塊
  • 基於文件只能使用連續塊

若是記錄均爲小記錄,那麼整個文件可能會存在過多的離散記錄,能夠經過數據搬遷整理的方式按期對數據作整理。

Key Value分離

基於HASH表存儲數據記錄,每一個數據的讀寫都必須訪問數據的Key,TXHDB採用Key-value分離的思路,優化數據檢索效率,具體以下:

將Key和Value分離存儲,分別存儲到Key結點和Value結點,Hash值映射到Key結點,Key結點再映射到Value結點。Key結點優先存儲在內存中,Value結點有可能存儲在內存中也有可能存儲在磁盤中。

在這裏插入圖片描述

具體說明以下:

  • 一條記錄的key,可能有多個塊組成, 一個Head塊, 多個split塊,每個塊中記錄下一個塊的offset. 同時key head塊中記錄的有value頭塊的offset。
  • 一條記錄的val, 也可能有多個塊組成, 一個head塊, 多個spl塊,val的offset,記錄再key的head中。
  • 經過將key的offset記錄在hash桶中, 衝突的記錄,offset記錄在keyHead的left和right中以實現鏈表或二叉樹。
  • 線上業務一般width_等於32,即4B。 則 keyHead默認最小塊爲64B(apow的取值最小爲6,2**6=64B), 其中引擎自有信息須要佔用32B – 33B, 業務可用爲31B到32B, 業務據此可設計更有效的key,使key佔用的塊儘量少。

多級LRU鏈 進行數據熱度管理

爲記錄數據的訪問熱點,對mmap區域內的數據創建多級LRU鏈來跟蹤,LRU鏈的級數經過參數能夠定製,採用多級LRU而非一級LRU鏈主要是淘汰時除考慮最近訪問時間外,還評估最近訪問次數。 在這裏插入圖片描述

  • 多級LRU,綜合考慮最近訪問時間和訪問次數
  • 讀寫訪問時增長訪問計數,定位掃描時減訪問次數
  • 優先淘汰訪問次數爲1的LRU鏈中的記錄
  • 換出條件:剩餘內存低於必定閥值
  • 換入條件:剩餘內存高於必定閥值

最後

咱們已經瞭解了 TcaplusDB 個分佈式的 NoSql數據庫搜素引擎的基本結構,後續咱們將揭開更多TcaplusDB設計的特殊奧祕。

相關文章
相關標籤/搜索