Microsoft heeft de broncodes vrijgegeven van het NoSQL-systeem Garnet, dat is ontworpen voor het creƫren van caching-opslag en compatibel is met bestaande clientbibliotheken voor Redis-opslag. Garnet ondersteunt de creatie van schaalbare clusters voor datacaching, waarbij replicatie, sleutel-migratie en data-segmentatie tussen clusterknooppunten kunnen worden gebruikt. Het project is geschreven in C# met een opslagkern in C++, is beschikbaar onder de MIT-licentie en kan draaien op alle platforms die door .NET worden ondersteund (de primaire platforms zijn Linux en Windows).
Voor dataopslag wordt de Tsavorite-engine gebruikt (een fork van Microsoft FASTER storage), die multithreaded verwerking van verzoeken, transacties, non-blocking wijzigingen (checkpointing), herstel na uitval, het behouden van redundante kopieƫn en logboekregistratie van bewerkingen ondersteunt. De netwerkprocessor in Garnet is gebouwd met behulp van de gedeelde geheugentechnologie, die is voorgesteld door het onderzoeksproject ShadowFax. TLS-behandeling en interactie met de opslag worden in ƩƩn thread uitgevoerd, waardoor de overhead van thread-switching wordt vermeden en het CPU-cache efficiƫnter kan worden benut bij gegevensoverdracht via het netwerk.
De architectuur van Garnet scheidt de logica van parsing en verwerking van verzoeken van opslagoperaties. Gegevens worden opgeslagen met behulp van twee key-value opslagsystemen, gerealiseerd op basis van de Tsavorite-bibliotheek. De eerste 'primaire' opslag is geoptimaliseerd voor snelle uitvoering van stringoperaties, terwijl de tweede 'object' opslag is geoptimaliseerd voor de opslag van complexe objecten en geavanceerde datatypes, zoals hashes en lijsten. De datatypes in de tweede opslag zijn gerealiseerd met hulp van .NET-bibliotheken. Gegevens worden opgeslagen in de heap (C# heap), wat efficiƫnte updates mogelijk maakt, en in geserialiseerde vorm op de schijf.

Kenmerken van Garnet:
- Het is mogelijk om meerlaagse opslagsystemen te implementeren die RAM, SSD-opslag en cloudopslag omvatten, waarbij minder vaak gebruikte gegevens naar langzamere opslag worden verplaatst om caches te creƫren die groter zijn dan het RAM-geheugen.
- Uitbreidbare ondersteuning voor apparaten, waarmee lagen kunnen worden gemaakt die zijn geoptimaliseerd voor verschillende apparaten, zoals lagen voor SSD's, harde schijven en Azure Storage cloudopslag.
- Efficiemechanisme voor hergebruik van vrijgekomen geheugenruimte, dat fragmentatie voorkomt.
- Aanpasbare limieten voor de grootte van geheugen die gebruikt wordt voor indexen, logs en objectopslag.
- Voor toegang tot de opslag wordt het RESP-protocol gebruikt, wat het mogelijk maakt om Garnet te gebruiken met ongewijzigde Redis-klanten.
- Ondersteuning voor het opslaan van zowel stringwaarden als complexe datastructuren, zoals lijsten, hashes, verzamelingen, gesorteerde lijsten en geolocatiegegevens. Mogelijkheid om een levensduur voor sleutels te definiƫren.
- Beschikbaarheid van een API voor het uitvoeren van analytische verzoeken (HLL/Hyperloglog, Bitmap), transacties (MULTI/EXEC) en het gebruik van de publicatie/abonnementsparadigma.
- Beschikbaarheid van middelen voor flexibele toegangscontrole via ACL.
- Mogelijkheid om configuratie te definiƫren in JSON-indeling of redis.conf.
- Ondersteuning voor het aansluiten van extra netwerkenhandlers. Mogelijkheid om verkeer te versleutelen met TLS (op basis van SslStream).
- Mogelijkheid om extensies te creƫren in C#, die extra operaties op strings en objecten implementeren.
- Ondersteuning voor transactionele opgeslagen procedures die meerdere sleutels omvatten.
- Mogelijkheid om de toestand te herstellen vanaf een eerder opgeslagen positie (checkpoint-recovery). Beschikbaarheid van een alleen toevoegmodus (AOF, append-only file), waarbij alle oude gegevens beschikbaar blijven en niet worden overschreven.
- Ondersteuning voor het creƫren van een opslagcluster met replicatie, segmentatie (Sharding), dynamische migratie van sleutels tussen knooppunten en herstel van defecte knooppunten.
- Hoge prestaties en lage vertragingen bij het uitvoeren van verzoeken. Effectieve verwerking van kleine batchverzoeken bij een groot aantal klantensessies, wat leidt tot een doorvoersnelheid (aantal verwerkte verzoeken per seconde) die veel hoger is dan die van concurrerende oplossingen. virtuele machines In de Azure-cloud overschrijden de vertragingen voor klantaanroepen in de meeste gevallen niet meer dan 300 microseconden. In uitgevoerde tests presteert Garnet aanzienlijk beter dan Redis, Dragonfly en KeyDB qua prestaties en responsiviteit. In sommige tests overtreft Garnet concurrerende systemen met een factor tien.




Bron: opennet.ru




