日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ceph存储 ceph Bluestore的架构

發(fā)布時間:2024/8/26 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 ceph存储 ceph Bluestore的架构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ceph 目前是開源社區(qū)比較流行的分布式塊存儲系統(tǒng),其以良好的架構(gòu),穩(wěn)定性和完善的數(shù)據(jù)服務(wù)功能,獲得的了廣泛的部署和應(yīng)用。

目前ceph 最大的問題是其性能相對較差,特別是無法發(fā)揮SSD等高速設(shè)備的硬件的性能。 Ceph 開源社區(qū)一直在優(yōu)化ceph的性能問題。 目前的結(jié)果就是引入了新的object store,這就是最進(jìn)合并入ceph master的BlueStore.

Bluestore的架構(gòu)

如上圖所示 :

BlueStore整體架構(gòu)分為四個部分:

BlockDevice為最底層的塊設(shè)備,BlueStore直接操作塊設(shè)備,拋棄了XFS等本地文件系統(tǒng)。BlockDevice在用戶態(tài)直接以linux系統(tǒng)實(shí)現(xiàn)的AIO直接操作塊設(shè)備文件。
BlueFS是一個小的文件系統(tǒng),其文件系統(tǒng)的文件和目錄的元數(shù)據(jù)都保存在全部緩存在內(nèi)存中,持久化保存在文件系統(tǒng)的日志文件中, 當(dāng)文件系統(tǒng)重新mount時,重新replay該直接,就可以加載所有的元數(shù)據(jù)到內(nèi)存中。其數(shù)據(jù)和日志文件都直接保存在依賴低層的BlockDevice中
RocksDB 是Facebook在leveldb上開發(fā)并優(yōu)化的KV存儲系統(tǒng)。BlueFS的主要的目的,就是支持RocksDB
BlueStore是最終基于RocksDB和BlockDevice實(shí)現(xiàn)的ceph的對象存儲,其所有的元數(shù)據(jù)都保存在RocksDB這個KV存儲系統(tǒng)中,包括collection,對象,omap,磁盤空間分配記錄等都保存RocksDB里, 其對象的數(shù)據(jù)直接保存在BlockDevice

BlockDevice

BlockDevice 塊設(shè)備,其對于一個物理塊設(shè)備(目前也支持用XFS的一個大文件里實(shí)現(xiàn)),用來存儲實(shí)際的數(shù)據(jù)。其實(shí)現(xiàn)在bluestore/BlockDevice.cc 和 bluestore/BlockDevice.h

其主要實(shí)現(xiàn)了異步寫操作,寫操作是通過 操作系統(tǒng)提供的異步io調(diào)用。 由于操作系統(tǒng)支持的aio操作只支持directIO,所以對BlockDevice的寫操作直接寫入磁盤,并且需要按照page對齊。其內(nèi)部有一個aio_thread 線程,用來檢查aio是否完成。其完成后,調(diào)用 aio_callback_t aio_callback; 回調(diào)函數(shù)通知調(diào)用方。
目前BlocekDevice的讀操作是同步讀操作。 有待繼續(xù)實(shí)現(xiàn)異步的讀操作

BlueFS

BlueFs 既然是一個文件系統(tǒng),就要解決的是元數(shù)據(jù)的分配管理,其次解決文件空間的分配和管理,以及磁盤空間的分配和管理。

由于BlueFS用來支持RocksDB,所以就不是一個通用的文件系統(tǒng),它的功能足以支持RocksDB 就可以了。所以它只支持以下功能:

文件只支持順序?qū)?br /> 只支持兩層目錄

BlueFS的元數(shù)據(jù)

BlueFS中,文件的元數(shù)據(jù)由 bluefs_fnode_t 保存

struct bluefs_fnode_t {
  uint64_t ino;  //文件的ino
  uint64_t size;  //文件大小
  utime_t mtime;  // 修改時間
  uint8_t prefer_bdev; //優(yōu)先在該設(shè)備上分配空間
  vector<bluefs_extent_t> extents; //文件在磁盤上分配的空間
  ......
}

bluefs_extents_t 代表在磁盤上的分配的extents
struct bluefs_extent_t {
  uint64_t offset;  //塊設(shè)備上的 extent偏移量
  uint32_t length;  // extent的長度
  uint16_t bdev;   //對于的塊設(shè)備
  ......
}

目錄對應(yīng)的結(jié)構(gòu) Dir

struct Dir {
    map<string,FileRef> file_map;
  };

對于BlueFS

所有的元數(shù)據(jù)(文件和目錄)都需要緩存在內(nèi)存中
所有的元數(shù)據(jù)的修改都記錄在BlueFS的日志中,也就是對于BlueFS,元數(shù)據(jù)的持久化保存在日志中,當(dāng)重新mount文件系統(tǒng)時,只需要replay日志,就可以獲取所有元數(shù)據(jù)

//BlueFS的元數(shù)據(jù)cache
map<string, Dir*> dir_map;                      ///< dirname -> Dir
ceph::unordered_map<uint64_t,FileRef> file_map;  ///< ino -> File

BlueFS的讀寫

uint64_t size = 1048476 * 128;
  string fn = get_temp_bdev(size);
  BlueFS fs;
  ASSERT_EQ(0, fs.add_block_device(0, fn));
  fs.add_block_extent(0, 1048576, size - 1048576);
  uuid_d fsid;
  ASSERT_EQ(0, fs.mkfs(fsid));
  ASSERT_EQ(0, fs.mount());
  {
    BlueFS::FileWriter *h;
    ASSERT_EQ(0, fs.mkdir("dir"));
    ASSERT_EQ(0, fs.open_for_write("dir", "file", &h, false));
    bufferlist bl;
    bl.append("foo");
    h->append(bl);
    bl.append("bar");
    h->append(bl);
    bl.append("baz");
    h->append(bl);
    fs.fsync(h);
    fs.close_writer(h);
  }
  {
    BlueFS::FileReader *h;
    ASSERT_EQ(0, fs.open_for_read("dir", "file", &h));
    bufferlist bl;
    BlueFS::FileReaderBuffer buf(4096);
    ASSERT_EQ(9, fs.read(h, &buf, 0, 1024, &bl, NULL));
    ASSERT_EQ(0, strncmp("foobarbaz", bl.c_str(), 9));
    delete h;
  }
  fs.umount();

上述代碼來自test_bluefs.cc的BlueFS的測試代碼,展示了 BlueFS文件系統(tǒng)的使用。

文件系統(tǒng)調(diào)用函數(shù)fs.add_block_device 來添加設(shè)備到BlueFS中。

創(chuàng)建了以新的BlockDevice
把該設(shè)備添加到bdev列表中,并添加相應(yīng)的IOContext 到ioc中

調(diào)用 fs.add_block_extent把設(shè)備的空間添加到bluefs中
調(diào)用函數(shù)fs.mkdir創(chuàng)建目錄
調(diào)用函數(shù) fs.open_for_write 打開一個文件,如果不存在,就創(chuàng)建
調(diào)用h->append 寫數(shù)據(jù),目前數(shù)據(jù)都只是Cache在內(nèi)存zhong
最后調(diào)用 fs.fsync,本函數(shù)真正的把bluefs的 數(shù)據(jù)和元數(shù)據(jù)寫入磁盤

RocksDB on BlueFS

如何在BlueFS上實(shí)現(xiàn)RocksDB? 對RocksDB, 只要實(shí)現(xiàn) rocksdb::EnvWrapper接口即可。BlueRocksEnv.cc 和 BlueRocksEnv.h 實(shí)現(xiàn)了class BlueRocksEnv 來完成此工作。

Bluestore 實(shí)現(xiàn)

BlueStore的元數(shù)據(jù)

Bluestore的 所有的元數(shù)據(jù)都以KV對的形式寫入RocksDB中,主要有以下的元數(shù)據(jù)

保存BlueStore的超級塊信息,在KV中, 以PREFIX_SUPER為Key的前綴
const string PREFIX_SUPER = “S”; // field -> value
保存Collection的元數(shù)據(jù)信息bluestore_cnode_t
const string PREFIX_COLL = “C”; // collection name -> cnode_t

保存對象的元數(shù)據(jù)信息
const string PREFIX_OBJ = “O”; // object name -> onode_t

需要主要的是,onode 和 enode的信息 都 以PREFIX_OBJ 為前綴,只是同一個對象的onode和 enode的信息的key不同來區(qū)分。

保存 overly 信息
const string PREFIX_OVERLAY = “V”; // u64 + offset -> data

保存對象的omap 信息
const string PREFIX_OMAP = “M”; // u64 + keyname -> value

保存 write ahead log 信息
const string PREFIX_WAL = “L”; // id -> wal_transaction_t

保存塊設(shè)備的空閑extent信息
const string PREFIX_ALLOC = “B”; // u64 offset -> u64 length (freelist)

onode
數(shù)據(jù)結(jié)構(gòu)onode 保存了BlueStore中一個對象的數(shù)據(jù)結(jié)構(gòu),字段和Filestore差不多,這里就不詳細(xì)介紹。
Enode
數(shù)據(jù)結(jié)構(gòu)Enode定義了一個共享的extent,也就是這段數(shù)據(jù)被多個對象共享,一個對象的onode里保存一個enode數(shù)據(jù)結(jié)構(gòu),記錄該對象被共享的extent.這個shared extent 用來對象基于extent的Copy-on-write 機(jī)制

struct Enode : public boost::intrusive::unordered_set_base_hook<> {
    atomic_t nref;    //< reference count
    uint32_t hash;
    string key;      //< key under PREFIX_OBJ where we are stored
    EnodeSet *enode_set;  //< reference to the containing set

    bluestore_extent_ref_map_t ref_map;
    boost::intrusive::unordered_set_member_hook<> map_item;

數(shù)據(jù)結(jié)構(gòu)bluestore_extent_ref_map_t 定義了shared extent 被哪些對象引用

struct bluestore_extent_ref_map_t {
  struct record_t {
    uint32_t length;
    uint32_t refs;
    ...... 
  };
  ......
  map<uint64_t,record_t> ref_map;
}

BlueStore的數(shù)據(jù)讀寫

Bluestore的數(shù)據(jù)寫入分為兩類:

數(shù)據(jù)是整塊覆蓋寫,也就是min_alloc_size對齊的寫入。對于這一類寫入:

重新分配新的存儲空間
把數(shù)據(jù)寫入新分配存儲空間
刪除舊的存儲空間

partial write,在這種情況下,部分塊的寫入,在這種情況下:

overly write
wal write
這種兩種方式都是先把數(shù)據(jù)寫入 KV 存儲中,后續(xù)再apply到實(shí)際的存儲空間中,不同之處在于觸發(fā)條件不同。

總結(jié)

BlueStore 其實(shí)是實(shí)現(xiàn)了用戶態(tài)的一個文件系統(tǒng)。為了實(shí)現(xiàn)簡單,又使用了RocksDB來實(shí)現(xiàn)了BlueStore的 所有的元數(shù)據(jù)的管理,簡化了實(shí)現(xiàn)。

優(yōu)點(diǎn)在于:

對于整塊數(shù)據(jù)的寫入,數(shù)據(jù)直接aio的方式寫入磁盤,避免了filestore的先寫日志,后apply到實(shí)際磁盤的兩次寫盤。
對于隨機(jī)IO,直接WAL的形式,直接寫入RocksDB 高性能的KV存儲中

http://www.cnblogs.com/lucas-sre/p/7096856.html

ceph后端支持多種存儲引擎,以插件式的方式來進(jìn)行管理使用,目前支持filestore,kvstore,memstore以及最新的bluestore,目前默認(rèn)使用的filestore

Ceph OSD從filestore 轉(zhuǎn)換到 bluestore的方法

總結(jié)

以上是生活随笔為你收集整理的ceph存储 ceph Bluestore的架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。