Foi lançada a sistema de cache e armazenamento de dados em memória, Dragonfly, que manipula dados no formato chave/valor e pode ser aplicada como uma solução leve para acelerar o desempenho de sites de alta carga, cacheando solicitações lentas a bancos de dados e dados intermediários em memória. Dragonfly suporta os protocolos Memcached e Redis, permitindo o uso de bibliotecas de clientes já existentes e a migração de projetos que utilizam Memcached e Redis para Dragonfly sem reescrever o código.
Em comparação com o Redis, no Dragonfly, em condições típicas de carga dentro do ambiente Amazon EC2 c6gn.16xlarge, conseguimos um aumento de 25 vezes no desempenho (3,8 milhões de solicitações por segundo). Em comparação com o Memcached no ambiente AWS c6gn.16xlarge, o Dragonfly conseguiu executar 4,7 vezes mais solicitações por segundo para gravação (3,8 milhões contra 806 mil) e 1,77 vezes mais solicitações por segundo para leitura (3,7 milhões contra 2,1 milhões).

Nos testes de armazenamento de 5 GB de dados, o Dragonfly exigiu 30% menos memória do que o Redis. Durante a criação de snapshots com o comando 'bgsave', o consumo de memória aumenta, mas nos picos, ele permaneceu quase três vezes menor do que no Redis, e a própria operação de gravação do snapshot é realizada de forma significativamente mais rápida (no teste, o snapshot no Dragonfly foi gravado em 30 segundos, enquanto no Redis levou 42 segundos).

Desempenho elevado é alcançado graças à arquitetura multithreaded sem compartilhamento de recursos (shared-nothing), que implica a vinculação de um manipulador isolado a cada thread, cada um com sua própria porção de dados, operando sem mutexes e bloqueios spin. Para garantir a atomicidade ao trabalhar com várias chaves, são utilizadas bloqueios leves VLL. Para o armazenamento eficiente de informações na memória, é utilizada a estrutura dashtable, implementando uma variante de tabelas hash particionadas.
Algumas funcionalidades do Dragonfly:
- Modo de cache, onde o deslocamento automático de dados antigos por novos é garantido após o esgotamento da memória disponível.
- Suporte à vinculação à vida útil dos dados, durante a qual os dados são considerados válidos.
- Suporte à gravação do estado do armazenamento em disco em segundo plano para recuperação posterior após reinício.
- A presença de um console HTTP (ligado à porta TCP 6379) para gerenciar o sistema e uma API para fornecer métricas, compatível com o Prometheus.
- Suporte a 185 comandos do Redis, correspondendo aproximadamente à funcionalidade do lançamento do Redis 5.
- Suporte a todos os comandos do Memcached, exceto CAS (check-and-set).
- Suporte a operações assíncronas para criação de snapshots.
- Consumo de memória previsível.
- Interprete Lua 5.4 embutido.
- Suporte a tipos de dados complexos, como hashes, conjuntos, listas (ZSET, HSET, LIST, SETS e STRING) e dados em formato JSON.
- Suporte à replicação do armazenamento para garantir tolerância a falhas e balanceamento de carga.
O código Dragonfly é escrito em C/C++ e é distribuído sob a licença BSL (Business Source License). A licença BSL foi proposta pelos cofundadores do MySQL como uma alternativa ao modelo Open Core. A essência da BSL é que o código de recursos avançados está inicialmente disponível para alterações, mas por um período de tempo pode ser utilizado gratuitamente apenas sob condições adicionais, para o que é necessário adquirir uma licença comercial. As condições de licença adicionais do projeto Dragonfly estipulam a transição do código para a licença Apache 2.0 em 15 de março de 2028. Até essa data, a licença permite que o código seja usado apenas para garantir o funcionamento de seus serviços e produtos, mas proíbe a aplicação para a criação de serviços em nuvem pagos que funcionem como uma camada sobre o Dragonfly.
A versão Dragonfly 1.0 é notável pela implementação do suporte à replicação de dados do primário servidor para o secundário. Nesse sentido, o Dragonfly pode ser configurado para funcionar como um armazenamento secundário, recebendo dados de um servidor primário, tanto baseado em Dragonfly quanto em Redis. A API para gerenciar a replicação é compatível com o Redis e se baseia no uso dos comandos ROLE e REPLICAOF (SLAVEOF).
Fonte: opennet.ru
