È stata pubblicata la prima versione stabile del progetto TidesDB, che sviluppa una libreria per l'archiviazione dei dati in formato chiave/valore. Il progetto può essere utilizzato sia come motore autonomo che per l'integrazione nelle applicazioni. Tra le funzionalità principali troviamo il supporto per le transazioni ACID e l'ottimizzazione per un'efficiente memorizzazione dei dati su unità Flash e in memoria RAM. Il codice è scritto in C e distribuito con licenza MPL 2.0. Sono stati preparati i bind per i linguaggi C++, Go, Java, Python, Rust, Lua e JavaScript.
Per l'archiviazione dei dati è utilizzata una struttura LSM-tree (albero a log-structured con merging), che garantisce alte prestazioni non solo durante la lettura, ma anche durante l'esecuzione di operazioni di scrittura e modifica dei dati. Le operazioni di lettura non bloccano la scrittura e la lettura dei dati, mentre le operazioni di scrittura bloccano solo la famiglia di colonne in cui viene eseguita la scrittura. Per accelerare ulteriormente la lettura, sono supportati indici e caching basati su bloom filters (che consentono di verificare l'appartenenza a un insieme, ammettendo un falso positivo per un elemento mancante, ma escludendo il salto di un elemento esistente).
È disponibile un supporto completo per le transazioni ACID, che consente di apportare modifiche in modo atomico a insiemi di colonne e di annullare le operazioni in modo atomico, se necessario. I dati possono essere memorizzati in forma compressa con la scelta dell'algoritmo di compressione specifico per ogni famiglia di colonne. È possibile impostare blocchi a livello di singole famiglie di colonne e di impacchettamento dello storage in modalità parallela senza bloccare l'esecuzione delle operazioni sul database.
Funzionalità principali:
- Supporto per le famiglie di colonne (Column Families) - insieme isolati di dati in formato chiave/valore. Ogni famiglia di colonne utilizza il proprio memtable, SSTable e WAL-log.
- Transazioni ACID che coprono più operazioni con famiglie di colonne.
- Ottimizzazione per l'accesso parallelo ai dati.
- Supporto per iteratori bidirezionali, che consentono di scorrere le coppie chiave/valore avanti o indietro rispetto alla posizione selezionata nello storage, utilizzando il metodo di ordinamento originariamente specificato.
- Supporto per l'aggiunta di funzioni personalizzate per il confronto delle chiavi. Inclusione di funzioni di confronto incorporate come memcmp, string e numeric.
- Registrazione delle operazioni (WAL, Write-Ahead Log) e ripristino automatico del memtable (memoria volatile) da questo log all'avvio.
- Utilizzo di filtri Bloom per ridurre al minimo le richieste al disco verificando la presenza della chiave prima della lettura da SSTable (memoria permanente).
- Supporto per gli algoritmi Snappy, LZ4 e ZSTD per la compressione delle registrazioni in SSTable e nel WAL.
- Possibilità di definire il tempo di vita delle registrazioni (TTL) e di escludere automaticamente quelle scadute.
- Tre modalità di sincronizzazione dei dati in RAM con la memoria permanente: NONE (la più veloce), BACKGROUND (bilanciata), FULL (la più affidabile).
- Possibilità di configurare le dimensioni del memtable, i metodi di compressione, i filtri Bloom, le modalità di sincronizzazione e i parametri di impacchettamento per ogni famiglia di colonne.
- Semplice API C che restituisce 0 per un'operazione riuscita e -1 in caso di errore.
- Utilizzo di SBHA (Sorted Binary Hash Array) per una rapida ricerca dei dati in SSTable, consentendo di determinare gli offset dei blocchi con le chiavi senza una scansione completa.
- Formato binario compatto e portatile per la rappresentazione del database, con supporto per il versioning.
- Meccanismi integrati di controllo dell'integrità, rilevamento dei dati corrotti e ripristino.
Fonte: opennet.ru
