Nakon tri mjeseca razvoja, objavljena je biblioteka libmdbx 0.10.0 (MDBX) koja implementira visoko performantnu, kompaktnu ugrađenu bazu podataka tipa ključ-vrijednost. Kod libmdbx distribuira se pod licencom OpenLDAP Public License. Libmdbx je duboka prerada DBMS LMDB i, prema izjavama developera, nadmašuje svog prethodnika po pouzdanosti, skupu mogućnosti i performansama. Izjavljuje se da je libmdbx do 20% brži od LMDB u CRUD scenarijima i do 30% brži ako se prilikom izgradnje libmdbx onemogući unutarnja provjera do razine usporedive s LMDB.
Libmdbx nudi ACID, strogu serializaciju promjena i neblokirajuće čitanje s linearno skaliranjem po CPU jezgrama. U libmdbx-u velika pažnja posvećuje se kvaliteti koda, stabilnom radu API-ja, testiranju i automatskim provjerama. Podržana je automatska kompaktifikacija, automatsko upravljanje veličinom baze podataka, jedinstveni format baze podataka za 32-bitne i 64-bitne izgradnje, procjena volumena uzoraka po rasponima (range query estimation). Dolazi s alatom za provjeru integriteta strukture baze podataka s nekim mogućnostima oporavka. Od 2016. godine projekt se financira od strane Positive Technologies, a od 2017. koristi se u njihovim proizvodima; uvedene sankcije američke vlade protiv Positive Technologies nemaju značajan utjecaj.
Glavne novosti, dorade i ispravke dodane nakon prethodnog izdanja:
- Dostupna je Ruby veza od Mahlona E. Smitha i probna verzija veza za Python od Noela Kuntzea, ažurirane su veze za GoLang od Alekseja Sharova.
- Za režim 'MDBX_WRITEMAP', kada se podaci baze podataka mijenjaju izravno u RAM-u, implementirano je 'prozirno prolijevanje' na disk promijenjenih stranica baze podataka. Sada, nakon završetka svake operacije, takve stranice odmah su potpuno spremne za pisanje na disk, a jezgro OS-a može samostalno ispuštati promijenjene stranice na disk, a fiksacija transakcije neće zahtijevati njihovu modifikaciju. Kao rezultat toga, u opterećenim scenarijima s nedostatkom RAM-a, volumen diskovnih operacija može se smanjiti do 2 puta.
- Implementirano je uklanjanje dugo neupotrebljavanih senčnih kopija izmijenjenih stranica, s preferencijom brisanja stranica s velikim/dugim vrijednostima, koje se u pretežnoj većini scenarija mijenjaju samo jednom po transakciji. Kao rezultat, smanjuje se količina razmjene s diskom i povećava se performanse u scenarijima s vrlo velikim transakcijama.
- Implementiran je 'pametni' način dijeljenja stranica prilikom umetanja ključeva. Sada se prilikom umetanja uređenih sekvenci automatski osigurava potpuno popunjavanje stranica, dok se u ostalim slučajevima postiže optimalnija ravnoteža stabla. Kao rezultat, u prosjeku, stranice Baze podataka se popunjavaju optimalnije, a B-stablo postaje uravnoteženije, što pozitivno utječe na performanse.
- Dodana je statistika operacija sa stranicama, što omogućuje točnu procjenu troškova operacija modifikacije s BDP-om.
- Ispravljeno je više od deset grešaka i nedostataka, uključujući: rješene su probleme sa sastavljanjem putem MinGW-a, korištenje `std::filesystem::path` na iOS-u <= 13.0, sastavljanje uz ciljanje na stare verzije Windowsa itd.
- Ukupno je napravljeno više od 200 promjena u 66 datoteka, dodano je ~6500 linija, a uklonjeno ~4500.
Posebno želim istaknuti izbor projekta Turbo-Geth (turbo-fork Go-Ethereum) libmdbx kao novog backend za pohranu, kao i zahvaliti timu projekta (posebno Alekseju Šarovu, Artemu Vorotnikovu i Alekseju Akhunovu) za veliku pomoć u testiranju u ekstremnim scenarijima korištenja. Konkretno, tako je otkriven i riješen nedostatak u upravljanju proaktivnim čitanjem/kefiranje, što je dovelo do degradacije performansi u teško reproduciranim scenarijima s velikim BDP-om.
Izvor: opennet.ru
