Microsoft hat den Quellcode des NoSQL-Systems Garnet veröffentlicht, das für die Erstellung von Cache-Speichern konzipiert ist und mit bestehenden Client-Bibliotheken für Redis kompatibel ist. Garnet unterstützt die Erstellung skalierbarer Cluster zur Datenkommunikation, in denen Replikation, Schlüsselmigration und Datenpartitionierung zwischen den Knoten des Clusters verwendet werden können. Das Projekt ist in C# geschrieben, hat einen Speicherkern in C++ und wird unter der MIT-Lizenz veröffentlicht; es kann auf allen von .NET unterstützten Plattformen betrieben werden, wobei Linux und Windows als primäre Plattformen angegeben sind.
Für die Speicherung von Daten wird die Tsavorite-Engine (ein Fork der Microsoft FASTER-Engine) verwendet, die mehrfädige Anfragenbearbeitung, Transaktionen, unblocking checkpointing, Wiederherstellung nach Ausfällen, Speicherung redundanter Kopien und Protokollierung unterstützt. Der Netzwerk-Handler in Garnet ist unter Verwendung der Shared-Memory-Architektur des Forschungsprojekts ShadowFax aufgebaut. Die Verarbeitung von TLS und die Interaktion mit dem Speicher erfolgen in einem Thread, was es ermöglicht, die Kosten für den Threadwechsel zu vermeiden und den CPU-Cache beim Datentransfer über das Netzwerk effizienter zu nutzen.
Die Garnet-Architektur trennt die Logik der Anfragenverarbeitung von den Speicheroperationen. Die Daten werden in zwei key-value Speichern gespeichert, die auf der Tsavorite-Bibliothek basieren. Das erste "primäre" Speicher ist für die schnelle Verarbeitung von Zeichenfolgen optimiert, während das zweite "Objektspeicher" für die Unterbringung komplexer Objekte und erweiterter Datentypen wie Hashes und Listen optimiert ist. Die Datentypen im zweiten Speicher werden mithilfe von .NET-Bibliotheken realisiert. Die Daten werden im Heap (C#-Heap) gespeichert, was effiziente Aktualisierungen ermöglicht, und in serialisierter Form auf der Festplatte.

Besonderheiten von Garnet:
- Es ist möglich, mehrstufige Speicher zu implementieren, die RAM, SSD-Speicher und Cloud-Speicher umfassen, wobei weniger gefragte 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 Schichten ermöglichen, die für verschiedene Geräte optimiert sind. Beispielsweise gibt es Schichten für SSDs, Festplatten und den Azure Storage Cloud-Speicher.
- Ein effektiver Mechanismus zur Wiederverwendung freigegebener Speicherplätze im Arbeitsspeicher, der Fragmentierung verhindert.
- Anpassbare Grenzwerte für die Größe des für Indizes, Protokolle und Objektlagerung verwendeten Speichers.
- Zum Zugriff auf das Speicher verwendet das RESP-Protokoll, was die Anwendung von Garnet mit unveränderten Redis-Clients ermöglicht.
- Unterstützung der Speicherung sowohl von String-Werten als auch von komplexen Datenstrukturen wie Listen, Hashes, Mengen, sortierten Listen und Geopositionierungsdaten. Möglichkeit zur Festlegung der Lebensdauer von Schlüsseln.
- Vorhandensein einer API zur Durchführung von analytischen Abfragen (HLL/Hyperloglog, Bitmap), Transaktionen (MULTI/EXEC) und Verwendung des Publish/Subscribe-Paradigmas.
- Bereitstellung von Mitteln für eine flexible Zugriffskontrolle über ACL.
- Möglichkeit zur Definition der Konfiguration im JSON-Format oder redis.conf.
- Unterstützung der Verbindung zusätzlicher Netzwerk-Handler. Möglichkeit zur Verschlüsselung des Datenverkehrs mit TLS (basierend auf SslStream).
- Möglichkeit zur Erstellung von Erweiterungen in C#, die zusätzliche Operationen auf Strings und Objekten implementieren.
- Unterstützung von transaktionalen gespeicherten Prozeduren, die mehrere Schlüssel abdecken.
- Die Möglichkeit, den Zustand von einem zuvor gespeicherten Punkt (Checkpoint-Wiederherstellung) wiederherzustellen. Verfügbarkeit eines Nur-Hinzufügen-Modus (AOF, Append-Only File), bei dem alle alten Daten verfügbar bleiben und nicht überschrieben werden.
- Unterstützung der Erstellung von Speicherclustern mit Replikation, Sharding, dynamischer Migration von Schlüsseln zwischen Knoten und Wiederherstellung ausgefallener Knoten.
- Hohe Leistung und niedrige Latenzen bei der Ausführung von Anfragen. Effektive Verarbeitung kleiner Batch-Anfragen bei einer hohen Anzahl von Client-Sitzungen, die eine Durchsatzrate (Anzahl der verarbeiteten Anfragen pro Sekunde) um ein Vielfaches höher erreicht als konkurrierende Lösungen. Bei Betrieb in virtuellen Maschinen wurde vereinfacht. der Azure-Cloud überschreiten in den meisten Fällen die Latenzen der Client-Anfragen nicht 300 Mikrosekunden. In durchgeführten Tests übertrifft Garnet Redis, Dragonfly und KeyDB signifikant in Leistung und Reaktionsfähigkeit. In einigen Tests übertrifft Garnet konkurrierende Systeme um das Zehnfache.




Quelle: opennet.ru




