Ceph的src/os 中保存了 ObjectStore代码实现。
基本概念
对象
对象存储的概念,把对象作为存储的实体。 在Ceph 文件系统里,对象的命名空间分了两层, 第一层是Collection的概念,一个Collection就是许多Object的集合,相当于其他对象存储的group的概念,用coll_t来标识。
ObjectStore 类 就代表了一个Object, 其继承关系为 FileStore 继承了 JournalingObjectStore,JournalingObjectStore继承了ObjectStore
事务
Transaction类代表了一个事务操作。所有的操作都必须通过一个transaction来执行。 一个transaction几乎实现了所有对对象和集合的操作。
ObjectMap的概念
ObjectMap, 就是一些key,value的map属性,其保存在Object里面。 在Ceph文件系统了,ObjectMap由levelDB这个google开源的KV数据库来实现。
还有一个attributes的 概念,attributes也是一些 key/value的属性值。
首先看一下对外的接口,我们可以通过src/test/filestore/store_test.cc文件来看一下其实如何运行的:
virtual void SetUp() {
::mkdir("store_test_temp_dir", 0777);
ObjectStore *store_ = new FileStore(string("store_test_temp_dir"), string("store_test_temp_journal"));
store.reset(store_);
store->mkfs();
store->mount();
}
首先mkdir一个目录,store_test_temp_dir, 新建一个FileStore对象,其后面的参数分别是:文件的目录和日志的目录,分别也可以是一个block device. 调用mkfs 函数和 mount 函数,后面会详细介绍。
ObjectStore::Transaction t;
t.create_collection(cid);
cerr << "create collection" << std::endl;
r = store->apply_transaction(t);
ASSERT_EQ(r, 0);
这是一个创建collection的代码 先通过一个transaction 来创建,之后通过 store 的 apply_transaction 函数来应用日志,来完成创建一个collection。
hobject_t hoid(sobject_t("Object 1", CEPH_NOSNAP));
{
ObjectStore::Transaction t;
t.touch(cid, hoid);
cerr << "Creating object " << hoid << std::endl;
r = store->apply_transaction(t);
ASSERT_EQ(r, 0);
}
同样的,可以通过transaction的接口touch来在一个collection 中创建一个对象。
在store_test.cc测试文件中,还有其它的测试操作其包括:
- 创建/删除一个collection
- 创建/删除一个collection 的 object
- omap的set/get , 这里 omap也许不容易理解,就是key/value 的map队保存在object 中,所以叫omap
- 属性的set/get
- 其它collection的操作,这里就不详述。
总之,通过store_test.cc的测试文件,可以清晰的了解Object的对外的接口。