Apache HBase je databáze Hadoop a je založena na systému distribuovaných souborů Hadoop (HDFS ). HBase umožňuje náhodně přistupovat k datům uloženým v HDFS a aktualizovat je, ale soubory v HDFS lze k nim pouze připojit a jsou neměnné po jejich vytvoření. Můžete se tedy zeptat, jak HBase poskytuje čtení a zápis s nízkou latencí? V tomto příspěvku na blogu to vysvětlujeme popisem cesty zápisu HBase – jak jsou data aktualizována v HBase.
Cesta zápisu je způsob, jakým HBase dokončuje operace vložení nebo odstranění. Tato cesta začíná u klienta, přesouvá se na server regionu a končí, když jsou data nakonec zapsána do datového souboru HBase s názvem HFile . Součástí návrhu cesty pro zápis jsou funkce, které HBase používá k prevenci ztráty dat v případě selhání regionálního serveru. Pochopení cesty zápisu tedy může poskytnout pohled na nativní mechanismus prevence ztráty dat HBase.
Každá tabulka HBase je hostována a spravována sadami serverů, které spadají do tří kategorií:
- Jeden aktivní hlavní server
- Jeden nebo více záložních hlavních serverů
- Mnoho regionálních serverů
Servery regionů přispívají ke zpracování tabulek HBase. Protože tabulky HBase mohou být velké, jsou rozděleny do oddílů nazývaných regiony. Každý server oblasti zpracovává jednu nebo více těchto oblastí. Všimněte si, že protože servery regionů jsou jediné servery, které poskytují data tabulky HBase, selhání hlavního serveru nemůže způsobit ztrátu dat.
Data HBase jsou organizována podobně jako setříděná mapa, přičemž setříděný klíčový prostor je rozdělen do různých částí nebo oblastí. Klient HBase aktualizuje tabulku vyvoláním příkazů put nebo delete. Když klient požádá o změnu, je tento požadavek ve výchozím nastavení okamžitě přesměrován na regionální server. Programově však může klient uložit změny na straně klienta do mezipaměti a vyprázdnit tyto změny na servery oblastí v dávce vypnutím automatického vyprázdnění. Pokud je autoflush vypnuto, změny se ukládají do mezipaměti, dokud není vyvoláno flush-commits nebo dokud není vyrovnávací paměť plná v závislosti na velikosti vyrovnávací paměti nastavené programově nebo nakonfigurované parametrem „hbase.client.write.buffer“.
Protože je klíč řádku seřazen, je snadné určit, který server regionu spravuje který klíč. Požadavek na změnu je pro konkrétní řádek. Každý klíč řádku patří do určité oblasti, která je obsluhována serverem oblasti. Takže na základě klíče vložení nebo odstranění může klient HBase najít správný regionální server. Nejprve vyhledá adresu regionálního serveru hostujícího oblast -ROOT- z kvora ZooKeeper. Ze serveru kořenové oblasti klient zjistí umístění regionálního serveru, který je hostitelem oblasti -META-. Ze serveru meta region pak nakonec najdeme skutečný server regionu, který obsluhuje požadovaný region. Jedná se o třístupňový proces, takže umístění regionu je uloženo do mezipaměti, aby se předešlo této drahé sérii operací. Pokud je umístění v mezipaměti neplatné (například dostaneme nějakou neznámou výjimku oblasti), je čas oblast znovu najít a aktualizovat mezipaměť.
Po přijetí požadavku serverem správné oblasti nelze změnu zapsat do souboru HF okamžitě, protože data v souboru HF musí být seřazena podle klíče řádku. To umožňuje efektivní vyhledávání náhodných řádků při čtení dat. Data nelze do souboru HF vkládat náhodně. Místo toho musí být změna zapsána do nového souboru. Pokud by byla každá aktualizace zapsána do souboru, vytvořilo by se mnoho malých souborů. Takové řešení by nebylo škálovatelné ani efektivní pro pozdější sloučení nebo čtení. Změny proto nejsou okamžitě zapsány do nového souboru HF.
Místo toho je každá změna uložena na místo v paměti zvané memstore , který levně a efektivně podporuje náhodné zápisy. Data v paměťovém úložišti se třídí stejným způsobem jako data v souboru HF. Když paměťové úložiště nashromáždí dostatek dat, celá seřazená sada se zapíše do nového souboru HF v HDFS. Dokončení jedné velké úlohy zápisu je efektivní a využívá silné stránky HDFS.
Přestože zápis dat do paměťového úložiště je efektivní, představuje také určitý prvek rizika:Informace uložené v paměťovém úložišti jsou uloženy v nestálé paměti, takže pokud systém selže, všechny informace paměťového úložiště jsou ztraceny. Za účelem zmírnění tohoto rizika ukládá HBase aktualizace do protokolu s předběžným zápisem (WAL ) před zapsáním informací do memstore. Tímto způsobem, pokud selže server regionu, lze informace uložené v paměti tohoto serveru obnovit z jeho WAL.
Poznámka:Ve výchozím nastavení je WAL povolena, ale proces zápisu souboru WAL na disk spotřebovává určité prostředky. WAL může být zakázáno, ale to by mělo být provedeno pouze v případě, že riziko ztráty dat nehrozí. Pokud se rozhodnete zakázat WAL, zvažte implementaci vlastního řešení pro obnovu po havárii nebo buďte připraveni na možnost ztráty dat.
Data v souboru WAL jsou organizována odlišně od HFile. Soubory WAL obsahují seznam úprav, přičemž jedna úprava představuje jediné vložení nebo odstranění. Úprava obsahuje informace o změně a regionu, kterého se změna týká. Úpravy jsou psány chronologicky, takže pro zachování platnosti jsou dodatky připojeny na konec souboru WAL, který je uložen na disku. Protože soubory WAL jsou seřazeny chronologicky, není nikdy potřeba zapisovat na náhodné místo v souboru.
Jak WAL rostou, jsou nakonec uzavřeny a je vytvořen nový, aktivní soubor WAL, který přijímá další úpravy. Tomu se říká „rolování“ souboru WAL. Jakmile je soubor WAL rolován, neprovádějí se ve starém souboru žádné další změny.
Ve výchozím nastavení je soubor WAL rolován, když je jeho velikost přibližně 95 % velikosti bloku HDFS. Multiplikátor můžete nakonfigurovat pomocí parametru:„hbase.regionserver.logroll.multiplier“ a velikost bloku pomocí parametru:„hbase.regionserver.hlog.blocksize“. Soubor WAL je také periodicky rolován na základě nakonfigurovaného intervalu „hbase.regionserver.logroll.period“, což je ve výchozím nastavení hodina, dokonce i velikost souboru WAL je menší než nakonfigurovaný limit.
Omezení velikosti souboru WAL usnadňuje efektivní přehrávání souborů, pokud je vyžadováno obnovení. To je zvláště důležité při přehrávání souboru WAL oblasti, protože během přehrávání souboru není odpovídající oblast k dispozici. Záměrem je nakonec zapsat všechny změny z každého souboru WAL na disk a uchovat tento obsah v souboru HF. Poté lze soubor WAL archivovat a nakonec ho smaže vlákno démona LogCleaner. Všimněte si, že soubory WAL slouží jako ochranné opatření. Soubory WAL stačí znovu přehrát, aby se obnovily aktualizace, které by jinak byly ztraceny po havárii regionálního serveru.
Regionální server obsluhuje mnoho regionů, ale nemá soubor WAL pro každý region. Místo toho je jeden aktivní soubor WAL sdílen mezi všemi oblastmi obsluhovanými serverem oblasti. Vzhledem k tomu, že soubory WAL jsou pravidelně rolovány, může mít jeden regionální server mnoho souborů WAL. Všimněte si, že v daném okamžiku existuje pouze jedna aktivní WAL na server regionu.
Za předpokladu výchozího kořenového adresáře HBase „/hbase“ jsou všechny soubory WAL pro instanci serveru regionu uloženy ve stejné kořenové složce, což je následující:
/hbase/.logs/<host>, <port>,<startcode>
Například:
/hbase/.logs/srv.example.com,60020,1254173957298
Soubory protokolu WAL jsou pojmenovány takto:
/hbase/.logs/<host>, <port>,<startcode>/<host>%2C <port>%2C<startcode>.<timestamp>
Například:
/hbase/.logs/srv.example.com,60020,1254173957298/srv.example.com%2C60020%2C1254173957298.1254173957495
Každá úprava v souboru WAL má jedinečné ID sekvence. Toto ID se zvýší, aby se zachovalo pořadí úprav. Kdykoli je vrácen soubor protokolu, id další sekvence a starý název souboru se vloží do mapy v paměti. Tyto informace se používají ke sledování maximálního ID sekvence každého souboru WAL, takže můžeme snadno zjistit, zda lze soubor archivovat později, když se nějaké úložiště paměti vyprázdní na disk.
Úpravy a jejich ID sekvence jsou v rámci regionu jedinečné. Kdykoli je do protokolu WAL přidána úprava, zaznamená se také ID sekvence úpravy jako poslední zapsané ID sekvence. Když je paměťové úložiště vyprázdněno na disk, vymaže se poslední ID sekvence zapsané pro tuto oblast. Pokud je poslední ID sekvence zapsané na disk stejné jako maximální ID sekvence souboru WAL, lze dojít k závěru, že všechny úpravy v souboru WAL pro tuto oblast byly zapsány na disk. Pokud byly všechny úpravy pro všechny oblasti v souboru WAL zapsány na disk, je jasné, že nebude vyžadováno žádné rozdělení ani přehrávání a soubor WAL lze archivovat.
Rolování souborů WAL a vyprázdnění úložiště paměti jsou dvě samostatné akce a nemusí k nim docházet společně. Nechceme však uchovávat příliš mnoho souborů WAL na regionální server, abychom se vyhnuli časově náročné obnově v případě selhání regionálního serveru. Proto, když je nahrán soubor WAL, HBase zkontroluje, zda není příliš mnoho souborů WAL, a rozhodne, které oblasti by se měly vyprázdnit, aby bylo možné některé soubory WAL archivovat.
V tomto příspěvku vysvětlujeme cestu zápisu HBase, což je způsob, jakým se vytvářejí a/nebo aktualizují data v HBase. Některé jeho důležité části jsou:
- Jak klient lokalizuje server regionu,
- Memstore, který podporuje rychlé náhodné zápisy,
- Soubory WAL jako způsob, jak zabránit ztrátě dat v případě selhání regionálního serveru.
V následujících příspěvcích budeme hovořit o formátech HFile, rozdělení souborů WAL a tak dále.