Delen via


Implementatie van graindirectory

Overzicht en architectuur

De graanmap in Orleans is een sleutel-waardearchief waarbij de sleutel een graan-id is en de waarde een registratievermelding is die verwijst naar een actieve silo die (mogelijk) als host fungeert voor het graan.

Hoewel Orleans een standaard gedistribueerde directory-implementatie in het geheugen biedt (zoals beschreven in dit artikel), is het grain directory-systeem ontworpen om te worden aangesloten. Ontwikkelaars kunnen hun eigen directory implementeren door de IGrainDirectory-interface te implementeren en te registreren bij de serviceverzameling van de silo. Hierdoor kunnen aangepaste directory-implementaties worden gebruikt die verschillende back-ends voor opslag of consistentiemodellen kunnen gebruiken om beter aan specifieke toepassingsvereisten te voldoen. Sinds de introductie van de nieuwe map voor sterke consistentie is er weinig behoefte aan externe directory-implementaties, maar de API blijft voor achterwaartse compatibiliteit en flexibiliteit. De graanmap kan per graantype worden geconfigureerd.

Om de prestaties te optimaliseren, worden adreslijstzoekacties lokaal in de cache opgeslagen binnen elke silo. Dit betekent dat mogelijke externe maplezingen alleen nodig zijn wanneer de lokale cachevermelding ontbreekt of ongeldig is. Dit cachingmechanisme vermindert de netwerkoverhead en latentie die is gekoppeld aan opzoekacties voor graanlocaties.

Oorspronkelijk heeft Orleans een uiteindelijk consistente map geïmplementeerd die is gestructureerd als een gedistribueerde hash-tabel. Dit werd vervangen door een sterk consistent bestand in Orleans v9.0, gebaseerd op de tweefasige Virtueel Synchrone methodologie en ook gestructureerd als gedistribueerde hash-tabel, maar met verbeterde belastingsverdeling door het gebruik van virtuele knooppunten. In dit artikel worden de laatste, nieuwere grain directory-implementatie beschreven.

Gedistribueerd graanregister

De gedistribueerde graandirectory in Orleans biedt hoge consistentie, gelijkmatige belastingsverdeling, hoge prestaties en fouttolerantie. De implementatie volgt een ontwerp in twee fasen op basis van de Virtual Synchrony-methodologie met overeenkomsten met Vertical Paxos.

Directory-partities hebben twee modi van werking:

  1. Normale bewerking: partities verwerken aanvragen lokaal zonder coördinatie met andere hosts.
  2. Wijziging weergeven: hosts coördineren met elkaar om het eigendom van adreslijstbereiken over te dragen.

De map maakt gebruik van Orleans' sterk consistentieclusterlidmaatschapssysteem, waarbij configuraties met de naam 'weergaven' monotonisch toenemende versienummers hebben. Wanneer silo's samenkomen en het cluster verlaten, ontstaan er opeenvolgende weergaven, wat resulteert in wijzigingen in het eigendom van een range.

Alle directorybewerkingen omvatten weergavecoördinatie:

  • Aanvragen dragen het weergavenummer van de beller.
  • Antwoorden bevatten het weergavenummer van de partitie.
  • Aantalverschillen activeren synchronisatie.
  • Aanvragen worden automatisch opnieuw uitgevoerd bij wijzigingen in de weergave.

Dit zorgt ervoor dat alle aanvragen worden verwerkt door de juiste eigenaar van de mappartitie.

Partitioneringsstrategie

Het directory wordt gepartitioneerd met behulp van een consistente hash-ring waarbij bereiken worden toegewezen aan de actieve silo's in het cluster. Graanidentificatiecodes worden gehasht om de silo te vinden die eigenaar is van het gedeelte van de ring dat overeenkomt met zijn hash.

Elke actieve silo is eigenaar van een vooraf geconfigureerd aantal reeksen, standaard 30 reeksen per silo. Dit is vergelijkbaar met het schema dat wordt gebruikt door Amazon Dynamo en Apache Cassandra, waarbij meerdere 'virtuele knooppunten' (bereiken) worden gemaakt voor elk knooppunt (host).

De grootte van een partitie wordt bepaald door de afstand tussen de hash en de hash van de volgende partitie. Het is mogelijk dat een bereik wordt gesplitst tussen meerdere silo's tijdens een wijziging van de weergave, wat complexiteit toevoegt aan de wijzigingsprocedure voor weergaven, omdat elke partitie mogelijk moet worden gecoördineerd met meerdere andere partities.

Wijzigingsprocedure weergeven

Adreslijstpartities (geïmplementeerd in GrainDirectoryPartition) gebruiken versiegebonden bereikvergrendelingen om ongeldige toegang tot bereiken te voorkomen tijdens wijzigingen in de weergave. Bereikvergrendelingen worden gemaakt tijdens het wijzigen van de weergave en worden vrijgegeven wanneer de weergavewijziging is voltooid. Deze vergrendelingen zijn vergelijkbaar met de 'wedges' die worden gebruikt in de methodologie virtual synchrony.

Wanneer een weergavewijziging optreedt, kan een partitie groeien of verkleinen:

  • Als een nieuwe silo lid is geworden van het cluster, kunnen bestaande partities kleiner worden om ruimte te maken.
  • Als een silo het cluster heeft verlaten, kunnen de resterende partities groeien om de verweesde reeksen over te nemen.

Adreslijstregistraties moeten worden overgedragen van de oude eigenaar naar de nieuwe eigenaar voordat aanvragen kunnen worden verwerkt. Het overdrachtsproces volgt deze stappen:

  1. De vorige eigenaar verzegelt het bereik en maakt een momentopname van de mapvermeldingen.
  2. De nieuwe eigenaar vraagt de momentopname aan en past de momentopname toe.
  3. De nieuwe eigenaar begint met het verwerken van aanvragen voor het assortiment.
  4. De vorige eigenaar krijgt een melding en verwijdert de momentopname.

Herstelproces

Wanneer een host vastloopt zonder de mappartities goed af te geven, moeten de volgende partitie-eigenaren herstel uitvoeren. Dit omvat:

  1. Het opvragen van alle actieve silo's in het cluster voor graanregistraties.
  2. Herstellen van de directorystatus voor de betrokken reeksen.
  3. Ervoor zorgen dat er geen dubbele korrelactiveringen plaatsvinden.

Herstel is ook nodig wanneer het clusterlidmaatschap snel wordt gewijzigd. Hoewel clusterlidmaatschap monotoniteit garandeert, is het mogelijk dat silo's tussenliggende lidmaatschapsweergaven missen. In dergelijke gevallen:

  • Momentopnameoverdrachten worden afgebroken.
  • Herstel wordt uitgevoerd in plaats van normale partitie-naar-partitie-overdracht.
  • Het systeem behoudt consistentie ondanks ontbrekende tussenliggende statussen.

Een toekomstige verbetering van het clusterlidmaatschap kan deze scenario's verminderen of elimineren door ervoor te zorgen dat alle weergaven door alle silo's worden gezien.