RocksDB-Cloud-etäkompaktit

(Hieu Pham) (10.6.) , 2020)

Johdanto

RocksDB on LSM-tallennusmoottori, jonka kasvun on lisääntynyt valtavasti viime vuosina . RocksDB-Cloud on avoimen lähdekoodin ja täysin yhteensopiva RocksDB: n kanssa, sillä lisäominaisuus, että kaikki tiedot tehdään kestäviksi tallentamalla ne automaattisesti pilvitallennustilaan (esim. Amazon S3).

Me Rocksetillä käytämme RocksDB-Cloud on yksi Rocksetin jaetun Yhdistetyn indeksin rakennuspalikoista. Rockset on suunniteltu pilvipohjaisten periaatteiden mukaisesti, ja yksi pilvipohjaisen tietokannan ensisijaisista suunnitteluperiaatteista on laskennan erottaminen tallennustilasta. Keskustelemme siitä, kuinka laajensimme RocksDB-Cloudia siten, että sen varastotarpeet ja laskentatarpeet erotettiin selkeästi.

Yhdysvaltain merivoimien Seabeesin käyttämä tiivistys, joka suorittaa maaperän tiivistämisen

RocksDB: n LSM-moottori

RocksDB-Cloud tallentaa tietoja paikallisesti liitettyihin SSD- tai pyöriviin levyihin. SSD tai pyörivä levy tarjoaa tallennustilaa, jota tarvitaan palvelemiesi tietojen tallentamiseen. Uudet kirjoitukset RocksDB-Cloudiin kirjoitetaan muistin muistitaululle, ja kun muistitaulukko on täynnä, se huuhdellaan uudeksi SST-tiedostoksi tallennustilassa.

Koska se on LSM-tallennusmoottori, sarja tiivistämiseen käytetään tiivistämiseen, ja tiivistäminen on prosessi, jossa yhdistetään joukko SST-tiedostoja ja luodaan uudet SST-tiedostot korvattuilla ja poistetuilla avaimilla, jotka on puhdistettu tulostetiedostoista. Tiivistäminen vaatii paljon laskentaresursseja. Mitä korkeampi kirjoitusnopeus tietokantaan, sitä enemmän laskentaresursseja tarvitaan tiivistämiseen, koska järjestelmä on vakaa vain, jos tiivistys pystyy pysymään mukana tietokantasi uusissa kirjoituksissa.

Ongelma, kun laskentaa ja tallennusta ei ole eritelty

Tyypillisessä RocksDB-pohjainen järjestelmä, tiivistys tapahtuu suorittimilla, jotka ovat paikallisia myös palvelinta, joka isännöi myös tallennustilaa. Tässä tapauksessa laskentaa ja tallennustilaa ei ole eroteltu. Tämä tarkoittaa sitä, että jos kirjoitusnopeutesi kasvaa, mutta tietokannan koko pysyy samana, joudut dynaamisesti tarjoamaan lisää palvelimia, levittämään tietosi kaikkiin näihin palvelimiin ja hyödyntämään sitten näiden palvelimien ylimääräistä laskutoimitusta pysyäksesi ajan tasalla. tiivistyskuormitus.

Tässä on kaksi ongelmaa:

  • Tietojesi levittäminen useampaan palvelimeen ei ole välitöntä, koska sinun on kopioitava paljon tietoja. Tämä tarkoittaa, että et voi reagoida nopeasti muuttuvaan työmäärään.
  • Kunkin palvelimesi tallennuskapasiteetin käyttöaste on hyvin alhainen, koska levität tietojasi useammalle palvelimelle. Menetät hinnan ja suorituskyvyn suhteen palvelimillesi käyttämättömän tallennustilan vuoksi.

Ratkaisumme

Ensisijainen syy miksi RocksDB-Cloud sopii tiivistyslaskennan ja tallennuksen erottamiseksi johtuu siitä, että se on LSM-tallennusmoottori. Toisin kuin B-Tree-tietokanta, RocksDB-Cloud ei koskaan päivitä SST-tiedostoa, kun se on luotu. Tämä tarkoittaa, että kaikki koko järjestelmän kaikki SST-tiedostot ovat vain luku -muodossa paitsi aktiivisen muistitaulukon pienet tiedot. RocksDB-Cloud säilyttää kaikki SST-tiedostot pilvitallennusobjektikaupassa, kuten S3, ja nämä pilviobjektit ovat turvallisesti käytettävissä kaikilta palvelimiltasi, koska ne ovat vain luku -tilassa.

Ajatuksemme on, että jos RocksDB -Pilvipalvelin A voi kapseloida tiivistystyön pilviobjektijoukkoonsa ja lähettää sitten pyynnön valtiottomalle etäpalvelimelle B – ja että palvelin B voi hakea olennaiset objektit pilvivarastosta, tehdä tiivistämisen, tuottaa joukon ulostuloja SST-tiedostot, jotka kirjoitetaan takaisin pilviobjektisäilöön ja välittävät sitten nämä tiedot takaisin palvelimelle A – olemme olennaisesti erottaneet tallennustilan (joka sijaitsee palvelimessa A) tiivistyslaskelmasta (joka sijaitsee palvelimessa B). Palvelimella A on tallennustila ja palvelimella B ei ole pysyvää tallennustilaa, vaan vain tiivistämiseen tarvittava laskenta. Voila!

RocksDB liitettävä tiivistys-sovellusliittymä

Laajensimme RocksDB-perusliittymää kahdella uudella menetelmällä, jotka tekevät RocksDB: n tiivistysmoottorista ulkoisesti liitettävän. Kohdassa db.h esitämme uuden sovellusliittymän tiivistyspalvelun rekisteröimiseksi.

Status RegisterPluggableCompactionService(std::unique_ptr);

Tämä sovellusliittymä rekisteröi laajennuksen, jota RocksDB suorittaa tiivistystyössä. Etätiivistys tapahtuu kahdessa vaiheessa: Run ja InstallFiles. Näin ollen laajennuksella PluggableCompactionService olisi kaksi sovellusliittymää:

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 on paikka, jossa tiivistys suoritetaan.Tiivistysarkkitehtuurissamme Run lähettäisi RPC: n etätiheysasteelle ja saisi tiivistystuloksen, jolla on muun muassa luettelo uusista tiivistetyistä SST-tiedostoista.

InstallFiles on paikka, johon RocksDB asentaa uudet tiivistetyt SST-tiedostot pilvestä (remote_paths) paikalliseen tietokantaansa (local_paths).

Rocksetin tiivistystaso

Nyt näytämme, kuinka käytimme edellä kuvattua liitettävää tiivistyspalvelua Rocksetin tiivistyspalvelussa. Kuten edellä mainittiin, ensimmäinen vaihe, Run, lähettää RPC: n etätiivistysasteelle tiivistystiedoilla, kuten syötettyjen SST-tiedostojen nimillä ja pakkaustiedoilla. Kutsumme isäntää, joka suorittaa tämän tiivistystyön, pakkaajaksi.

tiivistin avatessaan tiivistyspyynnön avaisi RocksDB-Cloud-ilmentymän haamu -tila. Tämä tarkoittaa, että RocksDB-Cloud avaa paikallisen tietokannan vain tarvittavilla metatiedoilla noutamatta kaikkia SST-tiedostoja pilvitallennustilasta. Kun se avaa RocksDB-ilmentymän haamu -tilassa, se suorittaa tiivistystyön, mukaan lukien tarvittavien SST-tiedostojen hakemisen, tiivistää ne ja lataa äskettäin tiivistetyt SST-tiedostot väliaikaiseen pilvipalveluun.

Tässä ovat vaihtoehdot RocksDB-Cloudin avaamiseksi tiivistimessä :

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;

Haasteita on useita tiivistysasteen ja ratkaisujemme kehittämisen aikana:

Paranna RocksDB-Cloudin avaamisen nopeutta ghost issa mode

RocksDB-ilmentymien avaamisen aikana kaikkien SST-tiedostojen hakemisen lisäksi pilvestä (jonka olemme poistaneet käytöstä ghost -tila), on olemassa monia muita toimintoja, jotka voivat hidastaa avaamista, etenkin saada luettelo SST-tiedostoista ja saada kunkin SST-tiedoston koko. Tavallisesti, jos kaikki SST-tiedostot sijaitsevat paikallisessa tallennustilassa, näiden get-file-size-operaatioiden viive olisi pieni. Kuitenkin, kun tiivistin avaa RocksDB-Cloudin, jokainen näistä toiminnoista johtaisi etäpyyntöön pilvitallennustilaan, ja yhdistetty kokonaisviive tulee kohtuuttoman kalliiksi. Kokemuksemme mukaan RocksDB-Cloud-ilmentymälle, jossa on tuhansia SST-tiedostoja, avaaminen kestää jopa minuutin, koska tuhannet get-file-size-pyynnöt S3: lle. Tämän rajoituksen kiertämiseksi otimme käyttöön RocksDB-Cloud-vaihtoehdoissa useita vaihtoehtoja näiden RPC: ien poistamiseksi käytöstä avaamisen aikana. Tämän seurauksena keskimääräinen avautumisaika on 7 sekunnista 700 millisekuntiin.

Poista L0 -> L0 tiivistys käytöstä

Etätiivistys on kompromissi yhden tiivistämisen nopeuden ja kyvyn suorittaa enemmän tiivistystöitä rinnakkain. Se johtuu luonnollisesti siitä, että kukin etätiivistystyö olisi hitaampi kuin sama paikallisesti suoritettu tiivistys pilvipalvelun tiedonsiirron kustannusten vuoksi. Siksi haluaisimme minimoida tiivistysprosessin pullonkaulan, jossa RocksDB-Cloud ei voi rinnakkaistua, mahdollisimman paljon.

LSM-arkkitehtuurissa L0-> L1-tiivistys ei yleensä ole rinnakkaistettavissa, koska L0-tiedostoilla on päällekkäisiä alueita. Näin ollen, kun L0-> L1-tiivistystä tapahtuu, RocksDB-Cloud pystyy suorittamaan myös L0-> L0-tiivistämisen, tavoitteena vähentää L0-tiedostojen määrää ja estää kirjoituspysähdyksiä, koska RocksDB-Cloud osuu L0-tiedostoon raja. Kompromissi on kuitenkin, että jokainen L0-tiedosto kasvaa suuremmaksi jokaisen L0-> L0-tiivistämisen jälkeen.

Kokemuksemme mukaan tämä vaihtoehto aiheuttaa enemmän ongelmia kuin sen tuomat edut, koska suurempien L0-tiedostojen käyttäminen johtaa paljon pidempään L0-> L1-tiivistymiseen, mikä pahentaa RocksDB-Cloudin pullonkaulaa. Siksi poistamme L0-> L0-tiivistämisen käytöstä ja elämme sen sijaan harvinaisen ongelman kanssa, että kirjoitus jumittuu. Kokemuksestamme RocksDB-Cloud-tiivistys saavuttaa saapuvat kirjoitukset paljon paremmin.

Voit käyttää sitä nyt

RocksDB-Cloud on avoimen lähdekoodin projekti, joten työmme voi muiden RocksDB-kehittäjien avulla, jotka haluavat hyötyä erottamalla tiivistyslaskennan varastotarpeistaan. Käytämme etätiivistyspalvelua tuotannossa. Se on saatavana RocksDB-Cloud-version 6.7.3 julkaisulla. Keskustelemme kaikista asioista RocksDB-Cloudista julkisella Slack-kanavalla osoitteessa http://bit.ly/rockset-community-channel .

Tekijät:

Hieu Pham – ohjelmistoinsinööri, Rockset
Dhruba Borthakur – johtaja, Rockset

Alun perin julkaistu osoitteessa https: // rockset.com 4. kesäkuuta 2020.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *