Combinación de asociaciones BlueStore, BlueFS y rocksdb

Etiqueta: ceph 12.2.4

Inicialización del espacio BlueStore

Gestión del espacio en disco de BlueStore

Descripción general

  1. El directorio de montaje OSD se administra según el sistema de archivos, y las áreas de espacio lento, WAL y DB se administran según el disco desnudo;
  2. Área lenta: este tipo de espacio se utiliza principalmente para almacenar datos de objetos y es administrado por BlueStore, que se asigna al segmento de espacio BlueFS y se administra mediante la estructura bluefs_extents;
  3. Área WAL: administrada solo por BlueFS e invisible para BlueStore. El propio BlueFS es responsable de la inicialización cuando está encendido. Para archivos .log y registros generados por él mismo, BlueFS prefiere usar el espacio del dispositivo tipo WAL. Si no existe o el espacio del dispositivo WAL es insuficiente. Luego baje la versión paso a paso para seleccionar particiones DB y LENTA;
  4. Área de base de datos: administrado solo por BlueFS e invisible para BlueStore, el propio BlueFS es responsable de la inicialización al encender; para archivos .sst, se prefiere el espacio del dispositivo tipo DB, si no existe o el espacio del dispositivo DB es insuficiente, seleccione el Espacio de dispositivo de tipo lento;
  5. rocksdb: basado en el motor de almacenamiento KV del sistema de archivos, BlueStore llama a la interfaz externa;
  6. BlueStore admite rocksdb, implementa el pequeño sistema de archivos BlueFS e implementa BlueRocksEnv para proporcionar el paquete del sistema subyacente para rocksdb;
  7. BlueFS: estructura organizativa de directorio plano y jerarquía de archivos (en forma de árbol), para ubicar un archivo específico se requieren dos búsquedas: busque la carpeta de nivel inferior donde se encuentra el archivo a través de dir_map; luego busque el archivo correspondiente en file_map debajo de la carpeta; cada archivo gestión de estructura bluefs_fnode_t, el atributo de extensiones indica la colección de segmentos físicos en el disco y el atributo prefer_bdev indica el dispositivo de bloque preferido para almacenar el archivo; el atributo bdev en cada extensión de la colección de extensiones identifica el dispositivo al que pertenece y cada archivo puede usar múltiples bloques diferentes Espacio del dispositivo (WAL, DB y lento); el método BlueFS:_allocate especifica el valor del atributo bdev_ en cada extensión; encienda nuevamente, fije la posición de entrada a través del segundo espacio de almacenamiento de 4K (superbloque) de la partición DB a través de BlueFS::_replay, y la reproducción del contenido del archivo de registro de lectura restaura los metadatos (dir_map, file_map).

proceso de inicialización

[ceph_osd.cc]
int main(int argc, const char **argv)
>> OSD::mkfs(g_ceph_context, store, g_conf->osd_data, mc.monmap.fsid, whoami);

[OSD.cc]
int OSD::mkfs(CephContext *cct, ObjectStore *store, const string &dev, uuid_d fsid, 
  int whoami)
>> store->mkfs();
>> store->mount();

[BlueStore.cc]
int BlueStore::mkfs()
>> _setup_block_symlink_or_file("block", cct->_conf->bluestore_block_path,
	cct->_conf->bluestore_block_size, cct->_conf->bluestore_block_create);
>> _setup_block_symlink_or_file("block.wal", cct->_conf->bluestore_block_wal_path,
	cct->_conf->bluestore_block_wal_size, cct->_conf->bluestore_block_wal_create);
>> _setup_block_symlink_or_file("block.db", cct->_conf->bluestore_block_db_path,
	cct->_conf->bluestore_block_db_size, cct->_conf->bluestore_block_db_create);
>> _open_db(true);
>> _open_fm(true);  初始化FreelistManager

[BlueStore.cc]
int BlueStore::_open_db(bool create)
>> if (do_bluefs):
   >> bluefs = new BlueFS(cct);
   >> bluefs->add_block_device(BlueFS::BDEV_DB, bfn);
>> if (create): bluefs->add_block_extent(BlueFS::BDEV_DB, SUPER_RESERVED, 
                   bluefs->get_block_device_size(BlueFS::BDEV_DB) - SUPER_RESERVED);
>> if (create):
   >> bluefs->add_block_extent(bluefs_shared_bdev, start, initial);
   >> bluefs_extents.insert(start, initial);
>> if (create):
   >> bluefs->add_block_extent(BlueFS::BDEV_WAL, BDEV_LABEL_BLOCK_SIZE, 
         bluefs->get_block_device_size(BlueFS::BDEV_WAL) - BDEV_LABEL_BLOCK_SIZE);
>> if (create): bluefs->mkfs(fsid);
>> bluefs->mount();

[BlueFS.cc]
int BlueFS::mkfs(uuid_d osd_uuid)
>> _init_alloc();
>> 设置superblock信息
>> 初始化log_file

[BlueFS.cc]
int BlueFS::mount()
>> _init_alloc();
>> _replay(false);
>> for (auto& p : file_map):
    for (auto& q : p.second->fnode.extents):
      alloc[q.bdev]->init_rm_free(q.offset, q.length);
>> log_writer = _create_writer(_get_file(1));

[BlueFS.cc]
int BlueFS::_replay(bool noop)
>> 逐个回放事务op

BlueStore llama a interfaces relacionadas con rocksdb

RocksDBStore implementa la interfaz KeyValueDB y BlueStore implementa operaciones de rocksdb a través de RocksDBStore.

operación abierta

[BlueStore.cc]
int BlueStore::_open_db(bool create)
>> db = KeyValueDB::create(cct, kv_backend, fn, static_cast<void*>(env));
>> if (create): db->create_and_open(err);

[RocksDBStore.cc]
int RocksDBStore::create_and_open(ostream &out)
>> do_open(out, true);

[RocksDBStore.cc]
int RocksDBStore::do_open(ostream &out, bool create_if_missing)
>> rocksdb::DB::Open(opt, path, &db);

operación de lectura

[BlueStore.cc]
int BlueStore::read(const coll_t& cid, const ghobject_t& oid,
  uint64_t offset, size_t length, bufferlist& bl, uint32_t op_flags)
>> read(c, oid, offset, length, bl, op_flags);

[BlueStore.cc]
int BlueStore::read(CollectionHandle &c_, const ghobject_t& oid,
  uint64_t offset, size_t length, bufferlist& bl, uint32_t op_flags)
>> OnodeRef o = c->get_onode(oid, false);
>> _do_read(c, o, offset, length, bl, op_flags);
[注]
每个Onode包含一个ExtentMap,每个ExtentMap包含若干个Extent,
每个Extent负责管理一段逻辑范围内的数据并管理一个Blob,
由Blob通过若干个pextent负责将数据映射到磁盘

[BlueStore.cc]
BlueStore::OnodeRef BlueStore::Collection::get_onode(const ghobject_t& oid, bool create)
>> store->db->get(PREFIX_OBJ, key.c_str(), key.size(), &v);

[KeyValueDB.h]
virtual int get(const string &prefix,const char *key, size_t keylen, bufferlist *value)
>> get(prefix, string(key, keylen), value);

[KeyValueDB.h]
virtual int get(const std::string &prefix, const std::string &key, bufferlist *value)
>> get(prefix, ks, &om);

[RocksDBStore.cc]
int RocksDBStore::get(const string &prefix,
    const string &key, bufferlist *out)
>> db->Get(rocksdb::ReadOptions(), rocksdb::Slice(k), &value);

operación de escritura

[BlueStore.cc]
void BlueStore::_kv_sync_thread()
>> db->submit_transaction_sync(synct);

[KeyValueDB.h]
virtual int submit_transaction_sync(Transaction t)
>> submit_transaction(t);

[RocksDBStore.cc]
int RocksDBStore::submit_transaction(KeyValueDB::Transaction t)
>> db->Write(woptions, &_t->bat);

eliminar operación

Eliminar el par clave-valor de metadatos especificado de la base de datos

[BlueStore.cc]
int BlueStore::_remove(TransContext *txc, CollectionRef& c, OnodeRef &o)
>> _do_remove(txc, c, o);

[BlueStore.cc]
int BlueStore::_do_remove(TransContext *txc,
  CollectionRef& c, OnodeRef o)
>> txc->t->rmkey(PREFIX_OBJ, o->key.c_str(), o->key.size());

[KeyValueDB.h]
virtual void rmkey(const std::string &prefix,   
  const char *k, size_t keylen)
>> rmkey(prefix, string(k, keylen));

[RocksDBStore.cc]
void RocksDBStore::RocksDBTransactionImpl::rmkey(const string &prefix, const string &k)
>> bat.Delete(combine_strings(prefix, k));

funcionamiento compacto

Los comandos relacionados con OSD (asok_command) se pueden usar en la línea de comando del cliente

[BlueStore.h]
void compact() override
>> db->compact();

[RocksDBStore.cc]
void RocksDBStore::compact()
>> db->CompactRange(options, nullptr, nullptr);

[referencias]

  1. "Principios de diseño e implementación de Ceph" Capítulo 2 El pico de rendimiento: nuevo motor de almacenamiento de objetos BlueStore

Supongo que te gusta

Origin blog.csdn.net/weixin_43778179/article/details/132669982
Recomendado
Clasificación