Mongodb mmapv1儲存引擎解析中介紹了Mongodb預設的mmapv1引擎的實現機制,在Mongodb 3.0版本中,引入了WiredTiger儲存引擎,同時還有實驗版本的In-memory引擎、rocks引擎,本文將介紹Mongodb是如何支援多儲存引擎的。
(檢視大圖)
DatabaseHolder
DatabaseHolder是Mongodb資料庫操作的入口,提供了開啟、關閉資料庫的介面,其中openDb介面會建立一個Database物件。
1 2 3 4 5 6 7 8 |
class DatabaseHoler { public: Database* openDb(string dbname); void close(string dbname); Database* get(string dbname); pirate: map<string, Database*> dbs; }; |
Database
Database物件代表Mongodb裡的一個db,其提供關於集合操作的所有介面,包括建立、刪除、重新命名集合,建立Database時會根據mongod程式的storageEngine配置來決定使用哪個儲存引擎。
1 2 3 4 5 6 7 8 |
class Database { public: Collection* createCollection(string& coll_name); void dropCollection(string& coll_name); Collection* getCollection(string& coll_name); private: map<string, Collection*> _collections; }; |
Collection
Collection代表Mongodb裡的一個集合,其提供關於文件增刪改查的所有介面,這些介面最終會呼叫RecordStore裡的相應介面實現。
1 2 3 4 5 6 7 8 9 |
class Collection { public: insertDocument(); deleteDocument(); updateDocument(); findDoc(); private: RecordStore* _recordStore; }; |
GlobalEnvironmentMongoD
GlobalEnvironmentMongoD是mongod的全域性執行環境資訊,所有的儲存引擎在啟動時會先註冊,mongd根據配置設定當前使用的儲存引擎; 註冊引擎時,提供引擎的名字(如mmapv1、wiredTiger)及用於建立引擎物件的工廠方法(工廠實現create的介面,用於建立StorageEngine物件)。
1 2 3 4 5 6 7 8 9 10 |
class GlobalEnvironmentMongoD { pubic: void registerStorageEngine(const std::string& name, const StorageEngine::Factory* factory); void setGlobalStorageEngine(const std::string& name); StorageEngine* getGlobalStorageEngine(); private: StorageEngine* _storageEngine; // 當前儲存引擎 FactoryMap _storageFactories; }; |
StorageEngine
StorageEngine定義了一系列Mongdb儲存引擎需要實現的介面,是一個介面類,所有的儲存引擎需繼承這個類,實現自身的儲存邏輯。 getDatabaseCatalogEntry介面用於獲取一個DatabaseCatalogEntry物件,該物件實現了關於集合、文件操作的介面。
1 2 3 4 5 6 7 8 9 10 11 12 |
class StorageEngine { public: DatabaseCatalogEntry* getDatabaseCatalogEntry(string& ns); void listDatabases( std::vector<std::string>* out ); }; class DatabaseCatalogEntry { public: createCollection(); dropCollection(); getRecordStore(); /* 實現文件操作介面 */ }; |
MMAPV1StorageEngine
MMAPV1StorageEngine包含了mmapv1儲存引擎的所有實現邏輯。
KVStorageEngine
KVStorageEngine實際上不是一個真正儲存引擎的實現,只是為了方便接入wiredTiger、rocks等KV型別的儲存引擎而增加的一個抽象層。 KVStorageEngine實現了StorageEngine的介面,但其實現由KVEngine類代理,wiredTiger等KV儲存引擎接入mongdb時,只需實現KVEngine定義的介面即可。
WiredTigerKVEngine
WiredTigerKVEngine繼承KVEngine,實現KVEngine的介面,其他的引擎如RocksEngine類似。