A Microsoft abriu o código-fonte do sistema NoSQL Garnet, projetado para criar armazenamentos em cache e compatível com as bibliotecas de clientes existentes para o armazenamento Redis. Garnet suporta a criação de clusters escaláveis para o cache de dados, onde é possível usar replicação, migração de chaves e segmentação de dados entre os nós do cluster. O projeto é escrito na linguagem C# com um núcleo de armazenamento em C++, está disponível sob licença MIT e pode operar em todas as plataformas suportadas pelo .NET (as plataformas primárias anunciadas são Linux e Windows).
Para o armazenamento de dados, é utilizado o motor Tsavorite (um fork do armazenamento Microsoft FASTER), que suporta processamento de solicitações em múltiplas threads, transações, gravação de alterações em modo não bloqueante (checkpointing), recuperação de falhas, manutenção de cópias redundantes e registro de operações. O manipulador de rede em Garnet é construído usando uma arquitetura de memória compartilhada proposta pelo projeto de pesquisa ShadowFax. O processamento TLS e a interação com o armazenamento são realizados em uma única thread, o que permite evitar sobrecargas de troca de threads e utilizar mais eficientemente o cache da CPU durante a transmissão de dados pela rede.
A arquitetura do Garnet separa a lógica de análise e processamento de solicitações das operações de armazenamento. Os dados são armazenados utilizando dois armazenamentos no formato chave-valor, implementados com base na biblioteca Tsavorite. O primeiro armazenamento "principal" é otimizado para a execução rápida de operações com strings, enquanto o segundo armazenamento "objetos" é otimizado para acomodar objetos complexos e tipos de dados avançados, como hashes e listas. Os tipos de dados no segundo armazenamento são implementados com o auxílio das bibliotecas .NET. Os dados são armazenados no heap (C# heap), o que permite atualizações eficientes, e em formato serializado no disco.

Recursos do Garnet:
- É possível implantar armazenamentos em múltiplos níveis, abrangendo memória RAM, unidades SSD e armazenamentos em nuvem, onde dados menos acessados são deslocados para armazenamentos mais lentos para criar caches maiores do que a memória RAM.
- Suporte expandível para dispositivos, permitindo a criação de camadas otimizadas para diferentes dispositivos, como camadas para SSDs, discos rígidos e armazenamento em nuvem Azure Storage.
- Um mecanismo eficiente de reutilização do espaço livre na memória RAM, prevenindo a fragmentação.
- Limites configuráveis para o tamanho da memória utilizada para índices, logs e armazenamento de objetos.
- Para acesso ao armazenamento, utiliza-se o protocolo RESP, permitindo que o Garnet funcione com clientes Redis não modificados.
- Suporte para armazenar tanto valores de string quanto estruturas de dados complexas, como listas, hashes, conjuntos, listas ordenadas e dados de geolocalização. Capacidade de definir o tempo de vida da chave.
- Disponibilidade de API para execução de consultas analíticas (HLL/Hyperloglog, Bitmap), transações (MULTI/EXEC) e uso da paradigma de publicação/assinatura.
- Existência de ferramentas para gerenciamento flexível de acesso via ACL.
- Possibilidade de definir a configuração no formato JSON ou redis.conf.
- Suporte para conectar manipuladores de rede adicionais. Possibilidade de criptografar o tráfego usando TLS (baseado em SslStream).
- Capacidade de criar extensões em C# que implementam operações adicionais em strings e objetos.
- Suporte para procedimentos armazenados transacionais, abrangendo várias chaves.
- Capacidade de restaurar o estado a partir de uma posição previamente salva (checkpoint-recovery). Disponibilidade de um modo somente de adição (AOF, arquivo somente para adição), onde todos os dados antigos permanecem acessíveis e não são substituídos.
- Suporte para criar um cluster de armazenamento com replicação, segmentação (Sharding), migração dinâmica de chaves entre nós e recuperação de nós com falha.
- Alta performance e baixas latências na execução de consultas. Processamento eficiente de pequenos lotes de consultas com um grande número de sessões de cliente, permitindo alcançar uma capacidade (número de consultas processadas por segundo) significativamente superior à de soluções concorrentes. máquinas virtuais No ambiente Azure, na maioria dos casos, a latência de acesso do cliente não ultrapassa 300 microssegundos. Em testes realizados, o Garnet supera significativamente o Redis, Dragonfly e KeyDB em termos de desempenho e responsividade. Em alguns testes, o Garnet supera sistemas concorrentes por dez vezes.




Fonte: opennet.ru




