閱讀974 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MongoDB多存儲引擎支持機製

Mongodb mmapv1存儲引擎解析中介紹了Mongodb默認的mmapv1引擎的實現機製,在Mongodb 3.0版本中,引入了WiredTiger存儲引擎,同時還有實驗版本的In-memory引擎、rocks引擎,本文將介紹Mongodb是如何支持多存儲引擎的。

Alt text

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

  上一篇:go PostgreSQL 使用pg_xlogdump找到誤操作事務號
  下一篇:go PostgreSQL 的小玩具, async Notification as a chat group