In deel 1 van deze serie over Apache HBase-snapshots heb je geleerd hoe je de nieuwe Snapshots-functie gebruikt en wat theorie achter de implementatie. Nu is het tijd om wat dieper in de technische details te duiken.
Wat is een tabel?
Een HBase-tabel bestaat uit een set metadata-informatie en een set sleutel/waarde-paren:
- Tabelinfo :een manifestbestand dat de tabel "instellingen" beschrijft, zoals kolomfamilies, compressie- en coderingscodecs, bloom-filtertypen, enzovoort.
- Regio's :De tabel "partities" worden regio's genoemd. Elke regio is verantwoordelijk voor het verwerken van een aaneengesloten set sleutel/waarden, en deze worden gedefinieerd door een startsleutel en een eindsleutel.
- WALs/MemStore :Voordat gegevens op schijf worden geschreven, worden puts naar het Write Ahead Log (WAL) geschreven en vervolgens in het geheugen opgeslagen totdat geheugendruk een flush naar schijf veroorzaakt. De WAL biedt een gemakkelijke manier om puts te herstellen die bij een fout niet naar de schijf zijn weggespoeld.
- HFilen :Op een gegeven moment worden alle gegevens naar de schijf gespoeld; een HFile is het HBase-formaat dat de opgeslagen sleutel/waarden bevat. HFiles zijn onveranderlijk, maar kunnen worden verwijderd bij verdichting of regioverwijdering.
(Opmerking:voor meer informatie over het HBase-schrijfpad raadpleegt u de blogpost over het HBase-schrijfpad.)
Wat is een momentopname?
Een momentopname is een set metagegevensinformatie waarmee de beheerder terug kan gaan naar een eerdere staat van de tabel waarop deze is genomen. Een snapshot is geen kopie van de tabel; de eenvoudigste manier om erover na te denken is als een reeks bewerkingen om metagegevens (tabelinfo en regio's) en de gegevens (HFiles, memstore, WAL's) bij te houden. Er zijn geen kopieën van de gegevens betrokken tijdens de snapshot-bewerking.
- Offline momentopnamen :Het eenvoudigste geval voor het maken van een momentopname is wanneer een tabel is uitgeschakeld. Als u een tabel uitschakelt, worden alle gegevens op schijf gewist en worden schrijf- of leesbewerkingen niet geaccepteerd. In dit geval is het maken van een momentopname gewoon een kwestie van de tabelmetadata en de HFiles op schijf doornemen en er een verwijzing naar bewaren. De master voert deze bewerking uit en de benodigde tijd wordt voornamelijk bepaald door de tijd die de HDFS-namenode nodig heeft om de lijst met bestanden te leveren.
- Online momentopnamen :In de meeste situaties zijn tabellen echter ingeschakeld en verwerkt elke regioserver put- en get-verzoeken. In dit geval ontvangt de master het snapshotverzoek en vraagt elke regioserver om een snapshot te maken van de regio's waarvoor hij verantwoordelijk is.
De communicatie tussen de master- en regioservers verloopt via Apache ZooKeeper met behulp van een tweefasige commit-achtige transactie. De master creëert een znode die betekent "de snapshot voorbereiden". Elke regioserver verwerkt het verzoek en maakt de momentopname voor de regio's uit de tabel waarvoor hij verantwoordelijk is. Als ze klaar zijn, voegen ze een subknooppunt toe aan de znode voor het voorbereiden-verzoek met de betekenis:"Ik ben klaar".
Zodra alle regioservers hun status hebben gerapporteerd, maakt de master een andere znode die "Snapshot vastleggen" betekent; elke regioserver voltooit de momentopname en rapporteert de status zoals voordat deze zich bij het knooppunt voegde. Zodra alle regioservers hebben gerapporteerd, zal de master de momentopname voltooien en de bewerking als voltooid markeren. In het geval dat een regioserver een storing meldt, zal de master een nieuwe znode maken die wordt gebruikt om het afbreekbericht uit te zenden.
Aangezien de regioserver voortdurend nieuwe aanvragen verwerkt, kunnen verschillende gebruiksscenario's verschillende consistentiemodellen vereisen. Iemand kan bijvoorbeeld geïnteresseerd zijn in een slordige momentopname zonder de nieuwe gegevens in de MemStore, iemand anders wil misschien een volledig consistente momentopname waarvoor schrijfbewerkingen een tijdje moeten worden vergrendeld, enzovoort.
Om deze reden is de procedure voor het maken van een momentopname op de regioserver inplugbaar. Momenteel is de enige aanwezige implementatie "Flush Snapshot", die een flush uitvoert voordat een snapshot wordt gemaakt en alleen rij-consistentie garandeert. Andere procedures met ander consistentiebeleid kunnen in de toekomst worden geïmplementeerd.
In het online geval wordt de tijd die nodig is om een snapshot te maken beperkt door de tijd die de langzaamste regioserver nodig heeft om de snapshotbewerking uit te voeren en het succes terug te rapporteren aan de master. Deze bewerking duurt meestal enkele seconden.
Archiveren
Zoals we eerder hebben gezien, zijn HFiles onveranderlijk. Hierdoor kunnen we voorkomen dat de gegevens worden gekopieerd tijdens de snapshot- of kloonbewerkingen, maar tijdens het comprimeren worden ze verwijderd en vervangen door een gecomprimeerde versie. In dit geval, als u een momentopname of een gekloonde tabel hebt die verwijst naar een van die bestanden, worden ze in plaats van ze te verwijderen verplaatst naar een "archief"-locatie. Als u een momentopname verwijdert en niemand anders verwijst naar de bestanden waarnaar wordt verwezen door de momentopname, worden die bestanden verwijderd.
Tabellen klonen en herstellen
Snapshots kunnen worden gezien als een back-upoplossing waar ze kunnen worden gebruikt om een tabel te herstellen/herstellen na een gebruikers- of toepassingsfout, maar de snapshotfunctie kan veel meer mogelijk maken dan een eenvoudige back-up en herstel. Nadat u een tabel van een momentopname hebt gekloond, kunt u een MapReduce-taak of een eenvoudige toepassing schrijven om selectief de verschillen, of wat u belangrijk vindt, in productie samen te voegen. Een ander gebruiksvoorbeeld is dat u schemawijzigingen of updates van de gegevens kunt testen zonder uren te hoeven wachten op een tabelkopie en zonder dat er veel gegevens op schijf worden gedupliceerd.
Een tabel klonen van een momentopname
Wanneer een beheerder een kloonbewerking uitvoert, wordt een nieuwe tabel met het tabelschema dat aanwezig is in de momentopname, vooraf gesplitst gemaakt met de start-/eindsleutels in de informatie over de momentopnameregio's. Zodra de metagegevens van de tabel zijn gemaakt, wordt in plaats van de gegevens naar binnen te kopiëren, dezelfde truc gebruikt als bij de momentopname. Omdat de HFiles onveranderlijk zijn, wordt alleen een verwijzing naar het bronbestand gemaakt; hierdoor kan de bewerking gegevenskopieën vermijden en kan de kloon worden bewerkt zonder de brontabel of de momentopname te beïnvloeden. De kloonbewerking wordt uitgevoerd door de master.
Een tabel herstellen vanaf een momentopname
De herstelbewerking is vergelijkbaar met de kloonbewerking; je kunt het zien als het verwijderen van de tabel en het klonen van de snapshot. De herstelbewerking brengt de oude gegevens terug die aanwezig zijn in de momentopname en verwijdert alle gegevens uit de tabel die niet ook in de momentopname staan, en ook het schema van de tabel wordt teruggezet naar dat van de momentopname. Onder de motorkap wordt het herstel geïmplementeerd door een verschil uit te voeren tussen de tabelstatus en de momentopname, bestanden te verwijderen die niet aanwezig zijn in de momentopname en verwijzingen toe te voegen aan degenen in de momentopname maar niet aanwezig in de huidige staat. Ook is de tabeldescriptor aangepast om het tabel "schema" weer te geven op het moment van de snapshot. De herstelbewerking wordt uitgevoerd door de master en de tabel moet worden uitgeschakeld.
Toekomsten
Momenteel bevat de snapshot-implementatie alle vereiste basisfunctionaliteit. Zoals we hebben gezien, kunnen nieuwe beleidsregels voor de consistentie van snapshots voor de online snapshots zorgen voor meer flexibiliteit, consistentie of prestatieverbeteringen. Beter bestandsbeheer kan de belasting van het HDFS-naamknooppunt verminderen en het schijfruimtebeheer verbeteren. Verder staan statistieken, Web UI (Hue) en meer op de takenlijst.
Conclusie
HBase-snapshots voegen nieuwe functionaliteit toe, zoals de "procedurecoördinatie" die wordt gebruikt door de online snapshot, of de copy-on-write snapshot, herstel en klonen.
Snapshots bieden een sneller en beter alternatief voor handgemaakte "back-up"- en "klonen"-oplossingen op basis van distcp of CopyTable. Bij alle snapshotbewerkingen (snapshot, restore, clone) zijn geen gegevenskopieën betrokken, wat resulteert in snellere snapshots van de tabel en besparingen in schijfruimte.
Raadpleeg het HBase-document voor operationeel beheer voor meer informatie over het inschakelen en gebruiken van snapshots.
Matteo Bertozzi is een Software Engineer in het Platform-team en een HBase Committer.