tair是乙個高效能、分布式、可擴充套件、高可靠的nosql儲存系統。本文基於tair v3.1.2.43版本,**其mdb儲存引擎的實現。
tair目前有mdb、ldb和rdb等儲存引擎。其中mdb是tair最早的一款記憶體型產品,也是在公司內部應用最廣泛的集中式快取。特別適用容量小(一般在m級別,50g之內),讀寫qps高(萬級別)的應用場景。由於是記憶體型產品,因此無法保證資料的安全性,對資料安全有要求的應用建議在後端加持久化資料來源(例如mysql)。本文接下來詳細討論tair mdb儲存引擎的實現。
tair的儲存引擎介面是src\storage\storage_manager.hpp
裡的虛基類storage_manager
。所有的tair儲存引擎均繼承實現了storage_manager
這個虛基類。src\dataserver\tair_manager.cpp
檔案中的tair_manager::initialize
函式根據配置檔案中storage_engine
的設定初始化相應的儲存引擎。
mdb引擎預設使用posix共享記憶體的方式進行記憶體的分配和管理。mdb引擎會在初始化的時候建立或者使用已存在的共享記憶體。其配置使用記憶體的方式和共享記憶體命名的字首均在其配置檔案中進行設定。如圖所示:
src\storage\mdb
目錄是mdb儲存引擎的實現,這裡的實現、測試和介面檔案都放在同乙個目錄中。其中有關mdb儲存實現的檔案如下:
◇ db_define. —— mdb引擎相關的配置資訊和定義。
◇ mdb_factory. —— mdb引擎初始化工廠類的實現。
◇ mdb_manager. —— mdb引擎管理結構的實現。
◇ mdb_instance. —— mdb例項相關的實現。
◇ mem_cache. —— memcache結構的實現。
◇ mem_pool. —— mempool結構的實現。
◇ cache_hashmap. —— 全域性快取kv結構對映的hash表的實現。
◇ mdb_stat_manager. —— mdb引擎狀態管理相關實現。
◇ mdb_stat.hpp —— mdb引擎讀取寫入統計的相關資料結構的定義和實現。
◇ lock_guard.hpp —— pthread_mutex_t的簡單raii封裝。
其中mdb_define.
裡定義了mdb引擎的配置變數,開啟共享記憶體的操作函式以及獲取時間、判斷當前時間的hour是否在給定區間等函式。
mdb_factory.
用於建立mdb引擎,mdb_factory.hpp
中定義的介面如下:
create_mdb_manager讀取配置檔案中的配置資訊,然後建立mdb_manager
物件並返回。這個函式在src\dataserver\tair_manager.cpp
檔案中的tair_manager::initialize
函式中被呼叫。
mdb_manager.
定義了mdb引擎管理類mdb_manager
的實現,mdb_manager
類繼承自storage_manager
虛基類,實現了相關的虛函式介面。其定義std::vector
結構儲存所有的mdb例項。mdb_instance
類在mdb_instance.
中定義和實現。mdb_manager
類的initialize
函式會呼叫init_area_stat
函式建立/開啟名為mdb_param::mdb_path+".stat
這個儲存mdb引擎狀態資訊的共享記憶體塊,其大小為tair_max_area_count * sizeof(mdb_area_stat)
。然後會根據配置檔案裡的例項個數資訊建立mdb_instance
例項。配置如下:
mdb_instance
建立時會建立名為mdb_param::mdb_path+".000"
開始計數的共享記憶體塊。建立的例項中bucket的個數由以下配置決定:
mdb_instance
、mem_cache
、mem_pool
、cache_hashmap
這幾個類構成了mdb儲存引擎的核心。建立完成後,其包含指向關係如下:
對應的記憶體結構圖大致如下:
其中mempool以頁的形式管理通過共享記憶體分配的記憶體,分配或者釋放乙個記憶體頁。其定義了uint8_t page_bitmap[bitmap_size]
,以位的形式來管理記憶體頁;memcache比頁低一級,採用slab演算法將記憶體分配給具體的item;hashtable以乙個巨大的hash表儲存key的對映關係。下面闡述對共享記憶體具體的分配情況。記憶體布局如圖所示:
cache meta的結構如下:
hash buckets的結構如下:
slab use這裡,當前的**實際上僅放置了乙個mdb_cache_info:
下面是記憶體管理結構中的一些定義:
mdb_id
的定義:
其中item_id
的圖示如下:
一些換算關係如下:
page_addr = s0 + (page_id * page_size)
item_addr = s0 + (page_id * page_size) + sizeof(page_info) + (slab_size * offset_in_page)
最後是slab分配器和k/v儲存相關的細節。mem_cache
類使用slab_manager
類對從mem_pool
中申請到的記憶體頁進行管理。頁資訊的結構定義如下:
mem_cache
裡的pages被放置在三個鍊錶中,分別是free頁鍊錶、full頁鍊錶和partial頁鍊錶。free頁鍊錶、full頁鍊錶是簡單的雙向鍊錶,用於鏈結空頁和滿頁。partial頁鍊錶如下圖:
下圖是不同的area裡放置item的圖示:
最後剩下的mdb_stat_manager.
和mdb_stat.hpp
定義和實現了訪問統計相關的功能,其建立的共享記憶體塊為相應的mdb例項的名稱+」mdbstat」,此處不再贅述。
Innodb儲存引擎索引的實現原理
在查詢當中,如果是通過主鍵來查詢資料,即使用explain分析sql的key顯示primary時,查詢效率是最高的,因為葉子節點存放的就是資料記錄本身,所有可以直接返回,而不需要像非聚簇索引一樣需要通過額外的隨機磁碟訪問獲取資料記錄。其次是對於order by排序操作,如果order by的列是主鍵...
mysql的儲存引擎有 mysql儲存引擎有哪些?
儲存引擎是資料庫管理系統用來從資料庫建立 讀取和更新資料的軟體模組。mysql中有兩種型別的儲存引擎 事務型和非事務型。對於mysql 5.5及更高版本,預設的儲存引擎是innodb。在5.5版本之前,mysql的預設儲存引擎是myisam。那麼mysql儲存引擎有哪些?一 innodb 這是mys...
MySQL的儲存引擎對索引的實現
mysql中,常用的兩種儲存引擎是myisam和innodb mysql中,將表結構 表資料 表索引統一存放在了磁碟中的同一目錄下,mysql安裝目錄下的data資料夾下,以庫進行資料夾劃分 儲存引擎,是形容表的,並非是庫 表結構 frm檔案 表資料 myd檔案 my表示myisam,d表示data...