Die Version 0.13.1 der libmdbx-Bibliothek (MDBX) wurde veröffentlicht, die eine hochleistungsfähige kompakte eingebettete Key-Value-Datenbank implementiert. Der Code von libmdbx wird unter der Apache 2.0-Lizenz verbreitet. Alle aktuellen Betriebssysteme und Architekturen werden unterstützt, einschließlich des russischen Elbrus 2000. Für libmdbx wird eine umfassende API für C++ angeboten, ebenso wie von Enthusiasten unterstützte Bindungen an die Sprachen Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno und Scala.
Historisch gesehen ist libmdbx eine umfassende Überarbeitung der Datenbank LMDB und übertrifft ihren Vorgänger in Bezug auf Zuverlässigkeit, Funktionsumfang und Leistung. Im Vergleich zu LMDB wird in libmdbx erheblicher Wert auf die Codequalität, die stabile API-Arbeit, das Testen und automatische Prüfungen gelegt. Ein Dienstprogramm zur Überprüfung der Integrität der Datenbankstruktur mit einigen Wiederherstellungsfunktionen wird bereitgestellt. Technologisch bietet libmdbx ACID, strenge Serialisierung von Änderungen und nicht blockierendes Lesen mit linearer Skalierung über mehrere CPU-Kerne. Die automatische Kompaktifizierung, automatische Verwaltung der Datenbankgröße und Schätzung des Umfangs von Abfragen nach Bereichen (range query estimation) werden unterstützt.
Hauptänderungen:
- Lizenzänderung des Codes von OpenLDAP Public License auf Apache 2.0.
- Erweiterung der API für Cursors mit benutzerfreundlicheren und offensichtlicheren Positionierungsoperationen ähnlich den Bedingungen <, =, > sowohl für Schlüssel als auch für Schlüssel-Wert-Paare. Es wurden Funktionen wie mdbx_cursor_unbind() und mdbx_txn_release_all_cursors() hinzugefügt, um eine flexible Verwaltung von Cursors in Wiederverwendungsszenarien zur Senkung der Overheadkosten zu ermöglichen. Die Funktionen mdbx_cursor_scan() und mdbx_cursor_scan_from() zum Scannen von Tabellen mit einem funktionalen Prädikat wurden mit der Absicht hinzugefügt, die damit verbundenen Overheadkosten zu reduzieren.
- Überarbeitung der Cursors zur Vereinheitlichung des Verhaltens, zur Schaffung eines konsistenteren Codes und zur Reduzierung der Verzweigungen und Maschinenoperationen.
- Verschiebung der Funktionalität des Tools mdbx_chk in die Bibliothek in Form der Funktion mdbx_env_chk() zur Überprüfung der Integrität der Datenbankstruktur, einschließlich der Einbeziehung der Anwendungslogik.
- Die Option MDBX_opt_gc_time_limit für eine flexiblere Kontrolle über die Zeit, die für die Suche nach benachbarten freien Seiten im GC benötigt wird.
- Erhebliche Reduzierung der Overheadkosten beim Start von Transaktionen in Szenarien mit einer Vielzahl von DBI-Handles durch verzögerte/latente Initialisierung von Elementen in den Hilfstabellen. Dazu gehört ein unterstützender Mechanismus für spärliche DBI-Handles, der durch die Build-Option MDBX_ENABLE_DBI_SPARSE gesteuert wird, die standardmäßig aktiviert ist.
- Senken der Overheadkosten beim Öffnen von DBI-Handles. Dazu gehört ein Mechanismus für verzögertes Freigeben und Unterstützung eines schnellen Öffnungsweges ohne Verwendung von Sperren, gesteuert durch die Build-Option MDBX_ENABLE_DBI_LOCKFREE, die standardmäßig aktiviert ist.
- Unterstützung für das "Parken" lesender Transaktionen, um alte MVCC-Schnappschüsse neu zu verarbeiten und Probleme zu verhindern, die durch das Anhalten der Müllverarbeitung verursacht werden. Der Mechanismus zum Parken und Verdrängen geparkter Transaktionen ist sowohl eine Ergänzung als auch eine benutzerfreundliche Alternative zum Rückruf Handle-Slow-Readers. Um die Funktionalität zu erleichtern, haben die Funktionen mdbx_txn_park() und mdbx_txn_unpark() zusätzliche Argumente, um das automatische "Entparken" geparkter und den Neustart verdrängter Transaktionen anzufordern. In das Tool mdbx_copy wurden die entsprechenden Optionen -d und -p hinzugefügt.
- Unterstützung für die Wiederherstellung der offenen Arbeitsumgebung mit der Datenbank in einem Kindprozess nach dem Fork/Abzweigen des Prozesses über mdbx_env_resurrect_after_fork().
- Unterstützung für das Umbenennen von Tabellen über mdbx_dbi_rename() und mdbx_dbi_rename2(). Eine Funktion mdbx_enumerate_tables() wurde hinzugefügt, um Informationen über benannte Benutzertabellen abzurufen.
- Betriebsmodus MDBX_NOSTICKYTHREADS anstelle von MDBX_NOTLS zur Vereinfachung der Integration mit leichten Threads, die zusammen mit Transaktionen der Betriebssystem-Threads multiplexiert werden.
- Zur Identifizierung der Datenbank wurde UUID hinzugefügt, das im Feld mi_dxbid der Struktur MDBX_envinfo verfügbar ist, das über mdbx_env_info_ex() abgerufen wird. Es wurde ermöglicht, Informationen zur Datenbank zu erhalten, ohne sie zu öffnen, über mdbx_preopen_snapinfo().
- Unterstützung für Logging-Callback-Funktionen ohne die Funktionalität von vprintf(), was die Verwendung von Logging in Bindungen an andere Programmiersprachen erheblich erleichtert.
- Hinzufügen von API-Funktionen mdbx_txn_copy2pathname() und mdbx_txn_copy2fd().
- Umstrukturierung des Quellcodes mit Refactoring.
- Verwendung des Begriffs „Tabelle“ anstelle von „subDb“.
- Ankündigung der Optionen MDBX_COALESCE und MDBX_NOTLS als veraltet. Ersetzen der Build-Option MDBX_USE_VALGRIND durch die gängige ENABLE_MEMCHECK.
Quelle: opennet.ru
