La libreria libmdbx è un discendente sostanzialmente rielaborato di LMDB, un database embedded di classe key-value altamente performante e compatto.
La versione attuale v0.5 è un rilascio tecnico che segna il completamento di eventuali modifiche e il passaggio alla fase di test pubblico finale e stabilizzazione, con la successiva creazione del primo rilascio completo della libreria.
LMDB è un sistema di gestione di database (DBMS) embedded transazionale di classe "key-value" piuttosto noto basato su albero B+ senza journalizzazione preventiva, che consente a un insieme di processi multithread di lavorare in modo concorrente e estremamente efficiente con un database locale condiviso (non di rete). A sua volta, MDBX è più veloce e affidabile di LMDB, mantenendo tutte le funzionalità chiave del suo predecessore, come ACID e lettura non bloccante con scalabilità lineare sulle CPU, oltre ad aggiungere diverse novità.
La descrizione delle differenze e dei miglioramenti di libmdbx rispetto a LMDB merita un articolo a parte (è prevista la pubblicazione su "Habr" e "Medium"). Qui è opportuno menzionare le più importanti e significative:
- Si presta significativamente maggiore attenzione alla qualità del codice, al testing e alle verifiche automatiche.
- Maggiore controllo durante l'esecuzione, dalla verifica dei parametri fino all'audit interno delle strutture del database.
- Auto-compattazione e gestione automatica della dimensione del database.
- Formato unificato del database per build a 32 bit e 64 bit.
- Valutazione del volume delle query per intervalli (range query estimation).
- Supporto per chiavi di dimensioni doppie e dimensione della pagina del database selezionabile dall'utente.
Il rilascio candidato di libmdbx è il risultato di una decisione (vedi sotto) di separare i progetti MDBX e MithrilDB nell'agosto 2019. In questo contesto, è stato deciso di eliminare il massimo tecnico (razionale) e stabilizzare la libreria. Di fatto, nella direzione indicata è stato fatto da 2 a 3 volte di più di quanto stimato e pianificato inizialmente:
- È stata implementata la supporto per Mac OS e piattaforme di "secondo livello": FreeBSD, Solaris, DragonFly BSD, OpenBSD, NetBSD. Il supporto per AIX e HP-UX potrebbe essere aggiunto in caso di necessità.
- È stata effettuata una bonifica del codice utilizzando Undefined Behavior Sanitizer e Address Sanitizer, eliminando tutti gli avvertimenti durante la compilazione con -Wpedantic, tutti gli avvertimenti dell'analizzatore statico Coverity, ecc.
- Aggiornamento della descrizione API.
- Amalgamazione del codice sorgente per facilitare l'integrazione.
- Supporto per CMake.
- Supporto per transazioni annidate.
- Utilizzo di bootid per determinare il fatto del riavvio del sistema operativo (arresto anomalo del database).
- Conteggio continuo delle pagine aggiornate/vecchie e informazioni dettagliate sulle transazioni.
- Opzione MDBX_ACCEDE per connettersi a un database già aperto in modalità compatibile.
- Utilizzo bloccaggi OFD se disponibili.
- Backup caldo in pipe.
- Algoritmo di ordinamento interno specializzato e ottimizzato (fino a 2-3 volte più veloce di qsort() e fino al 30% più veloce di std::sort()).
- Lunghezza massima della chiave aumentata.
- Controllo automatico del read ahead (strategia di caching dei file del database in memoria).
- Compattazione automatica più aggressiva e veloce.
- Strategia di merging delle pagine B+ tree più ottimale.
- Controllo dei file system non locali (NFS, Samba, ecc.) per prevenire danni al database in caso di uso improprio.
- Espanso il set di test.
Lo sviluppo della «prossima» versione di libmdbx continuerà nell'ambito di un progetto separato. MithrilDB, mentre la direzione di sviluppo della «versione attuale» di MDBX è focalizzata sulla congelazione del set di funzionalità e sulla stabilizzazione. Questa decisione è stata presa per tre motivi:
- Incompatibilità totale: per implementare tutte le funzionalità programmate in MithrilDB è necessario un formato di file del database diverso (incompatibile) e un'API diversa (incompatibile).
- Nuovo codice sorgente: per il codice sorgente di MithrilDB è garantita l'indipendenza di licenza da LMDB, e il progetto stesso è previsto per la pubblicazione con un'altra licenza (approvata da OSI licenza Apache 2.0, e non OpenLDAP Foundation).
- La separazione consente di evitare potenziali confusioni, di apportare maggiore certezza e garantire l'autonomia delle direzioni di sviluppo dei progetti.
MithrilDB, come MDBX, si basa anch'esso su B+ tree e presenterà anche un'eccezionale alta prestazione, eliminando al contempo una serie di difetti fondamentali di MDBX e LMDB. In particolare, sarà risolto il problema delle «letture lunghe», manifestandosi come un «gonfiore» del database a causa dell'interferenza di transazioni di lettura lunghe con la raccolta di spazzatura. Tra le nuove funzionalità di MithrilDB si segnala:
- supporto per il posizionamento del database su più supporti eterogenei: HDD, SSD e memoria non volatile.
- strategie ottimali per dati "preziosi" e "di scarso valore", per dati "caldi", "tiepidi" e "freddi".
- uso degli alberi Merkle per il controllo dell'integrità del database.
- uso opzionale di WAL e prestazioni significativamente superiori in scenari con scritture intensive e garanzie di integrità dei dati.
- registrazione pigra conforme dei dati sui dischi.
Fonte: linux.org.ru
