Frigivelse af højtydende indlejret DBMS libmdbx 0.10

Efter tre måneders udvikling blev libmdbx 0.10.0 (MDBX) frigivet, der implementerede en højtydende, kompakt indlejret nøgleværdidatabase. Libmdbx-koden er licenseret under OpenLDAP Public License. libmdbx er en dyb omarbejdelse af LMDB DBMS og er ifølge udviklerne sin forfader overlegen med hensyn til pålidelighed, række af muligheder og ydeevne. Det er angivet, at libmdbx er op til 20 % hurtigere end LMDB i CRUD-scenarier og op til 30 % hurtigere, hvis interne kontroller er deaktiveret, når libmdbx bygges til et niveau, der kan sammenlignes med LMDB.

Libmdbx tilbyder ACID, stærk ændringsserialisering og ikke-blokerende læsninger, der skaleres lineært på tværs af CPU-kerner. I libmdbx er der meget opmærksomhed på kodekvalitet, stabil API-drift, test og automatiske kontroller. Understøtter automatisk komprimering, automatisk databasestørrelsesstyring, et enkelt databaseformat til 32-bit og 64-bit samlinger og estimering af rækkeviddeforespørgsler. Et værktøj til kontrol af databasestrukturens integritet med nogle gendannelsesfunktioner er leveret. Siden 2016 er projektet blevet finansieret af Positive Technologies og har været brugt i dets produkter siden 2017, og de sanktioner, som den amerikanske regering har pålagt mod Positive Technologies, har ikke nogen mærkbar effekt.

Større innovationer, forbedringer og rettelser tilføjet siden sidste udgivelse:

  • En Ruby-binding af Mahlon E. Smith og en prøveversion af Python-bindinger af Noel Kuntze er tilgængelige, og GoLang-bindinger af Alexey Sharov er blevet opdateret.
  • For "MDBX_WRITEMAP"-tilstanden, når databasedata ændres direkte i RAM, implementeres et "gennemsigtigt spild" af ændrede databasesider til disken. Nu, efter afslutningen af ​​hver operation, er sådanne sider straks fuldstændig klar til at skrive til disken, og OS-kernen kan uafhængigt tømme de ændrede sider til disken, og at udføre en transaktion vil ikke kræve deres modifikation. Som et resultat, i travle scenarier med utilstrækkelig RAM, kan mængden af ​​diskoperationer reduceres med op til 2 gange.
  • Implementeret fraflytning af længe ubrugte skyggekopier af ændrede sider, med præference for fraflytning af sider med store/lange værdier, som i langt de fleste scenarier kun ændres én gang pr. transaktion. Resultatet er reduceret disktrafik og forbedret ydeevne i scenarier med meget store transaktioner.
  • Implementeret en "smart" tilstand til opdeling af sider ved indsættelse af nøgler. Når man nu indsætter ordnede sekvenser, fyldes siderne automatisk helt ud, og i andre tilfælde er træet mere optimalt afbalanceret. Resultatet er, at databasesider i gennemsnit fyldes mere optimalt, og B-træet er mere afbalanceret, hvilket har en positiv effekt på ydeevnen.
  • Statistik over operationer med sider er blevet tilføjet, hvilket giver dig mulighed for nøjagtigt at estimere omkostningerne ved at ændre operationer med databasen.
  • Mere end et dusin fejl og fejl er blevet rettet, herunder: problemer med at bygge ved hjælp af MinGW, brug af `std::filesystem::path` i iOS <= 13.0, bygning målrettet mod ældre versioner af Windows osv.
  • I alt blev der foretaget mere end 200 ændringer i 66 filer, ~6500 linjer blev tilføjet, ~4500 blev slettet.

Separat vil jeg gerne bemærke valget af Turbo-Geth-projektet (en turbo-gaffel af Go-Ethereum) libmdbx som en ny storage-backend, og også takke projektteamet (især Alexey Sharov, Artyom Vorotnikov og Alexey Akhunov) for deres stor hjælp til at teste i ekstreme use case-scenarier. Især blev en defekt i read-ahead/caching-kontrollen opdaget og elimineret, hvilket førte til ydeevneforringelse i vanskelige at reproducere scenarier med store databaser.

Kilde: opennet.ru

Tilføj en kommentar