MongoDB多存儲引擎支持機製
Mongodb mmapv1存儲引擎解析中介紹了Mongodb默認的mmapv1引擎的實現機製,在Mongodb 3.0版本中,引入了WiredTiger存儲引擎,同時還有實驗版本的In-memory引擎、rocks引擎,本文將介紹Mongodb是如何支持多存儲引擎的。
DatabaseHolder
DatabaseHolder是Mongodb數據庫操作的入口,提供了打開、關閉數據庫的接口,其中openDb接口會創建一個Database對象。
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配置來決定使用哪個存儲引擎。
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裏的相應接口實現。
class Collection {
public:
insertDocument();
deleteDocument();
updateDocument();
findDoc();
private:
RecordStore* _recordStore;
};
GlobalEnvironmentMongoD
GlobalEnvironmentMongoD是mongod的全局運行環境信息,所有的存儲引擎在啟動時會先注冊,mongd根據配置設置當前使用的存儲引擎; 注冊引擎時,提供引擎的名字(如mmapv1、wiredTiger)及用於創建引擎對象的工廠方法(工廠實現create的接口,用於創建StorageEngine對象)。
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對象,該對象實現了關於集合、文檔操作的接口。
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繼承KVEgine,實現KVEngine的接口,其他的引擎如RocksEngine類似。
最後更新:2017-04-01 13:37:08