MongoDB 3的存储API是什么意思?
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进行调整的数据库服务。