存盤引擎的介紹
資料庫存盤引擎是資料庫底層軟體組織,資料庫管理系統(DBMS)通過資料引擎,對資料進行創建、查詢、修改和洗掉的操作,不同的存盤引擎提供不同的存盤機制、索引技巧、鎖定水平等功能,使用不同的存盤引擎,還可以獲得資料庫特定的功能,
作為資料庫的支撐底盤,一個成熟的存盤引擎必須要考慮各個方面,包括資料讀寫的效率,包括如何成本最低風險最小地運作,而TcaplusDB在考慮了以上這些因素后,結合我們是一個鍵值型資料庫的特點,我們選擇了騰訊完全自研的TXHDB存盤引擎來落地TcaplusDB的資料, 下面介紹一下TXHDB存盤引擎的格式和優勢所在,
存盤引擎格式
TcaplusDB的資料檔案大致可以分為3個區,頭部區、記憶體映射區和檔案訪問區,見下圖,其中記憶體映射區和檔案訪問區是用于存放真實資料的,

其中:
- 頭部區,用于存放元資料、統計資料、Hash桶、空閑塊鏈表頭,擴展資料等資訊,
- 記憶體映射區,這部分空間會在資料檔案加載時,通過mmap的方式映射到記憶體地址空間中,使用讀寫記憶體的方式讀寫該區域,間接地達到快取在記憶體中的效果,該區域位于資料檔案的前部,默認大小為1G,
- 檔案訪問區,緊接著記憶體映射區后面就是所謂的檔案訪問區,該區域的資料讀寫通過普通的檔案讀寫介面進行,
更詳細的格式內容如下: 
整個檔案分為頭部控制資訊區和資料區域;
資料檔案打開時,從檔案最開始建立檔案映射物件,對于寫操作,至少將控制頭部區域放入記憶體映射范圍;
Key-value資料記錄通過hash表進行組織,hash沖突解決策略有二叉平衡樹和線性鏈兩種,通過引擎檔案創建時通過引數可以決定使用哪種沖突解決策略;二叉樹平衡樹通過對key計算另外一個hash值(稱為二次hash)建立;
資料在mmap區域外時,對資料的訪問通過基于檔案起始位置的偏移,使用pread/pwrite來訪問,
頭部控制區域分為以下幾個部分:
- 基本控制資訊區:包含magic、版本資訊、檔案型別、記錄對齊引數、空閑塊引數、壓縮屬性、桶數、記錄數、檔案大小、首條記錄位置、桶資訊、空閑塊資訊等,
- Hash桶資訊區:存盤hash每個桶首條記錄的存盤偏移;
- 記憶體空閑鏈表頭:此檔案中處于mmap區域范圍內的空閑資料塊鏈表表頭;
- 檔案空閑塊表頭:mmap區域外空閑資料塊鏈表的表頭;
- LRU資訊區域:跟蹤mmap區域資料記錄訪問情況的LRU鏈;
- 擴展區域:對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設計的特殊奧秘,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/265317.html
標籤:NoSQL
上一篇:MySql-Day-01
下一篇:🍖MySQL鎖機制
