La société Microsoft a ouvert le code source du système NoSQL Garnet, conçu pour créer des stockages en cache et compatible avec les bibliothèques clientes existantes pour le stockage Redis. Garnet prend en charge la création de clusters évolutifs pour la mise en cache des données, pouvant utiliser la réplication, la migration des clés et le segmentage des données entre les nœuds du cluster. Le projet est écrit en C# avec un noyau de stockage en C++, est ouvert sous licence MIT et peut fonctionner sur toutes les plateformes prises en charge par .NET (Linux et Windows étant les plateformes principales).
Le moteur Tsavorite (un fork du stockage Microsoft FASTER) est utilisé pour le stockage des données, prenant en charge le traitement multithread des requêtes, les transactions, la validation des modifications en mode non-bloquant (checkpointing), la reprise après défaillance, la conservation de copies redondantes et la journalisation des opérations. Le gestionnaire réseau dans Garnet est construit en utilisant l'architecture de mémoire partagée proposée par le projet de recherche ShadowFax. Le traitement TLS et l'interaction avec le stockage s'effectuent dans un seul thread, ce qui permet d'éviter les surcoûts liés aux commutations de thread et d'utiliser plus efficacement le cache CPU lors du transfert de données sur le réseau.
L'architecture de Garnet sépare la logique d'analyse et de traitement des requêtes des opérations de stockage. Les données sont stockées à l'aide de deux stockages au format clé-valeur, réalisés avec la bibliothèque Tsavorite. Le premier stockage « principal » est optimisé pour l'exécution rapide des opérations sur les chaînes, tandis que le deuxième stockage « d'objet » est optimisé pour le stockage d'objets complexes et de types de données étendus tels que des hachages et des listes. Les types de données dans le second stockage sont réalisés avec l'utilisation des bibliothèques .NET. Les données sont stockées dans le tas (C# heap), ce qui permet de les mettre à jour efficacement, et sous une forme sérialisée sur le disque.

Caractéristiques de Garnet :
- Il est possible de déployer des stockages multicouches, englobant la mémoire vive, les SSD et les stockages cloud, où les données moins sollicitées sont évincées vers des stockages plus lents pour créer des caches de taille supérieure à la mémoire vive.
- Prise en charge extensible des appareils, permettant la création de couches optimisées pour différents dispositifs, par exemple, il existe des couches pour SSD, disques durs et stockage cloud Azure.
- Mécanisme efficace de réutilisation de l'espace libéré en mémoire vive, empêchant la fragmentation.
- Limites configurables sur la taille de la mémoire utilisée pour les index, les journaux et le stockage des objets.
- Pour accéder au stockage, le protocole RESP est utilisé, permettant d'utiliser Garnet avec des clients Redis non modifiés.
- Prise en charge du stockage à la fois de valeurs string et de structures de données complexes, telles que les listes, les hachages, les ensembles, les listes triées et les données de géolocalisation. Possibilité de définir le temps de vie d'une clé.
- Disponibilité d'une API pour exécuter des requêtes analytiques (HLL/Hyperloglog, Bitmap), des transactions (MULTI/EXEC) et utiliser le paradigme publication/souscription.
- Disponibilité d'outils pour une gestion flexible des accès via ACL.
- Possibilité de définir la configuration au format JSON ou redis.conf.
- Prise en charge de la connexion de gestionnaires réseau supplémentaires. Possibilité de chiffrer le trafic en utilisant TLS (sur la base de SslStream).
- Possibilité de créer des extensions en C#, mettant en œuvre des opérations supplémentaires sur les chaînes et les objets.
- Prise en charge des procédures stockées transactionnelles, couvrant plusieurs clés.
- Possibilité de restaurer l'état à partir d'une position précédemment enregistrée (checkpoint-recovery). Disponibilité d'un mode d'ajout uniquement (AOF, append-only file), où toutes les anciennes données restent accessibles et ne sont pas remplacées.
- Prise en charge de la création d'un cluster de stockage avec réplication, partitionnement (Sharding), migration dynamique des clés entre les nœuds et récupération des nœuds en panne.
- Haute performance et faibles latences lors de l'exécution des requêtes. Traitement efficace des petites requêtes groupées avec un grand nombre de sessions client, permettant d'atteindre une bande passante (nombre de requêtes traitées par seconde) bien supérieure à celle des solutions concurrentes. des machines virtuelles Dans le cloud Azure, dans la plupart des cas, les latences d'accès des clients ne dépassent pas 300 microsecondes. Dans les tests effectués, Garnet surpasse de manière significative Redis, Dragonfly et KeyDB en termes de performance et de réactivité. Dans certains tests, Garnet surpassait les systèmes concurrents de dix fois.




Source : opennet.ru




