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 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.[1] 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
[labot šo sadaļu | labot pirmkodu]LMDB projekts pirmo reizi tika apspriests 2009. gada OpenLDAP izstrādātāju adresātu sarakstā[2] 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.[3] 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.[4]
Tehniskais apraksts
[labot šo sadaļu | labot pirmkodu]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),[5] 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),[1] 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
[labot šo sadaļu | labot pirmkodu]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
[labot šo sadaļu | labot pirmkodu]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.[6] Š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 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.[7] Daudzi citi OpenLDAP lietotāji ir novērojuši līdzīgus rezultātus.[8]
Kopš sākotnējiem etalonuzdevumiem 2012. gadā, ir veikti vairāki testi ar papildu datu bāzes programmām gan atmiņā,[9] gan diskā,[10] 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[11] un tālāk paplašināts datu bāzu pārklājumā.
Uzticamība
[labot šo sadaļu | labot pirmkodu]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ā[12] parādīja iespējamus avārijas veidus DB programmās (ieskaitot LMDB) elektrības zuduma vai sistēmas avārijas gadījumā.[13][14]
Atvērtā pirmkoda licence
[labot šo sadaļu | labot pirmkodu]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.[15]
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.[16]
Atsauces
[labot šo sadaļu | labot pirmkodu]- ↑ 1,0 1,1 LMDB Reference Guide Arhivēts 2014. gada 20. oktobrī, Wayback Machine vietnē.. Retrieved on 2014-10-19
- ↑ back-mdb - futures. Retrieved on 2019-01-18
- ↑ MDB: A Memory-Mapped Database and Backend for OpenLDAP. Retrieved 2019-01-18
- ↑ MDB renamed to LMDB
- ↑ Howard Chu. MDB: A Memory-Mapped Database and Backend for OpenLDAP. LDAPCon, 2011..
- ↑ Howard Chu. «Database Microbenchmarks». Symas Corp. Arhivēts no oriģināla, laiks: 2014. gada 9. augusts. Skatīts: 2014. gada 8. augusts. Arhivēts 2014. gada 9. augustā, Wayback Machine vietnē.
- ↑ «OpenLDAP MDB vs HDB performance». Zimbra, Inc.
- ↑ «OpenLDAP: A comparison of back-mdb and back-hdb performance». 2013. gada 16. maijs. Skatīts: 2017. gada 8. maijs.
- ↑ Howard Chu. «In-Memory Microbenchmark». Symas Corp. Arhivēts no oriģināla, laiks: 2014. gada 9. decembrī. Skatīts: 2019. gada 18. janvārī. Arhivēts 2014. gada 9. decembrī, Wayback Machine vietnē.
- ↑ Howard Chu. «On-Disk Microbenchmark». Symas Corp. Arhivēts no oriģināla, laiks: 2014. gada 9. decembrī. Skatīts: 2019. gada 18. janvārī. Arhivēts 2014. gada 9. decembrī, Wayback Machine vietnē.
- ↑ «Benchmark Drivers».
- ↑ «OSDI 2014».
- ↑ «OSDI 2014, All File Systems Are Not Created Equal: On the Complexity of Crafting Crash-Consistent Applications».
- ↑ «OSDI 2014, Torturing Databases for Fun and Profit».
- ↑ Howard Chu. «Berkeley DB 6.0 license change to AGPLv3». debian-devel (Mailing list) (Debian), 2013. gada 2. jūlijs.
- ↑ Ondřej Surý. «New project goal: Get rid of Berkeley DB (post jessie)». debian-devel (Mailing list) (Debian), 2014. gada 19. jūnijs.
Ārējās saites
[labot šo sadaļu | labot pirmkodu]- LMDB Arhivēts 2018. gada 11. decembrī, Wayback Machine vietnē. Symas
- LmdbJava (LMDB for Java) GitHub