Como criei o meu próprio banco de dados, o Rustbase.
Rust, a linguagem dos sonhos
Em março de 2022, o Filipe Deschamps soltou um vídeo no YouTube chamado: "Essa Linguagem Está ROUBANDO O CORAÇÃO Dos Programadores Mundialmente", nesse vídeo o Filipe falava sobre o Rust e como o Rust estava "roubando corações" e comigo não foi diferente. Assim que terminei de assistir o vídeo, baixei o Rust e comecei a testar a linguagem, foi difícil no começo se acostumar com a línguagem, mas logo aprendi o jeito.
A Ideia
Assim que terminei de aprender as features basicas do Rust, eu tive uma ideia: "Porque não fazer um banco de dados noSQL em Rust?", e assim fiz. Em 23 de março de 2022 (9 dias depois do vídeo do Filipe), criei a organização do Github e comecei a codar, e em 16 de Abril de 2022 fiz os primeiros commits.
O atraso
A principio queria fazer um banco de dados orientados a documentos, estilo MongoDB, porém, eu não tinha conhecimentos nenhum de banco de dados e como o sistema eram feitos, por isso, eu tive meses de atraso do projeto, eu estava pesquisando muito sobre como um DB funciona e etc (foi de Maio até Agosto só pesquisando sobre).
DustData
Com a minha pesquisa descubri algo chamado LSM-Tree (ou Log Strutured Merge Tree), que era uma estrutura de dados muito usado em bancos de dados key-value, e assim que descobri isso criei o DustData, o Storage Engine do Rustbase.
Pós-DustData
Assim que terminei as funcionalidades basicas do DustData, implementei o DustData no Rustbase e atualmente o Rustbase fica responsável por ser o principal servidor do banco de dados.
Como funciona o Rustbase?
Bem, como havia dito, o core do Rustbase é o DustData, que usa o LSM-Tree como estrutura de dados. o LSM-Tree é separado por 4 partes: Memtable, SStable, Index e Filter:
Memtable
É um armazenamento temporário na memória RAM. Quando algum dado for inserido, aqui é o primeiro lugar que ele irá ficar. Assim que o memtable chegar a um certo espaço na memória RAM, ele irá ser "flushiado" para o SSTable
SSTable
Sorted String Table (ou SSTable) é uma tabela que fica no disco e é imutável, o SSTable é separado por segmentos e cada segmento tem uma chave e valor.
Index
Talvez uma das partes mais importantes de um DB, o Index é um dicionário que indica qual é o endereço de um valor no disco usando uma chave. O index é uma ótima forma de deixar o DB mais rápido.
Filter
Filter é um filtro que indica se tal chave realmente existe no SSTable/Index. No caso do DustData usei o Bloom Filter.
Resultados do Rustbase
Os resultados do Rustbase realmente me impressionou, não achei que o Rustbase fosse tão rapido assim.
Benchmark
Vamos testar o Rustbase junto com o Redis (um banco de dados chave-valor que armazena os dados na memória)
Usando o Rustbase v0.4.0 e o Redis v7, chegamos a esse resultados:
Usando Ryzen 5 5500, sem utilizar pipelines em ambos.
Rustbase
Inserido 10k de dados em: 489.5ms
Pegando 10k de dados em: 492ms
Deletando 10k de dados em: 500.9ms
Redis
Inserido 10k de dados em: 586.2ms
Pegando 10k de dados em: 551.4ms
Deletando 10k de dados em: 545.1ms
É MAIS RÁPIDO QUE O REDIS!!!!!
Mesmo que seja poucos ms de diferença, isso ainda é realmente de se impressionar.
Github do Rustbase: https://github.com/rustbase/rustbase
Github do DustData: https://github.com/rustbase/dustdata
Site do projeto: https://rustbase.app/