Vzdálené interakce v RocksDB-Cloud

(Hieu Pham) (10. června) , 2020)

Úvod

RocksDB je úložný modul LSM, jehož růst se za posledních několik let ohromně rozšířil . RocksDB-Cloud je open-source a je plně kompatibilní s RocksDB s další funkcí, díky níž jsou všechna data odolná automatickým ukládáním do cloudového úložiště (např. Amazon S3).

My, ve společnosti Rockset, používáme RocksDB-Cloud jako jeden ze stavebních kamenů distribuovaného Converged Index společnosti Rockset. Rockset je navržen s principy nativního cloudu a jedním z primárních principů návrhu cloudové nativní databáze je oddělení výpočetního prostoru od úložiště. Budeme diskutovat o tom, jak jsme rozšířili RocksDB-Cloud, abychom měli čisté oddělení jeho úložných a výpočetních potřeb.

Zhutňovač provozovaný americkým námořnictvem Seabees, který provádí zhutňování půdy

LSM motor RocksDB

RocksDB-Cloud ukládá data na místně připojené SSD nebo rotující disky. SSD nebo rotující disk poskytuje úložiště potřebné k uložení dat, která slouží. Nové zápisy do RocksDB-Cloud se zapisují do paměti v paměti a poté, když je paměť plná, je vyprázdněna do nového souboru SST v úložišti.

Jelikož je to LSM storage engine, set závitů na pozadí se používá ke zhutnění a zhutnění je proces kombinování sady souborů SST a generování nových souborů SST s přepsanými klíči a odstraněnými klíči vymazanými z výstupních souborů. Zhutnění vyžaduje spoustu výpočetních zdrojů. Čím vyšší je rychlost zápisu do databáze, tím více výpočetních prostředků je potřeba pro zhutnění, protože systém je stabilní, pouze pokud je zhutnění schopné držet krok s novými zápisy do vaší databáze.

Problém, když výpočet a úložiště nejsou členěny

V typickém Systém založený na RocksDB, dochází ke zhutnění na CPU, které jsou lokální na serveru, který také hostí úložiště. V takovém případě výpočet a úložiště nejsou členěny. A to znamená, že pokud se vaše rychlost zápisu zvýší, ale celková velikost vaší databáze zůstane stejná, budete muset dynamicky zřídit více serverů, rozšířit svá data na všechny tyto servery a poté využít další výpočet na těchto serverech, abyste drželi krok s zatížení při zhutnění.

To má dva problémy:

  • Rozšíření dat na více serverů není okamžité, protože k tomu musíte zkopírovat velké množství dat. To znamená, že nemůžete rychle reagovat na rychle se měnící pracovní zátěž.
  • Využití kapacity úložiště na každém z vašich serverů je velmi nízké, protože šíříte data na více serverů. Kvůli veškerému nevyužitému úložišti na vašich serverech ztrácíte poměr cena / výkon.

Naše řešení

Primární důvod, proč je RocksDB-Cloud vhodný pro oddělení výpočetního výkonu a úložiště je proto, že se jedná o úložný modul LSM. Na rozdíl od databáze B-Tree RocksDB-Cloud nikdy neaktualizuje soubor SST, jakmile je vytvořen. To znamená, že všechny soubory SST v celém systému jsou jen pro čtení, s výjimkou nepatrné části dat ve vaší aktivní paměti. RocksDB-Cloud přetrvává všechny soubory SST v úložišti objektů cloudového úložiště, jako je S3, a tyto cloudové objekty jsou bezpečně přístupné ze všech vašich serverů, protože jsou jen pro čtení.

Takže, naše myšlenka je, že pokud RocksDB -Cloudový server A může zapouzdřit úlohu zhutnění pomocí své sady cloudových objektů a poté odeslat požadavek na vzdálený bezstavový server B – a tento server B může načíst příslušné objekty z cloudového úložiště, provést zhutnění, vytvořit sadu výstupu Soubory SST, které se zapisují zpět do úložiště cloudových objektů, a poté tyto informace sdělují zpět serveru A – v podstatě jsme oddělili úložiště (které je umístěno na serveru A) od kompaktní výpočetní techniky (která se nachází na serveru B). Server A má úložiště a zatímco server B nemá žádné trvalé úložiště, ale pouze výpočet potřebný pro zhutnění. Voila!

RocksDB plugable compaction API

Rozšířili jsme základní RocksDB API o dvě nové metody, díky nimž je kompaktní stroj v RocksDB externě připojitelný. V db.h představujeme nové API pro registraci kompaktní služby.

Status RegisterPluggableCompactionService(std::unique_ptr);

Toto API registruje zásuvný modul, který používá RocksDB k provedení úlohy zhutnění. Vzdálené zhutnění probíhá ve dvou krocích: Run a InstallFiles. Proto by plugin PluggableCompactionService měl 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 je místo, kde probíhá provádění zhutnění.V naší architektuře vzdáleného zhutňování by Run odeslal RPC na úroveň vzdáleného zhutnění a obdržel by výsledek zhutnění, který by mimo jiné obsahoval seznam nově komprimovaných souborů SST.

InstallFiles je místo, kde RocksDB instaluje nově zkomprimované soubory SST z cloudu (remote_paths) do místní databáze (local_paths).

Úroveň zhutnění Rockset

Nyní ukážeme, jak jsme použili zásuvnou zhutňovací službu popsanou výše v zhutňovací službě Rockset. Jak již bylo zmíněno výše, první krok, Run, odešle RPC na vzdálenou vrstvu zhutnění s informacemi o zhutnění, jako jsou názvy vstupních souborů SST a informace o kompresi. Hostitele, který provádí tuto zhutňovací úlohu, říkáme kompaktor.

zhutňovač by po obdržení požadavku na zhutnění otevřel instanci RocksDB-Cloud v režim duch . Co to znamená, RocksDB-Cloud otevírá lokální databázi pouze s nezbytnými metadaty bez načítání všech souborů SST z cloudového úložiště. Jakmile otevře instanci RocksDB v režimu duch , pak provede úlohu zhutnění, včetně načtení požadovaných souborů SST, zkomprimuje je a nahraje nově zkomprimované soubory SST do dočasného úložiště v cloudu.

Zde jsou možnosti otevření RocksDB-Cloud v kompaktoru :

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;

Existuje několik výzev kterým jsme čelili během vývoje úrovně zhutnění a našich řešení:

Zlepšete rychlost otevírání RocksDB-Cloud v přízraku mode

Během otevírání instancí RocksDB kromě načítání všech souborů SST z cloudu (který jsme deaktivovali pomocí ducha mode), existuje několik dalších operací, které by mohly zpomalit proces otevírání, zejména získání seznamu souborů SST a získání velikosti každého souboru SST. Obvykle, pokud jsou všechny soubory SST umístěny v místním úložišti, by latence těchto operací velikosti souboru byla malá. Když však kompaktor otevře RocksDB-Cloud, každá z těchto operací by vyústila ve vzdálený požadavek na cloudové úložiště a celková kombinovaná latence se stane neúměrně nákladnou. Podle našich zkušeností by pro instanci RocksDB-Cloud s tisíci souborů SST otevření trvalo až minutu kvůli tisícům požadavků velikosti souboru na S3. Abychom toto omezení obejít, zavedli jsme v možnostech RocksDB-Cloud různé možnosti, jak tyto RPC během otevírání deaktivovat. Ve výsledku se průměrná doba otevření pohybuje od 7 sekund do 700 milisekund.

Zakázat zhutňování L0 -> L0

Vzdálené zhutňování je kompromis mezi rychlostí jednoho zhutnění a schopností paralelně spouštět více zhutňovacích úloh. Je to proto, že každá úloha vzdáleného zhutňování by byla přirozeně pomalejší než stejná místní zhutnění kvůli nákladům na přenos dat v cloudu. Proto bychom rádi co nejvíce minimalizovali úzké místo procesu zhutňování, kde RocksDB-Cloud nemůže paralelizovat.

V architektuře LSM zhutnění L0-> L1 obvykle není paralelizovatelné, protože Soubory L0 mají překrývající se rozsahy. Proto, když dochází ke zhutňování L0-> L1, má RocksDB-Cloud schopnost také provádět zhutnění L0-> L0, s cílem snížit počet souborů L0 a zabránit zastavení zápisu kvůli tomu, že RocksDB-Cloud narazí na soubor L0 omezit. Avšak kompromisem je, že každý soubor L0 by se zvětšil po každé L0-> L0 kompilaci.

Podle našich zkušeností tato možnost způsobuje větší potíže než výhody, které přináší, protože mít větší soubory L0 má za následek mnohem delší zhutnění L0-> L1, což zhoršuje úzké místo RocksDB-Cloud. Proto deaktivujeme zhutňování L0-> L0 a místo toho žijeme se vzácným problémem stánku zápisu. Z našeho experimentu zhutnění RocksDB-Cloud dohání příchozí zápisy mnohem lépe.

Můžete jej nyní použít

RocksDB-Cloud je projekt typu open-source, takže naše práce může být využíván jakýmkoli jiným vývojářem RocksDB, který chce odvodit výhody oddělením jejich zhutňovacího výpočtu od svých potřeb úložiště. Nyní provozujeme službu vzdáleného zhutňování ve výrobě. Je k dispozici s vydáním RocksDB-Cloud verze 6.7.3. Diskutujeme o všech věcech o RocksDB-Cloud ve veřejném kanálu Slack na http://bit.ly/rockset-community-channel .

Autoři:

Hieu Pham – softwarový inženýr, Rockset
Dhruba Borthakur – CTO, Rockset

Původně publikováno na https: // rockset.com 4. června 2020.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *