Ceph 原始碼分析 -OS module
阿新 • • 發佈:2019-02-20
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檔案來看一下其實如何執行的:
在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 函式,後面會詳細介紹。
這是一個建立collection的程式碼 先通過一個transaction 來建立,之後通過 store 的 apply_transaction 函式來應用日誌,來完成建立一個collection。ObjectStore::Transaction t; t.create_collection(cid); cerr << "create collection" << std::endl; r = store->apply_transaction(t); ASSERT_EQ(r, 0);
同樣的,可以通過transaction的介面touch來在一個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); }
在store_test.cc測試檔案中,還有其它的測試操作其包括:
- 建立/刪除一個collection
- 建立/刪除一個collection 的 object
- omap的set/get , 這裡 omap也許不容易理解,就是key/value 的map隊儲存在object 中,所以叫omap
- 屬性的set/get
- 其它collection的操作,這裡就不詳述。