È stata pubblicata la prima versione stabile del progetto TidesDB, un sistema per la gestione dei dati in formato chiave/valore. Il progetto può essere utilizzato sia come motore autonomo che per l'integrazione nelle applicazioni. Tra le principali funzionalità spiccano il supporto alle transazioni ACID e l'ottimizzazione per la conservazione efficiente dei dati su dispositivi Flash e nella memoria principale. Il codice è scritto in C e distribuito sotto licenza MPL 2.0. Sono disponibili binding per C++, Go, Java, Python, Rust, Lua e JavaScript.
Per la gestione dei dati viene utilizzata una struttura LSM-tree (albero log-structured con merging), che assicura alte prestazioni non solo durante la lettura, ma anche durante le operazioni di scrittura e modifica dei dati. Le operazioni di lettura non bloccano le scritture e le letture dei dati, mentre le operazioni di scrittura bloccano solo il family di colonne in cui viene effettuata la scrittura. Per migliorare ulteriormente le prestazioni di lettura sono supportati indici e caching basati su bloom filter (che consentono di verificare l'appartenenza a un insieme, ammettendo errori nell'identificazione di un elemento mancante, ma escludendo la mancata identificazione di un elemento esistente).
È supportata pienamente la transazione ACID, che consente di apportare modifiche atomiche a famiglie di colonne e, se necessario, di tornare indietro in modo atomico. I dati possono essere memorizzati in forma compressa con la possibilità di scelta dell'algoritmo di compressione legato alla famiglia di colonne. È possibile impostare blocchi a livello di singole famiglie di colonne e imballare lo storage in modalità parallela senza bloccare l'esecuzione delle operazioni sul database.
Caratteristiche principali:
- Supporto per le famiglie di colonne (Column Families) — set 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 in avanti o indietro rispetto a una posizione scelta nello storage, utilizzando un metodo di ordinamento definito in precedenza.
- Supporto per l'aggiunta di funzioni di confronto delle chiavi personalizzate. Sono disponibili funzioni di confronto integrate come memcmp, string e numeric.
- Gestione del log delle operazioni (WAL, Write-Ahead Log) e ripristino automatico del memtable (archivio in memoria) da questo log all'avvio.
- Utilizzo di filtri Bloom per minimizzare le richieste all'archivio controllando la presenza della chiave prima della lettura da SSTable (archivio permanente).
- Supporto per gli algoritmi Snappy, LZ4 e ZSTD per la compressione delle registrazioni nell'archivio SSTable e nel log WAL.
- Possibilità di definire il tempo di vita delle registrazioni (TTL) ed escludere automaticamente le registrazioni scadute.
- Tre modalità di sincronizzazione dei dati in RAM con l'archivio 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 ciascuna 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, che consente di determinare gli offset dei blocchi con le chiavi senza una scansione completa.
- Formato binario compatto e portabile per la rappresentazione del database, che supporta il versioning.
- Meccanismi integrati di controllo dell'integrità, rilevamento dei danneggiamenti dei dati e ripristino.
Fonte: opennet.ru
