Die Firma Microsoft hat den Quellcode des NoSQL-Systems Garnet veröffentlicht, das für die Erstellung von Caching-Speichern entwickelt wurde und mit bestehenden Client-Bibliotheken für den Redis-Speicher kompatibel ist. Garnet unterstützt die Erstellung von skalierbaren Clustern zur Daten-Caching, in denen Replikation, Schlüsselmigration und Daten-Segmentierung zwischen den Clusterknoten verwendet werden können. Das Projekt ist in C# mit einem Speicher-Kern in C++ geschrieben, unterliegt der MIT-Lizenz und kann auf allen Plattformen betrieben werden, die in .NET unterstützt werden (primäre Plattformen sind Linux und Windows).
Für die Datenspeicherung wird die Tsavorite-Engine (ein Fork des Microsoft FASTER-Speichers) verwendet, die die Verarbeitung von Anfragen in mehreren Threads, Transaktionen, nicht-blockierendes Checkpointing, Fehlerwiederherstellung, das Speichern redundanter Kopien und das Führen von Operation Logs unterstützt. Der Netzwerk-Handler in Garnet ist unter Verwendung der Shared-Memory-Architektur, die durch das Forschungsprojekt ShadowFax vorgeschlagen wurde, aufgebaut. Die TLS-Verarbeitung und die Interaktion mit dem Speicher erfolgen in einem einzigen Thread, was die Kosten für den Thread-Wechsel minimiert und eine effizientere Nutzung des CPU-Caches bei der Datenübertragung über das Netzwerk ermöglicht.
Die Architektur von Garnet trennt die Logik der Anfrageverarbeitung von den Speicheroperationen. Daten werden unter Verwendung von zwei Schlüssel-Wert-Speichern gespeichert, die auf der Tsavorite-Bibliothek basieren. Das erste "Basis"-Speicher ist für die schnelle Ausführung von String-Operationen optimiert, während das zweite "Objekt"-Speicher für die Speicherung komplexer Objekte und erweiterter Datentypen wie Hashes und Listen optimiert ist. Die Datentypen im zweiten Speicher sind unter Verwendung von .NET-Bibliotheken implementiert. Daten werden im Heap (C# Heap) gespeichert, was eine effiziente Aktualisierung ermöglicht, und in serialisierter Form auf der Festplatte.

Besonderheiten von Garnet:
- Es ist möglich, mehrstufige Speicher zu implementieren, die RAM, SSDs und Cloud-Speicher umfassen, wobei weniger nachgefragte Daten in langsamere Speicher verschoben werden, um Caches zu erstellen, die größer sind als der RAM.
- Erweiterte Unterstützung für Geräte, die die Erstellung von für verschiedene Geräte optimierten Schichten ermöglicht, darunter Schichten für SDD, Festplatten und Azure Storage.
- Effizienter Mechanismus zur Wiederverwendung des freigewordenen Speichers im RAM, der Fragmentierung verhindert.
- Anpassbare Limits für den Speicherplatz, der für Indizes, Logs und die Speicherung von Objekten verwendet wird.
- Der Zugriff auf den Speicher erfolgt über das RESP-Protokoll, wodurch Garnet mit unveränderten Redis-Clients verwendet werden kann.
- Unterstützung für die Speicherung von sowohl Zeichenfolgenwerten als auch komplexen Datenstrukturen, wie Listen, Hashes, Mengen, sortierten Listen und Standortspezifischen Daten. Möglichkeit zur Festlegung einer Lebensdauer für den Schlüssel.
- Verfügbarkeit einer API zur Durchführung von Analyseanfragen (HLL/Hyperloglog, Bitmap), Transaktionen (MULTI/EXEC) und zur Nutzung des Publikations-/Abonnementsparadigmas.
- Vorhandensein von Mitteln zur flexiblen Zugriffskontrolle über ACL.
- Möglichkeit zur Definition der Konfiguration im JSON- oder redis.conf-Format.
- Unterstützung für die Verbindung zusätzlicher Netzwerk-Handler. Möglichkeit zur Verschlüsselung des Traffics mit TLS (basierend auf SslStream).
- Möglichkeit zur Erstellung von Erweiterungen in C#, die zusätzliche Operationen mit Zeichenfolgen und Objekten implementieren.
- Unterstützung für transaktionale Stored Procedures, die mehrere Schlüssel abdecken.
- Möglichkeit zur Wiederherstellung des Zustands von einer zuvor gespeicherten Position (Checkpoint-Wiederherstellung). Vorhandensein eines Nur-Hinzufügen-Modus (AOF, Append-Only File), bei dem alle alten Daten verfügbar bleiben und nicht überschrieben werden.
- Unterstützung für die Erstellung eines Speicherkclusters mit Replikation, Sharding, dynamischer Migration von Schlüsseln zwischen Knoten und Wiederherstellung fehlerhafter Knoten.
- Hohe Leistung und geringe Latenz bei der Ausführung von Anfragen. Effiziente Verarbeitung kleiner Batch-Anfragen bei einer hohen Anzahl von Clientsitzungen, die eine um ein Vielfaches höhere Durchsatzrate (Anzahl der verarbeiteten Anfragen pro Sekunde) im Vergleich zu konkurrierenden Lösungen erreicht. virtuellen Maschinen In der Azure-Cloud überschreiten die Latenzen bei Client-Anfragen in den meisten Fällen nicht 300 Mikrosekunden. In durchgeführten Tests übertrifft Garnet in Bezug auf Leistung und Reaktionsfähigkeit deutlich Redis, Dragonfly und KeyDB. In einigen Tests überholt Garnet die konkurrierenden Systeme um das Zehnfache.




Quelle: opennet.ru




