Após três meses de desenvolvimento, foi lançado a biblioteca libmdbx 0.10.0 (MDBX), implementando um banco de dados embutido de alto desempenho e compacto, do tipo chave-valor. O código do libmdbx é distribuído sob a licença OpenLDAP Public License. O libmdbx é uma reestruturação profunda do SGBD LMDB e, segundo os desenvolvedores, supera seu antecessor em confiabilidade, recursos e desempenho. Alega-se que o libmdbx é até 20% mais rápido que o LMDB em cenários CRUD e até 30% mais rápido caso o controle interno seja desativado durante a compilação, atingindo níveis comparáveis ao LMDB.
O libmdbx oferece ACID, serialização rigorosa de alterações e leitura não bloqueante com escalabilidade linear em núcleos de CPU. No libmdbx, há um grande foco na qualidade do código, estabilidade da API, testes e verificações automáticas. Suporta autocompactação, gerenciamento automático do tamanho do banco de dados, um formato unificado de banco de dados para compilações de 32 e 64 bits, estimativa de volume de amostras por intervalos (range query estimation). Inclui uma ferramenta para verificação de integridade da estrutura do banco de dados com algumas capacidades de recuperação. Desde 2016, o projeto é financiado pela Positive Technologies e, desde 2017, utilizado em seus produtos, e as sanções impostas pelo governo dos EUA contra a Positive Technologies não têm um impacto notável.
Principais inovações, melhorias e correções adicionadas após o último lançamento:
- Estão disponíveis as ligações para Ruby de Mahlon E. Smith e uma versão de teste das ligações para Python de Noel Kuntze, além das ligações atualizadas para GoLang de Alexey Sharov.
- Para o modo "MDBX_WRITEMAP", onde os dados do banco de dados são alterados diretamente na RAM, foi implementada uma "transferência transparente" das páginas de banco de dados alteradas para o disco. Agora, após cada operação, essas páginas estão imediatamente prontas para serem escritas no disco, e o núcleo do sistema operacional pode descarregar as páginas alteradas no disco de forma independente, sem que a confirmação da transação exija sua modificação. Como resultado, em cenários de alta carga com falta de RAM, o volume de operações em disco pode diminuir até 2 vezes.
- Foi implementada a remoção de cópias sombra antigas de páginas alteradas, priorizando a remoção de páginas com valores grandes/extensos, que na grande maioria dos cenários são alterados apenas uma vez por transação. Isso reduz o volume de troca com o disco e aumenta o desempenho em cenários com transações muito grandes.
- Foi implementado um modo "inteligente" de divisão de páginas ao inserir chaves. Agora, ao inserir sequências ordenadas, o preenchimento total das páginas é garantido automaticamente, enquanto, nos outros casos, há um balanceamento de árvore mais otimizado. Como resultado, em média, as páginas do banco de dados são preenchidas de forma mais eficiente e a árvore B se torna mais balanceada, o que impacta positivamente no desempenho.
- Adicionada estatística de operações com páginas, permitindo uma avaliação precisa do custo das operações de modificação no banco de dados.
- Eliminados mais de uma dezena de falhas e erros, incluindo: problemas resolvidos com a construção usando MinGW, uso de `std::filesystem::path` em iOS <= 13.0, construção visando versões mais antigas do Windows, etc.
- No total, foram feitas mais de 200 alterações em 66 arquivos, adicionadas aproximadamente 6500 linhas e removidas cerca de 4500.
Vale destacar a escolha do projeto Turbo-Geth (fork turbo do Go-Ethereum) pela libmdbx como novo backend de armazenamento, além de agradecer à equipe do projeto (especialmente Alexey Sharov, Artem Vorotnikov e Alexey Akhunov) pela grande ajuda nos testes em cenários extremos de uso. Em particular, um defeito na gestão de leitura antecipada/cache que causava a degradação do desempenho em cenários complexos com grandes bancos de dados foi identificado e corrigido.
Fonte: opennet.ru
