Remote Compactions in RocksDB-Cloud

(Hieu Pham) (10 giugno , 2020)

Introduzione

RocksDB è un motore di archiviazione LSM la cui crescita ha proliferata enormemente negli ultimi anni . RocksDB-Cloud è open source ed è completamente compatibile con RocksDB, con la caratteristica aggiuntiva che tutti i dati sono resi durevoli archiviandoli automaticamente nel cloud storage (ad esempio Amazon S3).

Noi di Rockset utilizziamo RocksDB-Cloud come uno degli elementi costitutivi dell Indice convergente distribuito di Rockset. Rockset è progettato con principi nativi per il cloud e uno dei principi di progettazione primari di un database nativo per il cloud è la separazione del calcolo dallo storage. Discuteremo di come abbiamo esteso RocksDB-Cloud per avere una netta separazione tra le sue esigenze di archiviazione e le sue esigenze di calcolo.

Un compattatore, gestito dalla US Navy Seabees, che esegue la compattazione del suolo

Motore LSM di RocksDB

RocksDB-Cloud archivia i dati in SSD o dischi rotanti collegati localmente. LSSD o il disco rotante fornisce lo spazio di archiviazione necessario per archiviare i dati che serve. Le nuove scritture su RocksDB-Cloud vengono scritte su una memtable in memoria, quindi quando la memtable è piena, viene scaricata in un nuovo file SST nella memoria.

Essendo uno storage engine LSM, un set di thread in background vengono utilizzati per la compattazione e la compattazione è un processo di combinazione di un set di file SST e generazione di nuovi file SST con chiavi sovrascritte e chiavi eliminate eliminate dai file di output. La compattazione richiede molte risorse di calcolo. Maggiore è la velocità di scrittura nel database, più risorse di calcolo sono necessarie per la compattazione, perché il sistema è stabile solo se la compattazione è in grado di tenere il passo con le nuove scritture sul database.

Il problema quando calcolo e archiviazione non sono disaggregati

In un tipico Sistema basato su RocksDB, la compattazione avviene sulle CPU che sono locali sul server che ospita anche lo storage. In questo caso, il calcolo e larchiviazione non vengono disaggregati. E questo significa che se la tua velocità di scrittura aumenta ma la dimensione totale del tuo database rimane la stessa, dovresti fornire dinamicamente più server, diffondere i tuoi dati in tutti quei server e quindi sfruttare il calcolo aggiuntivo su questi server per stare al passo con il carico di compattazione.

Questo ha due problemi:

  • La diffusione dei tuoi dati su più server non è istantanea perché devi copiare molti dati per farlo. Ciò significa che non puoi reagire rapidamente a un carico di lavoro in rapida evoluzione.
  • Lutilizzo della capacità di archiviazione su ciascuno dei tuoi server diventa molto basso perché stai distribuendo i tuoi dati a più server. Perdi il rapporto prezzo / prestazioni a causa di tutto lo spazio di archiviazione inutilizzato sui tuoi server.

La nostra soluzione

Il motivo principale per cui RocksDB-Cloud è adatto per separare il calcolo della compattazione e larchiviazione è perché è un motore di archiviazione LSM. A differenza di un database B-Tree, RocksDB-Cloud non aggiorna mai un file SST una volta creato. Ciò significa che tutti i file SST dellintero sistema sono di sola lettura tranne la minuscola porzione di dati nel memtable attivo. RocksDB-Cloud conserva tutti i file SST in un archivio di oggetti di archiviazione cloud come S3 e questi oggetti cloud sono accessibili in modo sicuro da tutti i tuoi server perché sono di sola lettura.

Quindi, la nostra idea è che se un RocksDB -Il server cloud A può incapsulare un lavoro di compattazione con il suo set di oggetti cloud e quindi inviare la richiesta a un server remoto senza stato B-e quel server B può recuperare gli oggetti rilevanti dal cloud store, eseguire la compattazione, produrre un set di output File SST che vengono riscritti nellarchivio oggetti cloud e quindi comunicano tali informazioni al server A: abbiamo sostanzialmente separato larchiviazione (che risiede nel server A) dal calcolo di compattazione (che risiede nel server B). Il server A ha la memoria e mentre il server B non ha una memoria permanente ma solo il calcolo necessario per la compattazione. Voilà!

API di compattazione RocksDB pluggable

Abbiamo esteso lAPI RocksDB di base con due nuovi metodi che rendono il motore di compattazione in RocksDB collegabile esternamente. In db.h , introduciamo una nuova API per registrare un servizio di compattazione.

Status RegisterPluggableCompactionService(std::unique_ptr);

Questa API registra il plug-in utilizzato per eseguire il lavoro di compattazione da RocksDB. La compattazione remota avviene in due passaggi: Run e InstallFiles. Pertanto, il plug-in, PluggableCompactionService , avrebbe 2 API:

Status Run(const PluggableCompactionParam& job, PluggableCompactionResult* result) std::vector InstallFiles(
const std::vector& remote_paths,
const std::vector& local_paths,
const EnvOptions& env_options, Env* local_env)

Run è dove avviene lesecuzione della compattazione.Nella nostra architettura di compattazione remota, Run invia un RPC a un livello di compattazione remoto e riceve un risultato di compattazione che ha, tra le altre cose, lelenco dei file SST appena compattati.

InstallFiles è dove RocksDB installa i file SST appena compattati dal cloud (remote_paths) nel suo database locale (local_paths).

Livello di compattazione Rockset

Ora mostreremo come abbiamo utilizzato il servizio di compattazione innestabile descritto sopra nel servizio di compattazione Rockset. Come accennato in precedenza, il primo passaggio, Run, invia un RPC a un livello di compattazione remoto con informazioni sulla compattazione come nomi di file SST di input e informazioni sulla compressione. Chiamiamo lhost che esegue questo lavoro di compattazione un compattatore.

Il compattatore , dopo aver ricevuto la richiesta di compattazione, aprirà unistanza RocksDB-Cloud in modalità fantasma . Ciò significa che RocksDB-Cloud apre il database locale con solo i metadati necessari senza recuperare tutti i file SST dal cloud storage. Una volta aperta listanza RocksDB in modalità ghost , eseguirà il lavoro di compattazione, incluso il recupero dei file SST richiesti, li compatterà e carica i file SST appena compattati in una memoria temporanea nel cloud.

Ecco le opzioni per aprire RocksDB-Cloud nel compactor :

rocksdb::CloudOptions cloud_options; cloud_options.ephemeral_resync_on_open = false; cloud_options.constant_sst_file_size_in_sst_file_manager = 1024; cloud_options.skip_cloud_files_in_getchildren = true;rocksdb::Options rocksdb_options;
rocksdb_options.max_open_files = 0; rocksdb_options.disable_auto_compactions = true; rocksdb_options.skip_stats_update_on_db_open = true; rocksdb_options.paranoid_checks = false; rocksdb_options.compaction_readahead_size = 10 * 1024 * 1024;

Ci sono più sfide abbiamo affrontato durante lo sviluppo del livello di compattazione e le nostre soluzioni:

Migliorare la velocità di apertura di RocksDB-Cloud in ghost mode

Durante lapertura di unistanza RocksDB, oltre a recuperare tutti i file SST dal cloud (che abbiamo disabilitato con ghost mode), ci sono molte altre operazioni che potrebbero rallentare il processo di apertura, in particolare ottenere lelenco dei file SST e ottenere la dimensione di ogni file SST. Di solito, se tutti i file SST risiedono nella memoria locale, la latenza di queste operazioni di recupero delle dimensioni dei file sarebbe ridotta. Tuttavia, quando il compattatore apre RocksDB-Cloud, ciascuna di queste operazioni comporterebbe una richiesta remota allo storage cloud e la latenza totale combinata diventa proibitivamente costosa. Nella nostra esperienza, per unistanza RocksDB-Cloud con migliaia di file SST, lapertura richiederebbe fino a un minuto a causa di migliaia di richieste get-file-size a S3. Per aggirare questa limitazione, abbiamo introdotto varie opzioni nelle opzioni RocksDB-Cloud per disabilitare questi RPC durante lapertura. Di conseguenza, il tempo di apertura medio va da 7 secondi a 700 millisecondi.

Disabilita compattazione L0 -> L0

La compattazione remota è un compromesso tra la velocità di una singola compattazione e la capacità di eseguire più lavori di compattazione in parallelo. È perché, naturalmente, ogni lavoro di compattazione remoto sarebbe più lento della stessa compattazione eseguita localmente a causa del costo del trasferimento dei dati nel cloud. Pertanto, vorremmo ridurre al minimo il collo di bottiglia del processo di compattazione, dove RocksDB-Cloud non può parallelizzare il più possibile.

Nellarchitettura LSM, la compattazione L0-> L1 di solito non è parallelizzabile perché I file L0 hanno intervalli sovrapposti. Quindi, quando si verifica una compattazione L0-> L1, RocksDB-Cloud ha la capacità di eseguire anche la compattazione L0-> L0, con lobiettivo di ridurre il numero di file L0 e prevenire blocchi di scrittura dovuti a RocksDB-Cloud che colpisce il file L0 limite. Tuttavia, il compromesso è che ogni file L0 aumenterebbe di dimensioni dopo ogni compattazione L0-> L0.

Nella nostra esperienza, questa opzione causa più problemi rispetto ai vantaggi che porta, perché avere file L0 più grandi si traduce in una compattazione L0-> L1 molto più lunga, peggiorando il collo di bottiglia di RocksDB-Cloud. Quindi, disabilitiamo la compattazione L0-> L0 e viviamo invece con il raro problema dello stallo della scrittura. Dal nostro esperimento, la compattazione RocksDB-Cloud raggiunge molto meglio le scritture in arrivo.

Puoi usarlo ora

RocksDB-Cloud è un progetto open source, quindi il nostro lavoro può essere sfruttato da qualsiasi altro sviluppatore RocksDB che desideri trarre vantaggi separando il proprio calcolo di compattazione dalle proprie esigenze di archiviazione. Attualmente stiamo eseguendo il servizio di compattazione remota in produzione. È disponibile con la versione 6.7.3 di RocksDB-Cloud. Discutiamo di tutto su RocksDB-Cloud nel canale pubblico di Slack su http://bit.ly/rockset-community-channel .

Autori:

Hieu Pham – Software Engineer, Rockset
Dhruba Borthakur – CTO, Rockset

Pubblicato originariamente su https: // rockset.com il 4 giugno 2020.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *