BlueStore数据组织形式及缓存

Tag: ceph 12.2.4

BlueStore元数据结构

元数据Onode到硬盘映射关系


元数据

其中两个类型元数据:Collection和Onode:

  • Collection,即PG在BlueStore内存管理结构,Collection数量有限常驻内存;Collection与PG一对一;
  • Onode,即对象内存管理结构,无法将所有Onode常驻内存,结合淘汰算法进行缓存;Onode与对象一对一;

Collection通过OnodeSpace对应其归属的多个Onode,且存于BlueStore::coll_map结构,例:

[BlueStore.cc]
int BlueStore::_open_collections(int *errors)
>> KeyValueDB::Iterator it = db->get_iterator(PREFIX_COLL);
>> for (it->upper_bound(string()); it->valid(); it->next()):
     CollectionRef c(new Collection(this, cache_shards[cid.hash_to_shard(cache_shards.size())], cid));
     coll_map[cid] = c;

缓存

object对象数据存取到裸盘,涉及到实际数据bufferlist和元数据Onode;

实际数据通过Buffer结构(offset,len, bufferlist)进行缓存;

缓存Cache元素

  • Onode,元数据,缓存机制LRU,利用单个链表实现,a)新数据插入到链表头部,b)缓存命中,则将数据移到链表头部;c)列表满,从链表尾部删除。
  • Buffer,实际数据,缓存机制2Q,实现使用三个链表,buffer_hot、buffer_warm_in和buffer_warm_out。

Blob与实际数据联系

  • 属性sharedblob指向SharedBlob,SharedBlob包含BufferSpace,BufferSpace通过内部buffer_map对应到Buffer;
  • 属性blob通过PExtentVector(bluestore_pextent_t)记录实际数据到磁盘空间的映射;

Buffer状态

  • STATE_EMPTY:Buffer无数据,若Cache类型为2Q,则表明对应Buffer已经淘汰,位于buffer_warm_out;
  • STATE_CLEAN: Buffer数据与磁盘中数据一致
  • STATE_WRITING:Buffer数据正处于写状态,写操作完成,状态转换为STATE_CLEAN;

Buffer状态转换

Cache初始化

[OSD.cc]
int OSD::init()
>> store->set_cache_shards(get_num_op_shards());

[BlueStore.cc]
void BlueStore::set_cache_shards(unsigned num)
>> for (unsigned i = old; i < num; ++i):
       cache_shards[i] = Cache::create(cct, cct->_conf->bluestore_cache_type, logger);
[注] bluestore_cache_type默认2q;

Onode缓存

[BlueStore.cc]
BlueStore::OnodeRef BlueStore::Collection::get_onode(const ghobject_t& oid, bool create)
>> OnodeRef o = onode_map.lookup(oid);
>> store->db->get(PREFIX_OBJ, key.c_str(), key.size(), &v);
>> on = new Onode(this, oid, key);
>> o.reset(on);
>> onode_map.add(oid, o);

[BlueStore.cc]
BlueStore::OnodeRef BlueStore::OnodeSpace::add(const ghobject_t& oid, OnodeRef o)
>> onode_map[oid] = o;
>> cache->_add_onode(o, 1);

[BlueStore.h]
void _add_onode(OnodeRef& o, int level) override
>> if (level > 0): onode_lru.push_front(*o);
>> else: onode_lru.push_back(*o);

Buffer缓存

写后缓存

[BlueStore.cc]
void BlueStore::_txc_finish(TransContext *txc)
>> sb->bc.finish_write(sb->get_cache(), txc->seq);

[BlueStore.cc]
void BlueStore::BufferSpace::finish_write(Cache* cache, uint64_t seq)
 >> b->state = Buffer::STATE_CLEAN;
 >> b->data.reassign_to_mempool(mempool::mempool_bluestore_cache_data);
 >> cache->_add_buffer(b, 1, nullptr);

读后缓存

[BlueStore.cc]
int BlueStore::_do_read(Collection *c, OnodeRef o, uint64_t offset, size_t length,
bufferlist& bl, uint32_t op_flags)
>> if (buffered):
     bptr->shared_blob->bc.did_read(bptr->shared_blob->get_cache(), 0, raw_bl);

[BlueStore.h]
void did_read(Cache* cache, uint32_t offset, bufferlist& bl)
>> Buffer *b = new Buffer(this, Buffer::STATE_CLEAN, 0, offset, bl);
>> _add_buffer(cache, b, 1, nullptr);

另外,mempool统计对应池内存使用情况,如cache关联的bluestore_cache_data、bluestore_cache_onode和bluestore_cache_other。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值