Microsoft har frigivet kildekoden til NoSQL-systemet Garnet, som er designet til at oprette cache-lagre og er kompatibelt med eksisterende klientsbiblioteker til Redis-lageret. Garnet understøtter oprettelse af skalerbare klynger til datacaching, hvor replikation, nøglemigration og datasegmentering mellem klynge-noder kan anvendes. Projektet er skrevet i C# med en lagernucleus i C++ og er åbent under MIT-licensen; det kan køre på alle platforme, der understøttes i .NET (de primære platforme nævnt er Linux og Windows).
Til datalagring anvendes Tsavorite-motoren (et fork af Microsoft FASTER-lageret), som understøtter multitrådet behandling af forespørgsler, transaktioner, ændringscheckpointing i et ikke-blokerende miljø, genopretning efter fejl, opbevaring af redundante kopier og logførelse af operationer. Netværkshandleren i Garnet er bygget med en delt hukommelsesarkitektur foreslået af forskningsprojektet ShadowFax. TLS-behandling og interaktion med lageret udføres i én tråd, hvilket muliggør at undgå omkostningerne ved trådskift og mere effektivt bruge CPU-cache under dataoverførsel over netværket.
Garnet-arkitekturen adskiller forespørgselsparsing og behandlingslogik fra lageroperationer. Data opbevares ved hjælp af to nøgle-værdi-lagre, der er implementeret på basis af Tsavorite-biblioteket. Det første "primære" lager er optimeret til hurtig håndtering af strengeoperationer, mens det andet "objekt" lager er optimeret til opbevaring af komplekse objekter og avancerede datatyper som hashes og lister. Datatyperne i det andet lager er implementeret ved hjælp af .NET-biblioteker. Data opbevares i C#-heap'en, hvilket muliggør effektiv opdatering og i serialiseret form på disken.

Funktioner i Garnet:
- Muligheden for at implementere flerlagede lagre, der dækker RAM, SSD-drev og cloud-lagre, hvor mindre efterspurgte data bliver skubbet til langsommere lagre for at skabe caches, der er større end RAM.
- Skalerbar enhedssupport, der muliggør oprettelse af lag, der er optimeret til forskellige enheder, f.eks. lag til SSD'er, harddiske og Azure Storage.
- Effektiv mekanisme til genbrug af frigivet hukommelse, der forhindrer fragmentering.
- Tilpassede grænser for størrelsen på hukommelsen, der bruges til indeks, log og objektlagring.
- Redis anvender RESP-protokollen til at få adgang til lageret, hvilket gør det muligt at bruge Garnet med ikke-modificerede Redis-klienter.
- Støtte til både strenge værdier og komplekse dataposter som lister, hashes, sæt, sortere lister og geolokationsdata. Mulighed for at definere en nøgleværdi livscyklus.
- API til udførelse af analytiske forespørgsler (HLL/Hyperloglog, Bitmap), transaktioner (MULTI/EXEC) og brug af publicerings-/abonnementsparadigmet.
- Værktøjer til fleksibel adgangsstyring via ACL.
- Mulighed for at definere konfiguration i JSON-format eller redis.conf.
- Støtte til tilslutning af yderligere netværkshåndterere. Mulighed for kryptering af trafik ved hjælp af TLS (baseret på SslStream).
- Mulighed for at oprette udvidelser på C#, der implementerer ekstra operationer med strenge og objekter.
- Støtte til transaktionelle lagrede procedurer, der dækker flere nøgler.
- Mulighed for at gendanne tilstanden fra en tidligere gemt position (checkpoint-recovery). Tilstedeværelse af en append-only mode (AOF), hvor alle gamle data forbliver tilgængelige og ikke overskrives.
- Støtte til oprettelse af et clustersystem med lagring, replikering, segmentering (Sharding), dynamisk migration af nøgler mellem noder og genopretning af fejlede noder.
- Høj ydeevne og lave latenser ved udførelse af forespørgsler. Effektiv behandling af små batch-forespørgsler ved et stort antal klientsessioner, hvilket muliggør en gennemløb (antal behandlede forespørgsler pr. sekund), der er en ordre højere end konkurrerende løsninger. Ved opstart i virtuelle maskiner I Azure-skyen overstiger klientens ventetider i de fleste tilfælde ikke 300 mikrosekunder. I gennemførte tests overgår Garnet markant Redis, Dragonfly og KeyDB med hensyn til ydeevne og reaktivitet. I nogle tests overgår Garnet konkurrenternes systemer ti gange.




Kilde: opennet.ru




