Implementierung des Grain-Verzeichnisses
Übersicht und Architektur
Das Getreideverzeichnis in Orleans ist ein Schlüsselwertspeicher, bei dem es sich bei dem Schlüssel um einen Kornbezeichner handelt und der Wert ein Registrierungseintrag ist, der auf ein aktives Silo verweist, das (potenziell) das Korn hosten kann.
Während Orleans eine standardmäßige, im Arbeitsspeicher verteilte Verzeichnisimplementierung (in diesem Artikel beschrieben) bereitstellt, ist das Grain-Verzeichnissystem so konzipiert, dass es anpassbar ist. Entwickler können ihr eigenes Verzeichnis implementieren, indem sie die IGrainDirectory
-Schnittstelle implementieren und bei der Dienstsammlung des Silos registrieren. Dies ermöglicht benutzerdefinierte Verzeichnisimplementierungen, die unterschiedliche Speicher-Back-Ends oder Konsistenzmodelle verwenden können, um den spezifischen Anwendungsanforderungen besser gerecht zu werden. Seit der Einführung des neuen Verzeichnisses mit starker Konsistenz besteht wenig Bedarf für externe Verzeichnisimplementierungen, aber die API bleibt für Abwärtskompatibilität und Flexibilität. Das Getreideverzeichnis kann pro Korntyp konfiguriert werden.
Um die Leistung zu optimieren, werden die Verzeichnissuchen lokal in den einzelnen Silos zwischengespeichert. Dies bedeutet, dass potenziell entfernte Verzeichnislesevorgänge nur erforderlich sind, wenn der lokale Cacheeintrag entweder fehlt oder ungültig ist. Dieser Zwischenspeicherungsmechanismus reduziert den Netzwerkaufwand und die Latenzzeiten, die mit den Standortbestimmungen von Grains verbunden sind.
Ursprünglich implementierte Orleans ein konsistentes Verzeichnis, das als verteilte Hashtabelle strukturiert ist. Dies wurde durch ein stark konsistentes Verzeichnis in Orleans v9.0 ersetzt, basierend auf der zweistufigen virtuell synchronen Methodik und auch als verteilte Hashtabelle strukturiert, aber mit verbessertem Lastenausgleich durch die Verwendung virtueller Knoten. In diesem Artikel wird die neuere Implementierung des Grain-Verzeichnisses beschrieben.
Verteiltes Grain-Verzeichnis
Das verteilte Grain-Verzeichnis in Orleans bietet starke Konsistenz, sogar Lastenausgleich, hohe Leistung und Fehlertoleranz. Die Implementierung folgt einem zweiphasigen Entwurf basierend auf der Virtual Synchrony-Methodik und weist Ähnlichkeiten mit Vertical Paxosauf.
Verzeichnispartitionen weisen zwei Betriebsmodi auf:
- Normaler Betrieb: Partitionen verarbeiten Anfragen lokal ohne Koordination mit anderen Hosts.
- Ansichtsänderung: Hosts koordinieren sich gegenseitig, um den Besitz von Verzeichnisbereichen zu übertragen.
Das Verzeichnis nutzt das Orleans-System zur starken Konsistenzcluster-Mitgliedschaft, bei dem Konfigurationen, die als „Ansichten” bezeichnet werden, monoton steigende Versionsnummern aufweisen. Wenn Silos den Cluster verbinden und verlassen, werden aufeinander folgende Ansichten erstellt, was zu Änderungen des Bereichsbesitzes führt.
Alle Verzeichnisvorgänge beinhalten die Koordination der Ansichten:
- Anfragen enthalten die Ansichtsnummer des Anrufers.
- Antworten umfassen die Ansichtsnummer der Partition.
- Das Anzeigen von Zahlenabweichungen löst die Synchronisierung aus.
- Anforderungen werden bei Änderungen der Ansicht automatisch wiederholt.
Dadurch wird sichergestellt, dass alle Anforderungen vom richtigen Besitzer der Verzeichnispartition verarbeitet werden.
Partitionierungsstrategie
Das Verzeichnis wird mithilfe eines konsistenten Hashrings partitioniert, wobei den aktiven Silos im Cluster Bereiche zugewiesen werden. Grain-Bezeichner werden gehasht, um das Silo zu finden, das den Abschnitt des Rings besitzt, der seinem Hash entspricht.
Jedes aktive Silo besitzt eine vorkonfigurierte Anzahl von Bereichen, standardmäßig 30 Bereiche pro Silo. Dies ähnelt dem Schema, das von Amazon Dynamo und Apache Cassandraverwendet wird, wobei für jeden Knoten (Host) mehrere "virtuelle Knoten" (Bereiche) erstellt werden.
Die Größe einer Partition wird durch den Abstand zwischen dem Hash und dem Hash der nächsten Partition bestimmt. Es ist möglich, dass ein Bereich während einer Ansichtsänderung zwischen mehreren Silos aufgeteilt werden kann, wodurch der Ansichtsänderungsprozedur Komplexität hinzugefügt wird, da jede Partition potenziell mit mehreren anderen Partitionen koordiniert werden muss.
Änderungsprozedur anzeigen
Verzeichnispartitionen (implementiert in GrainDirectoryPartition
) verwenden versionierte Bereichsschlösser, um ungültigen Zugriff auf Bereiche während Ansichtsänderungen zu verhindern. Bereichssperren werden während einer Ansichtsänderung erstellt und freigegeben, wenn die Ansichtsänderung abgeschlossen ist. Diese Sperren sind analog zu den „Keilen“, die in der Methode der virtuellen Synchronisierung verwendet werden.
Wenn sich eine Ansicht ändert, kann eine Partition entweder vergrößert oder verkleinert werden.
- Wenn ein neues Silo dem Cluster beigetreten ist, können sich vorhandene Partitionen verkleinern, um Platz zu schaffen.
- Wenn ein Silo den Cluster verlassen hat, können die verbleibenden Partitionen sich ausdehnen, um die verwaisten Bereiche zu übernehmen.
Verzeichnisregistrierungen müssen vom alten Eigentümer an den neuen Eigentümer übertragen werden, bevor Anfragen bearbeitet werden können. Der Übertragungsprozess besteht aus den folgenden Schritten:
- Der vorherige Besitzer versiegelt den Bereich und erstellt eine Momentaufnahme der Verzeichniseinträge.
- Der neue Besitzer fordert die Momentaufnahme an und wendet sie an.
- Der neue Besitzer beginnt, Anfragen für den Bereich zu bearbeiten.
- Der vorherige Besitzer wird benachrichtigt und löscht die Momentaufnahme.
Wiederherstellungsprozess
Wenn ein Host abstürzt, ohne seine Verzeichnispartitionen ordnungsgemäß zu übergeben, müssen die nachfolgenden Partitionsbesitzer die Wiederherstellung durchführen. Das beinhaltet:
- Abfragen aller aktiven Silos im Cluster nach ihren Grain-Registrierungen.
- Wiederherstellung des Verzeichnisstatus für betroffene Bereiche.
- Sicherstellen, dass keine duplizierten Kornaktivierungen auftreten.
Die Wiederherstellung ist auch erforderlich, wenn sich die Clustermitgliedschaft schnell ändert. Während die Clustermitgliedschaft Monotonie garantiert, ist es möglich, dass Silos Zwischenschritte der Mitgliedschaftsansichten übersehen. In solchen Fällen:
- Die Übertragung von Momentaufnahmen wird eingestellt.
- Die Wiederherstellung wird anstelle des normalen Partition-zu-Partition-Übergangs ausgeführt.
- Das System behält Konsistenz trotz fehlender Zwischenzustände bei.
Eine zukünftige Verbesserung der Clustermitgliedschaft kann diese Szenarien reduzieren oder beseitigen, indem sichergestellt wird, dass alle Ansichten von allen Silos gesehen werden.