L'azienda Microsoft ha reso disponibili i codici sorgente del sistema NoSQL Garnet, progettato per la creazione di magazzini di caching e compatibile con le attuali librerie client per il magazzino Redis. Garnet supporta la creazione di cluster scalabili per il caching dei dati, nei quali possono essere utilizzati la replica, la migrazione delle chiavi e la segmentazione dei dati tra i nodi del cluster. Il progetto è scritto in C# con un nucleo di storage in C++, è aperto sotto licenza MIT e può funzionare su tutte le piattaforme supportate da .NET (le piattaforme principali dichiarate sono Linux e Windows).
Per lo storage dei dati viene utilizzato il motore Tsavorite (un fork del magazzino Microsoft FASTER), che supporta l'elaborazione delle richieste multithreading, le transazioni, il checkpointing non bloccante, il recupero dopo il guasto, il salvataggio di copie ridondanti e la registrazione delle operazioni. Il gestore di rete in Garnet è costruito utilizzando un'architettura di memoria condivisa proposta dal progetto di ricerca ShadowFax. L'elaborazione TLS e l'interazione con il magazzino vengono eseguite in un unico thread, il che consente di evitare il sovraccarico dello switching dei thread e di utilizzare più efficacemente la cache della CPU durante il trasferimento dei dati in rete.
L'architettura di Garnet separa la logica di parsing e di elaborazione delle richieste dalle operazioni con il magazzino. I dati vengono memorizzati utilizzando due magazzini in formato chiave-valore, realizzati con la libreria Tsavorite. Il primo magazzino "principale" è ottimizzato per l'esecuzione rapida di operazioni con stringhe, mentre il secondo magazzino "oggettuale" è ottimizzato per la memorizzazione di oggetti complessi e tipi di dati avanzati, come hash e liste. I tipi di dati nel secondo magazzino sono implementati utilizzando le librerie .NET. I dati sono memorizzati nell'heap (heap C#), il che consente il loro aggiornamento efficiente, e in forma serializzata su disco.

Caratteristiche di Garnet:
- È possibile implementare magazzini stratificati che coprono la memoria RAM, unità SSD e magazzini cloud, nei quali i dati meno richiesti vengono spostati in magazzini più lenti per creare cache di dimensioni superiori alla memoria RAM.
- Supporto estensibile per dispositivi che consente la creazione di livelli ottimizzati per funzionare con vari dispositivi, ad esempio, ci sono livelli per SDD, dischi rigidi e archiviazione cloud Azure Storage.
- Meccanismo efficace per il riutilizzo dello spazio liberato nella memoria, che previene la frammentazione.
- Limiti configurabili sulla dimensione della memoria utilizzata per indici, log e archiviazione di oggetti.
- Per accedere all'archiviazione si utilizza il protocollo RESP, che consente di utilizzare Garnet con client Redis non modificati.
- Supporto per l'archiviazione sia di valori stringa che di strutture dati complesse, come liste, hash, insiemi, liste ordinate e dati di geolocalizzazione. Possibilità di definire il tempo di vita di una chiave.
- Disponibilità di API per l'esecuzione di query analitiche (HLL/Hyperloglog, Bitmap), transazioni (MULTI/EXEC) e utilizzo della paradigma pubblicazione/sottoscrizione.
- Esistenza di strumenti per una gestione flessibile degli accessi tramite ACL.
- Possibilità di definire la configurazione in formato JSON o redis.conf.
- Supporto per la connessione di ulteriori gestori di rete. Possibilità di crittografare il traffico utilizzando TLS (basato su SslStream).
- Possibilità di creare estensioni in C#, che implementano operazioni aggiuntive su stringhe e oggetti.
- Supporto per procedure memorizzate transazionali che interessano più chiavi.
- Possibilità di ripristinare lo stato da una posizione precedentemente salvata (checkpoint-recovery). Presenza di una modalità solo aggiunta (AOF, append-only file), in cui tutti i dati precedenti rimangono disponibili e non vengono sovrascritti.
- Supporto per la creazione di un cluster di archiviazione con replica, partizionamento (Sharding), migrazione dinamica delle chiavi tra i nodi e ripristino dei nodi guasti.
- Alte prestazioni e basse latenze nell'esecuzione delle query. Elaborazione efficace di piccole richieste batch con un elevato numero di sessioni client, che consente di raggiungere una capacità (numero di richieste elaborate al secondo) di un ordine superiore rispetto alle soluzioni concorrenti. All'avvio in macchine virtuali Nel cloud Azure, nella maggior parte dei casi, i tempi di latenza per la connessione del cliente non superano i 300 microsecondi. Nei test effettuati, Garnet supera significativamente Redis, Dragonfly e KeyDB in termini di prestazioni e reattività. In alcuni test, Garnet ha battuto i sistemi concorrenti fino a dieci volte.




Fonte: opennet.ru




