LMDB

***Lightning Memory-Mapped Database*** (***LMDB***) ir programmatūras bibliotēka, kas nodrošina augstas veiktspējas iegulto transakciju datu bāzi atslēgu — vērtību krātuves veidā. To izstrādāja ASV uzņēmums *Symas*, un publiski kļuva pieejama 2011. gadā.

*LMDB* ir rakstīta *[[C (programmēšanas valoda)|C]]* valodā ar lietojumprogrammas saskarnes (*API*) saistījumiem vairākām programmēšanas valodām. *LMDB* glabā patvaļīgus atslēgu un datu pārus kā baitu masīvus, tai ir diapazona meklēšanas iespējas, tā atbalsta vairākus datu vienumus vienai atslēgai un tai ir īpašs režīms ierakstu pievienošanai datu bāzes beigās (*MDB_APPEND*), kas nodrošina dramatisku rakstīšanas veiktspējas pieaugumu salīdzinot ar citām līdzīgām krātuvēm. *LMDB* nav relāciju datu bāze, tā ir tikai atslēgu-vērtību krātuve, kā, piemēram, *[[Berkeley DB]]* un *[[dbm]]*.

*LMDB* var arī izmantot laiksakritīgi vairākpavedienu vai vairākprocesu apstrādes vidē, turklāt ar lasīšanas veiktspēju, ko var mērogot lineāri. *LMDB* datu bāzēm vienlaikus var būt tikai viens rakstītājs, tomēr, atšķirībā no daudzām līdzīgām atslēgu-vērtību datubāzēm, rakstīšanas transakcijas nebloķē lasītājus, un lasītāji nebloķē rakstītājus. *LMDB* ir neparasta arī ar to, ka vairākas lietojumprogrammas vienā sistēmā var vienlaikus atvērt un izmantot vienu un to pašu *LMDB* krātuvi kā līdzekli veiktspējas palielināšanai. Turklāt *LMDB* nav nepieciešams transakciju žurnāls (tādējādi tiek palielināta rakstīšanas veiktspēja, neprasot divreiz rakstīt datus), jo tam datu integritātes saglabāšana jau ir iestrādāta arhitektūrā.

## Vēsture
*LMDB* projekts pirmo reizi tika apspriests 2009. gada *[[OpenLDAP]]* izstrādātāju adresātu sarakstā saistībā ar risinājumu izpēti kešatmiņas pārvaldības grūtībām, ko izraisīja projekta atkarība no *[[Berkeley DB]]*. Īpašs mērķis bija aizstāt *Berkeley DB* arhitektūrai piemītošos vairākus konfigurācijas un kešatmiņas līmeņus ar vienu automātiski pārvaldītu kešatmiņu, ko kontrolē resursdatora operētājsistēma.

Kad sākās izstrāde, sākotnēji tas bija atzarojums no līdzīga projekta *[[OpenBSD]]* *ldapd*. Pirmā publiski pieejamā versija parādījās *OpenLDAP* pirmkoda repozitorijā 2011. gada jūnijā.

Projekts bija pazīstams kā *MDB* līdz 2012. gada novembrim, kad to pārdēvēja, lai izvairītos no konfliktiem ar esošo programmatūru.

## Tehniskais apraksts
Iekšēji *LMDB* izmanto B+ koka datu struktūras. Šīs arhitektūras efektivitāte un nelielais pēdas nospiedums radīja arī neparedzētu blakusefektu, nodrošinot arī labu rakstīšanas veiktspēju. *LMDB* ir lietojumprogrammas saskarne, līdzīga *Berkley DB* un *dbm*. *LMDB* datora atmiņu uzskata par vienu adrešu telpu, kas tiek koplietota vairākos procesos vai pavedienos, izmantojot koplietojamo atmiņu ar kopēšanu rakstot semantiku (ko vēsturiski dēvē par viena līmeņa krātuvi). Tā kā lielākajai daļai mūsdienu datorarhitektūras ir 32 bitu atmiņas adrešu telpas ierobežojumi, kas nosaka 4 GB lielu ierobežojumu jebkurai datu bāzei, kas izmanto šādu metodi, datu bāzes tiešas kartēšanas uz viena līmeņa krātuvi efektivitāte bija stingri ierobežota. Mūsdienās 64 bitu procesori galvenokārt ievieš 48 bitu adrešu telpu, ļaujot piekļūt 47 bitu adresēm (128 terabaitiem datu bāzēm), padarot datu bāzes ar koplietojamo atmiņu atkal noderīgas lietojumprogrammās.

*LMDB* īpašās tehniskās īpašības:
* Tiek izmantots B+ koks. *LMDB* instance ir koplietojamā atmiņā, un B+ koka bloka lielums ir iestatīts saskaņā ar OS lapas lielumu, tādējādi piekļuve *LMDB* krātuvei ir ārkārtīgi efektīva.
* Jauni dati tiek rakstīti, nepārrakstot vai nepārvietojot esošos datus. Tā rezultātā tiek garantēta datu integritāte un uzticamība, nepieprasot transakciju žurnālus vai tīrīšanas pakalpojumus.
* Unikāls pievienošanas-rakstīšanas režīms (*MDB_APPEND*), kas ļauj pievienot jauno ierakstu tieši B+ koka galā. Tā tiek samazināts lasīto un rakstīto lappušu operāciju skaits, tādējādi ievērojami palielinās veiktspēja. Programmētājam ir jābūt atbildīgam par to, lai atslēgas jau būtu sakārtotas nepieciešamajā secībā, tās saglabājot DB.
* "Kopēšana rakstot" semantika palīdz nodrošināt datu integritāti, kā arī transakciju garantijas un vienlaicīgu piekļuvi lasītājiem, neprasot nekādu bloķēšanu, pat ja to veic pašreizējais rakstītājs. Jaunas atmiņas lapas, kas datu modifikācijas laikā nepieciešamas iekšēji, pamatā esošā OS piešķir, izmantojot "kopēšana rakstot" semantiku: *LMDB* bibliotēka pati par sevi nekad nepārveido vecākos datus, kuriem lasītāji piekļūst, jo tā vienkārši to nevar izdarīt: visi koplietojamās atmiņas atjauninājumi automātiski izveido pilnīgi neatkarīgu atmiņas lapas kopiju, kurā tiek rakstīts.
* Tā kā *LMDB* ir atmiņā kartēta, tā caur savu *API* var atgriezt tiešos rādītājus uz atslēgu un vērtību atmiņas adresēm, tādējādi izvairoties no nevajadzīgas un dārgas atmiņas kopēšanas. Tādējādi ievērojami palielinās veiktspēja (īpaši tad, ja saglabātās vērtības ir ārkārtīgi lielas) un paplašinās *LMDB* izmantošanas iespējas.
* *LMDB* arī izseko neizmantotās atmiņas lapas, izmantojot B+ koku, lai transakciju laikā sekotu lapu atbrīvošanai (vairs nevajadzīgām). Izsekojot neizmantotās lapas, pilnībā tiek novērsta nepieciešamība pēc atkritumu savākšanas (un atkritumu savākšanas fāzes, kas patērētu procesora ciklus). Transakcijām, kurām nepieciešamas jaunas lapas, vispirms tiek piešķirtas lapas no šī neizmantotā brīvo lapu koka; tikai pēc to izlietošanas tās tiks paplašinātas iepriekš neizmantotos pamatā esošā atmiņas kartētā faila apgabalos. Modernā failu sistēmā ar retinātu failu atbalstu šāds risinājums palīdz samazināt faktisko diska izmantošanu.

## Laiksakritība
*LMDB* izmanto multiversiju laiksakritības kontroli (*MVCC*) un atļauj vairākus pavedienus vairākos procesos, lai koordinētu vienlaicīgu piekļuvi datu bāzei. Kamēr rakstīšanas transakcijas tiek globāli serializētas, izmantojot *[[mutex]]*, tikai lasāmās transakcijas darbojas paralēli, tostarp rakstīšanas transakcijas klātbūtnē, un tās ir pilnībā gaidīšanas brīvas, izņemot pirmo tikai lasāmo transakciju pavediena. Katrs pavediens, kas tiek nolasīts no datu bāzes, iegūst īpašumtiesības uz elementu koplietojamā atmiņas masīvā, ko var atjaunināt, lai norādītu, kad tas atrodas transakcijā. Rakstītāji skenē masīvu, lai noteiktu vecāko datu bāzes versiju, kas jāsaglabā transakcijai, nepieprasot tiešu sinhronizāciju ar aktīvajiem lasītājiem.

## Veiktspēja
2011. gadā *[[Google]]* publicēja programmatūru, kas ļāva lietotājiem ģenerēt mikro etalonuzdevumus, salīdzinot *[[LevelDB]]* veiktspēju ar *[[SQLite]]* un *[[Kyoto Cabinet]]* dažādos scenārijos. 2012. gadā *Symas* tai pievienoja atbalstu *LMDB* un *Berkeley DB* un padarīja atjaunināto salīdzinošās novērtēšanas programmatūru publiski pieejamu. Šie etalonuzdevumi parādīja, ka *LMDB* pārspēja visas pārējās datu bāzes lasīšanas un pakešu rakstīšanas operācijās. *SQLite* ar *LMDB* izcēlās rakstīšanas operācijas un īpaši sinhronās / transakciju rakstīšanās.

Etalonuzdevumi parādīja, ka pamatā esošā failsistēma būtiski ietekmē darbības rezultātus. *[[JFS (filsistēma)|JFS]]* ar ārēju žurnālu darbojas labi, jo īpaši salīdzinājumā ar citām modernām sistēmām, piemēram, *[[Btrfs]]* un *[[ZFS]]*. *Zimbra* ir testējis *back-mdb* un *back-hdb* veiktspēju *OpenLDAP* sistēmā, *LMDB* skaidri pārsniedzot *BDB* bāzēto *back-hdb*. Daudzi citi *OpenLDAP* lietotāji ir novērojuši līdzīgus rezultātus.

Kopš sākotnējiem etalonuzdevumiem 2012. gadā, ir veikti vairāki testi ar papildu datu bāzes programmām gan atmiņā, gan diskā, kas darba slodzēm raksturo veiktspēju vairākos centrālajos procesoros un ierakstu lielumos. Šie testi rāda, ka *LMDB* veiktspēja ir nesakrītoša visās ar atmiņu saistītajās darbslodzēs un pārspēj visās ar disku saistītajās lasīšanas darba slodzēs, kā arī ar disku saistītajās rakstīšanas darba slodzēs, izmantojot lielus ierakstu izmērus. Etalonusdevuma draivera kods pēc tam tika publicēts *[[github]]* un tālāk paplašināts datu bāzu pārklājumā.

## Uzticamība
*LMDB* jau no paša sākuma bija paredzēts, lai nepieļautu datu zudumu sistēmas un lietojumprogrammas avārijas gadījumā. "Kopēšana rakstot" metode nekad nepārraksta pašlaik lietojamos datus. Izvairīšanās no pārrakstīšanas nozīmē, ka diska / krātuves struktūra vienmēr ir derīga, tāpēc lietojumprogrammas vai sistēmas avārijas nevar atstāt datu bāzi bojātā stāvoklī. Noklusējuma režīmā sliktākajā gadījumā avārija var zaudēt datus no pēdējās vēl nepabeigtās rakstīšanas transakcijas. Pat ja visi asinhronie režīmi ir iespējoti, tikai OS katastrofāla kļūme vai aparatūras enerģijas zudums drīzāk, nevis tikai lietojumprogrammas avārija, var izraisīt datu bojāšanu.

Divi akadēmiski raksti *USENIX OSDI* simpozijā parādīja iespējamus avārijas veidus DB programmās (ieskaitot *LMDB*) elektrības zuduma vai sistēmas avārijas gadījumā.

## Atvērtā pirmkoda licence
2013. gada jūnijā *Oracle* mainīja *Berkeley DB* (saistīts projekts) licenci no *Sleepycat* licences uz *[[Affero General Public License]]*, tādējādi ierobežojot tās izmantošanu dažādās lietojumprogrammās. Tas lika *[[Debian]]* projektam izslēgt bibliotēku no versijas 6.0. un uz priekšu. Tika kritizēts, ka šī licence nav draudzīga komerciāliem izplatītājiem. Tika diskutēts par to, vai šadas licencēšanas izmaiņas varētu notikt arī ar *LMDB*. Autors Hovards Ču (*Howard Chu*) skaidri norādīja, ka *LMDB* ir daļa no *OpenLDAP* projekta, kam ir bijusi *BSD* stila licence, un tāda paliks arī turpmāk.

*Berkeley DB* licences jautājums ir ietekmēja vairumu GNU/Linux distribūciju, piemēram, *[[Debian]]* pilnībā pārtrauca izmantot *Berkeley DB*, dodot priekšroku *LMDB*.

## Atsauces

## Ārējās saites
* LMDB  Symas
* LmdbJava (LMDB for Java) GitHub