MongoDB 3の大きな変更点の一つとして、ストレージAPIの導入というものがある。調べたのでメモしていく。
概要
ストレージAPIの思想は、クエリを受け付けたりする部分と、データを永続化する部分(ストレージ)の間に、APIを設けて、
ストレージ部分を簡単に交換できるようにしたもの。
これにより利用者はストレージをより良いものに差し替えたりできるし、ストレージ開発者にとってはMongoDBのクエリ受付部分がストレージのテストドライバになる。
MongoDB 3 では以下の二つのストレージが利用可能である。
- 従来のmmap()システムコールベース(MMAPv1とよばれる)
- WiredTiger
実装
ストレージAPIの実装は、ソースコードを見るとすぐにわかった。APIの実態はC++のインターフェースである。
以下のソースはストレージエンジンのインターフェースである
インターフェースのソースコード(抜粋)
https://github.com/mongodb/mongo/blob/v3.0/src/mongo/db/storage/storage_engine.h
namespace mongo {
/**
* The StorageEngine class is the top level interface for creating a new storage
* engine. All StorageEngine(s) must be registered by calling registerFactory in order
* to possibly be activated.
*/
class StorageEngine {
public:
class Factory { /*ストレージエンジンインスタンスのファクトリ*/
public:
virtual ~Factory() { }
virtual StorageEngine* create(const StorageGlobalParams& params,
const StorageEngineLockFile& lockFile) const = 0;
...
virtual void finishInit() {} /*ストレージエンジンで実装すべき関数*/
virtual RecoveryUnit* newRecoveryUnit() = 0; /*ストレージエンジンで実装すべき関数*/
virtual void listDatabases( std::vector<std::string>* out ) const = 0; /*ストレージエンジンで実装すべき関数*/
...
MMAPv1やWiredTigerはこのインターフェースを実装している
MMAPv1の実装のソースコード(抜粋)
https://github.com/mongodb/mongo/blob/v3.0/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h
class MMAPV1Engine : public StorageEngine { /*継承している*/
public:
MMAPV1Engine(const StorageEngineLockFile& lockFile);
virtual ~MMAPV1Engine();
void finishInit();
RecoveryUnit* newRecoveryUnit();
他のストレージエンジン
ObjectRocketではROCKSDBというものも簡単に利用できるようだ。
ちなみにObjectRocketはRackspace社が出している、MongoDB専用にチューニングされたDBサービスだったはず。