Mukudonha kwa2019, chiitiko chakamirirwa kwenguva refu chakaitika muMail.ru Cloud iOS timu. Iyo huru dhatabhesi yekuenderera mberi yekuchengetedza yenyika yekushandisa yave yakasarudzika kune mobile world
Zviri mukati
Kukurudzira kuita LMDB Positioning Mbiru nhatu dzeLMDB
3.1.Whale #1. Memory-mapped mafaira
3.2.Whale #2. B+-muti
3.3.Whale #3. Kopa-pa-kunyora Kugadzira data schema pamusoro pekiyi-kukosha API
4.1.Basic abstractions
4.2.Tafura Modelling
4.3.Kuenzanisira hukama pakati pematafura
1. Kukurudzira kuita
Rimwe gore muna 2015, takatora dambudziko kuyera kuti kangani iyo interface yeapp yedu inononoka. Takaita izvi nechikonzero. Isu takagamuchira zvichemo zvakajairika kuti dzimwe nguva application inomira kupindura kune zviito zvemushandisi: mabhatani haagone kudzvanywa, rondedzero haapure, nezvimwe. Nezve mechanics ezviyero
Mibairo yekuyera yakava mvura inotonhora kwatiri. Zvakazoitika kuti kune mamwe matambudziko akawanda anokonzerwa nechando kupfuura mamwe. Kana usati waona chokwadi ichi chikuru tekinoroji chiratidzo chemhando chaive chisina kuparara, saka mushure mekutarisa
Kuvaka
Iyo mutambi modhi yehurongwa hwesangano inofunga kuti multithreading inova chinhu chechipiri. Enzanisa zvinhu zviri mairi sekuda kuyambuka miganhu yehova. Uye havaite izvi dzimwe nguva uye pano nepapo, asi kanenge nguva dzose uye kwese kwese
Iyo dhatabhesi ndechimwe chezvikamu zvekona mudhayagiramu yakaratidzwa. Basa rayo guru nderekushandisa macropattern
Chechipiri chakakosha chinhu chakapesvedzera kusarudzwa kwedatabase yaive yedu gore API. Yakafemerwa nenzira yekuwiriranisa yakatorwa negit. Saiye, takavavarira
Saka, kana iwe uchifungidzira git, iyo, kana ichiita yekudhonza kuraira, pachinzvimbo chekushandisa zvigamba kune yemuno snapshot, inofananidza iyo yakazara mamiriro neiyo yakazara server state, ipapo iwe uchave neruzivo rwakakwana rwekuti kuwiriranisa kunoitika sei mugore. vatengi. Zviri nyore kufungidzira kuti kuzviita, unofanirwa kugovera miti miviri yeDOM mundangariro ine meta-ruzivo nezvese server uye mafaera emunharaunda. Zvinoitika kuti kana mushandisi akachengeta 500 zviuru mafaera mugore, zvino kuti aenderane iyo inofanirwa kudzokorora uye kuparadza miti miviri ine 1 miriyoni node. Asi node imwe neimwe ihomwe ine girafu yezvinyorwa. Muchiedza ichi, mibairo yeprofile yaitarisirwa. Zvakazoitika kuti kunyangwe pasina kufunga nezve kubatanidza algorithm, iyo nzira yekugadzira uye nekuzoparadza nhamba huru yezvinhu zvidiki inodhura peni yakanaka. yezvinyorwa zvevashandisi. Nekuda kweizvozvo, isu tinogadzirisa chechipiri chakakosha chiyero pakusarudza dhatabhesi - kugona kuita CRUD mashandiro pasina simba rekugovanisa zvinhu.
Zvimwe zvinodiwa ndezvakawanda zvechinyakare uye runyorwa rwavo rwese rwunotevera.
- Thread safety.
- Multiprocessing. Inotungamirwa nechishuwo chekushandisa iyo yakafanana dhatabhesi muenzaniso kuwiriranisa nyika kwete chete pakati petambo, asiwo pakati peiyo huru application uye iOS edzedzero.
- Iko kugona kumiririra masangano akachengetwa sezvinhu zvisingachinjike
- Hapana kugoverwa kwesimba mukati meCRUD mashandiro.
- Transaction tsigiro yezvinhu zvakakosha
ACID : atomicity, kuwirirana, kuzviparadzanisa uye kuvimbika. - Speed pamakesi anozivikanwa zvikuru.
Neiyi seti yezvinodiwa, SQLite yaive uye inoramba iri sarudzo yakanaka. Zvisinei, sechikamu chefundo yedzimwe nzira, ndakawana bhuku
2. LMDB Positioning
LMDB iraibhurari diki kwazvo (chete gumi mitsara) inoshandisa iyo yakaderera yakakosha dhatabhesi - kuchengetedza.
Dhiagiramu iri pamusoro inoratidza kuti kuenzanisa LMDB neSQLite, iyo inoshandisawo mazinga epamusoro, kazhinji haina kururama kupfuura SQLite neCore Data. Zvingave zvakanaka kutaura injini dzakafanana dzekuchengetera sevakwikwidzi vakaenzana - BerkeleyDB, LevelDB, Sophia, RocksDB, etc. Pane kunyange budiriro apo LMDB inoshanda sechikamu cheinjini yekuchengetedza cheSQLite. Yekutanga kuedza kwakadaro kwaiva muna 2012
LMDB inonyanya kushandiswa seinjini yemashandisirwo edhatabhesi. Raibhurari inokwereta kutaridzika kwayo kune vanogadzira
LMDB inowanzo shandiswa senge-iri kuchengetedza. Somuenzaniso, Mozilla Firefox browser
Injini yakaitawo mucherechedzo wayo munyika yekusimudzira nhare. Tsanangudzo yekushandiswa kwayo inogona kuva
LMDB iri kubudirira kurwira nzvimbo muzuva mune niche yakasiiwa neBerkeleyDB mushure mekunge yave pasi pekutonga kweOracle. Raibhurari inodiwa nekukurumidza uye kuvimbika, kunyangwe ichienzaniswa nevezera rayo. Sezvaunoziva, hapana mabiko emahara, uye ndinoda kusimbisa iyo kutengeserana-iyo yauchafanirwa kutarisana nayo pakusarudza pakati peLMDB neSQLite. Dhiagiramu iri pamusoro inoratidza zvakajeka kuti kuwedzera kwekukurumidza kunowanikwa sei. Chekutanga, isu hatibhadhare mamwe matinji ekubvisa pamusoro pekuchengetera dhisiki. Zviripachena kuti chivakwa chakanaka hachisati chakwanisa kuita pasina ivo, uye ivo vanozoonekwa mukodhi yekushandisa, asi ivo vanozonyanya kupusa. Izvo hazvizove nezvimiro zvisingadiwe neimwe application, semuenzaniso, tsigiro yemibvunzo mumutauro weSQL. Chechipiri, zvinogoneka kunyatso shandisa mepu yemashandisirwo ekushandisa pane zvikumbiro zvekuchengetedza dhisiki. Kana SQLite
3. Mbiru nhatu dzeLMDB
Takatarisa LMDB kubva paziso reshiri, yakanga yave nguva yekupinda mukati. Zvikamu zvitatu zvinotevera zvichave zvakapihwa kuongororwa kwembiru huru iyo yekuchengetera zvivakwa:
- Memory-mapped mafaira senzira yekushanda ne diski uye kuwiriranisa zvemukati data zvimiro.
- B + -muti sesangano rechimiro che data rakachengetwa.
- Copy-on-write senzira yekupa ACID transaction zvivakwa uye multiversion.
3.1. Whale #1. Memory-mapped mafaira
Memory-mamepu mafaera chinhu chakakosha chekuvaka zvekuti anotooneka muzita renzvimbo. Nyaya dze caching uye kuwiriranisa kwekuwana ruzivo rwakachengetwa dzakasiiwa zvachose kune inoshanda sisitimu. LMDB haina chero cache mukati mayo. Ichi chisarudzo chemunyori, sezvo kuverenga data zvakananga kubva kumafaira akamepurwa kunokubvumira kutema makona akawanda mukuita injini. Pazasi pane kure kubva kuzere runyorwa rwevamwe vavo.
- Kuchengetedza kuenderana kwedata mukuchengetedza kana uchishanda nayo kubva kune akati wandei maitiro inova mutoro weiyo inoshanda sisitimu. Muchikamu chinotevera, makanika aya anokurukurwa zvakadzama uye nemifananidzo.
- Kusavapo kwema cache kunobvisa zvachose LMDB kubva kumusoro kwakabatana neane simba kugoverwa. Kuverenga data mukuita kunoreva kuseta chinongedzo kukero chaiyo mundangariro chaiyo uye hapana chimwe. Zvinonzwika senge ngano yesainzi, asi mudura rekodhi kodhi mafoni ese kune calloc anonamirwa mukuchengetedza dhizaini.
- Kusavapo kwema cache kunorevawo kusavapo kwekiyi dzine chekuita nekuwiriranisa kwekuwana kwavo. Vaverengi, avo vanogona kuve nehuwandu hwekuverengera hwevaverengi panguva imwe chete, havasangane nechinhu chimwe chete mutex munzira yavo kuenda kune data. Nekuda kweizvi, kumhanya kwekuverenga kune kwakaringana mutsara scalability zvichienderana nehuwandu hweCPUs. MuLMDB, maitiro ekugadzirisa chete anowiriraniswa. Panogona kuve nemunyori mumwe chete panguva.
- Hushoma hwe caching uye synchronization logic inobvisa iyo yakanyanya kuomarara mhando yezvikanganiso zvine chekuita nekushanda munzvimbo ine tambo dzakawanda. Paive nezvidzidzo zviviri zvinonakidza zve database kumusangano we Usenix OSDI 2014:
"Ese Mafaira Sisitimu Haana Kusikwa Akaenzana: Pakuomerwa kweKugadzira Crash-Inoenderana Zvikumbiro" и"Kutambudza Databases Kunakidzwa uye Kubatsira" . Kubva kwavari iwe unogona kunhonga ruzivo nezve kuvimbika kusati kwamboitika kweLMDB uye kuita kunenge kusina chikanganiso kweACID transaction zvivakwa, iri pamusoro peiyo yeSQLite. - Iyo minimalism yeLMDB inobvumira iyo muchina unomiririra kodhi yayo kuti iwanikwe zvizere muL1 cache ye processor ine inotevera kumhanya maitiro.
Nehurombo, muIOS, ine ndangariro-mamepu mafaera, zvese hazvisi zvisina makore sezvatinoda. Kuti utaure pamusoro pezvikanganiso zvakabatana navo zvakanyanya kuziva, zvinodikanwa kuyeuka misimboti yakajairika yekushandisa iyi michina mumasisitimu anoshanda.
Ruzivo rwakakwana nezvemafaira akamepurwa ndangariro
Neyese application inomhanya, iyo inoshanda sisitimu inosanganisa chinhu chinonzi process. Maitiro ega ega anopihwa dhizaini yekero umo inoisa zvese zvainoda kushanda. Pamakero akaderera pane zvikamu zvine kodhi uye yakaoma-coded data uye zviwanikwa. Inotevera inouya bhuroka rinokura renzvimbo yekero, inozivikanwa kwatiri pasi pezita remurwi. Iine kero dzemasangano anooneka panguva yekushanda kwechirongwa. Pamusoro inzvimbo yekurangarira inoshandiswa nestack yekushandisa. Iyo inokura kana makondirakiti; mune mamwe mazwi, saizi yayo zvakare ine hunhu hunochinja. Kudzivirira murwi uye murwi kubva kusundidzirana uye kukanganisa kune mumwe nemumwe, iwo anowanikwa kune akasiyana magumo enzvimbo yekero. Pane buri pakati pezvikamu zviviri zvine simba kumusoro nepasi. Iyo inoshanda sisitimu inoshandisa kero muchikamu chepakati ichi kubatanidza akasiyana masangano nemaitiro. Kunyanya, inogona kubatanidza imwe inoenderera seti yemakero nefaira pane dhisiki. Iro faira rakadaro rinonzi memory-mapped
Nzvimbo yekero yakagoverwa kugadziriro yacho yakakura. Tichifunga, nhamba yemakero inogumira chete nehukuru hweinongedza, iyo inotarwa neiyo bit kugona kweiyo system. Kana ndangariro dzemuviri dzainge dzakamepu kwairi 1-kusvika-1, saka yekutanga maitiro aikwidza RAM yese, uye hapazove nekutaura kwekuita zvakawanda.
Nekudaro, kubva muruzivo rwedu tinoziva kuti masisitimu emazuva ano anoshanda panguva imwe chete anogona kuita akawanda maitiro sezvaanoda. Izvi zvinogoneka nekuda kwekuti ivo vanongogovera yakawanda ndangariro kune maitiro pabepa, asi muchokwadi ivo vanoisa muhukuru hwemuviri ndangariro chete icho chikamu chiri kudiwa pano uye ikozvino. Nokudaro, chiyeuchidzo chinobatanidzwa nemaitiro chinonzi virtual.
Iyo inoshanda sisitimu inoronga chaiyo uye yemuviri ndangariro mumapeji eimwe saizi. Pangosvika imwe peji yevirtual memory iri kudiwa, iyo inoshanda sisitimu inoiisa mundangariro yemuviri uye inovafananidza mune yakakosha tafura. Kana pasina mahara slots, ipapo imwe yemapeji akaremerwa akateedzerwa kudhisiki, uye iyo iri kudiwa inotora nzvimbo yayo. Iyi nzira, yatichadzokera kwairi munguva pfupi, inonzi swapping. Mufananidzo uri pasi apa unoratidza maitiro anotsanangurwa. Pairi, peji A ine kero 0 yakarongedzerwa ndokuiswa papeji huru yendangariro ine kero 4. Idi iri rakaratidzirwa mutafura yetsamba musero nhamba 0.
Nyaya yacho yakafanana nemafaira akaiswa mundangariro. Zvine musoro, ivo vanofanirwa kuenderera uye zvachose vari munzvimbo chaiyo yekero. Nekudaro, ivo vanopinda yemuviri ndangariro peji nepeji uye chete pakukumbira. Kugadziriswa kwemapeji akadaro kunopindirana nefaira pa diski. Nenzira iyi, unogona kuita faira I/O nekungoshanda nemabheti mundangariro - shanduko dzese dzinozoendeswa otomatiki neiyo inoshanda system kernel kune iyo faira faira.
Mufananidzo uri pazasi unoratidza kuti LMDB inowiriranisa sei mamiriro ayo kana ichishanda nedhatabhesi kubva kune akasiyana maitiro. Nekugadzira mepu chaiyo yekurangarira maitiro akasiyana kune imwechete faira, isu tinosungirwa iyo inoshanda sisitimu kuti iwiriranise neshanduko mamwe mabhuraki enzvimbo dzekero yavo neimwe, uko LMDB inotarisa.
Chinhu chakakosha nuance ndechekuti LMDB, nekukasira, inoshandura iyo data faira kuburikidza nekunyora system yekufona michina, uye inoratidza iyo faira pachayo mukuverenga-chete modhi. Iyi nzira ine migumisiro miviri inokosha.
Mhedzisiro yekutanga yakajairika kune ese anoshanda masisitimu. Chinhu chayo ndechekuwedzera dziviriro kubva mukukuvadza kusingatarisirwi kune dhatabhesi nekodhi isiriyo. Sezvaunoziva, mirairo inogoneka yemaitiro yakasununguka kuwana data kubva chero kupi munzvimbo yayo yekero. Panguva imwecheteyo, sezvatakangoyeuka, kuratidza faira mukuverenga-kunyora mode kunoreva kuti chero murairo unogonawo kuushandura. Kana akaita izvi nekukanganisa, achiedza, semuenzaniso, kunyora pamusoro pechimwe chinhu pane isiripo index, ipapo anogona netsaona kushandura faira rakamisikidzwa kukero iyi, izvo zvinozotungamira kuhuori hwedhatabhesi. Kana iyo faira ichitaridzwa mukuverenga-chete modhi, saka kuedza kushandura inoenderana kero nzvimbo kunotungamira kumisa kwekukurumidzira kwechirongwa nechiratidzo. SIGSEGV
, uye iyo faira icharamba yakasimba.
Chechipiri mhedzisiro yatove yakananga kune iOS. Kana munyori kana chero mamwe masosi anozvitaura zvakajeka, asi pasina iyo LMDB haingakodzeri kumhanya pane ino mbozha nhare. Chikamu chinotevera chakazvipira kutarisisa kwayo.
Zvakananga zvendangariro-mamepu mafaera muiOS
Paive nemushumo unoshamisa paWWDC muna 2018
Yakachena ndangariro muunganidzwa wemapeji anogona kuburitswa zvisina kurwadza kubva mundangariro dzemuviri. Iyo data yavanayo inogona kurodha zvakare sezvinodiwa kubva kune yayo yekutanga masosi. Mafaira ekuverenga-chete akaiswa mundangariro anowira muchikamu ichi. iOS haitye kuburitsa mapeji akamepurwa kune faira kubva mundangariro chero nguva, sezvo iwo akavimbiswa kuwiriraniswa nefaira pa diski.
Mapeji ese akagadziridzwa anopedzisira ave mundangariro dzakasviba, zvisinei kuti aivepi pekutanga. Kunyanya, ndangariro-mamepu mafaera akagadziridzwa nekunyora kune chaiyo ndangariro yakabatana nawo anozoiswa nenzira iyi. Kuvhura LMDB nemureza MDB_WRITEMAP
, mushure mekuita shanduko pazviri, unogona kuzvisimbisa iwe pachako.
Kana application ichangotanga kutora yakawandisa ndangariro yemuviri, iOS inozviisa kune yakasviba peji compression. Iyo yakazara ndangariro inogarwa netsvina uye yakamanikidzwa mapeji inoumba iyo application inonzi inonzi memory footprint. Kana yangosvika pane imwe chikumbaridzo kukosha, iyo OOM killer system daemon inouya mushure mekuita uye nekuimisa nechisimba. Uku ndiko kusarudzika kweiOS kana ichienzaniswa nedesktop inoshanda masisitimu. Mukupesana, kudzikisira ndangariro tsoka nekuchinjanisa mapeji kubva kundangariro yemuviri kuenda kudhisiki hakuna kupihwa muiOS. Zvikonzero zvinongo fungirwa. Zvichida maitiro ekufambisa zvakanyanya mapeji kudhisiki uye kumashure anonyanya kushandisa simba kune nharembozha, kana iOS inochengetedza sosi yekunyora patsva maseru paSSD madhiraivha, kana pamwe vagadziri havana kugutsikana nekuita kwese kwehurongwa, uko zvese zviri. nguva dzose kuchinjana. Ngazvive zvakadaro, chokwadi chinoramba chiri chokwadi.
Nhau dzakanaka, dzakambotaurwa, ndedzekuti LMDB nekukasira haishandise mmap mashandiro ekugadzirisa mafaera. Izvi zvinoreva kuti iyo data yakaratidzwa inorongedzerwa neIOS seyakachena ndangariro uye haibatsire mundangariro tsoka. Unogona kuona izvi uchishandisa Xcode chishandiso chinonzi VM Tracker. Iyo skrini pazasi inoratidza mamiriro eiyo iOS virtual memory ye Cloud application panguva yekushanda. Pakutanga, 2 LMDB zviitiko zvakatangwa mairi. Wekutanga akabvumidzwa kuratidza faira rake pa1GiB yevirtual memory, yechipiri - 512MiB. Kunyangwe chokwadi chekuti ese ari maviri storages anotora imwe huwandu hwekugara ndangariro, hapana kana yadzo inopa saizi yakasviba.
Uye zvino yave nguva yenhau dzakaipa. Nekuda kweiyo shanduko yekuchinjana mu64-bit desktop inoshanda masisitimu, yega yega maitiro anogona kutora yakawanda chaiyo kero nzvimbo seyemahara hard disk nzvimbo yekugona kwayo shanduko inobvumira. Kutsiva shanduko nekumanikidza muIOS zvakanyanya kudzikisa iyo theoretical maximum. Iye zvino maitiro ese ehupenyu anofanirwa kukwana mune huru (verenga RAM) ndangariro, uye ese asingakwane anofanira kumanikidzwa kugumisa. Izvi zvakataurwa sezvataurwa pamusoro apa
Zvichienderana nemhedzisiro yezviyedzo muGore, takasvika kune anotevera akanganisa kukosha kweyeuko yakagoverwa neLMDB: 384 megabytes ye32-bit zvishandiso uye 768 ye64-bit zvishandiso. Mushure mekunge vhoriyamu iyi yashandiswa kumusoro, chero maitiro ekugadzirisa anotanga kupera nekodhi MDB_MAP_FULL
. Isu tinocherekedza zvikanganiso zvakadaro mukutarisisa kwedu, asi idiki zvekuti panguva ino inogona kuregeredzwa.
Chikonzero chisiri pachena chekunyanya kushandiswa kwekuyeuka nekuchengetedza kunogona kuve kwekugara kwenguva refu kutengeserana. Kuti tinzwisise kuti zvinhu zviviri izvi zvakabatanidzwa sei, isu tichabatsirwa nekutarisa mbiru mbiri dzasara dzeLMDB.
3.2. Whale #2. B+-muti
Kutevedzera matafura pamusoro pekiyi-yakakosha kuchengetedza, zvinotevera mashandiro anofanira kunge aripo muAPI yayo:
- Kupinza chinhu chitsva.
- Tsvaga chinhu chine kiyi yakapihwa.
- Kubvisa chinhu.
- Dzokorora pamusoro pekufamba kwemakiyi muhurongwa hwaanorongwa.
Iyo yakapfava dhata dhizaini inogona kuita nyore kuita ese mana mashandiro ibhinari yekutsvaga muti. Imwe neimwe yemanode ayo inomiririra kiyi inokamura iyo yese subset yemakiyi emwana kuita maviri madiki. Reruboshwe rine zvidiki pane mubereki, uye rerudyi rine zvihombe. Kuwana seti yakarongedzerwa yemakiyi kunowanikwa kuburikidza neimwe yemhando yepamusoro miti inotenderera
Miti yemabhinari ine zvikanganiso zviviri zvakakosha zvinovadzivirira kuti vasashande sedhisiki-yakavakirwa data chimiro. Chekutanga, chiyero chechiyero chavo hachitarisike. Kune njodzi yakakura yekuwana miti umo kureba kwemapazi akasiyana-siyana kunogona kusiyana zvakanyanya, izvo zvinonyanya kuipa algorithmic kuoma kwekutsvaga kuenzaniswa nezvinotarisirwa. Chechipiri, kuwanda kwe-cross-links pakati pemanodhi kunonyima mabhinari miti yenzvimbo mundangariro.Vhara nodes (maererano nekubatana pakati pawo) inogona kuwanikwa pamapeji akasiyana zvachose mundangariro chaiyo. Nekuda kweizvozvo, kunyangwe kutenderera kuri nyore kwemanode akati wandei mumuti kungangoda kushanyira nhamba inofananidzwa yemapeji. Iri idambudziko kunyangwe isu tichitaura nezve mashandiro emiti yemabhinari senge in-memory data dhizaini, sezvo anogara achitenderera mapeji mu processor cache haisi mafaro akachipa. Kana zvasvika pakuwanzo tora mapeji ane chekuita nenode kubva kudhisiki, mamiriro acho anova zvachose
B-miti, kuve shanduko yemiti yemabhinari, kugadzirisa matambudziko akaonekwa mundima yapfuura. Chekutanga, vari kuzvienzanisa. Chechipiri, imwe neimwe yenodhi yavo inotsemura seti yemakiyi evana kwete kuita 2, asi muM akaodha maseti, uye nhamba M inogona kunge yakakura kwazvo, pahurongwa hwemazana akati wandei, kana kunyange zviuru.
Naizvozvo:
- Node imwe neimwe ine nhamba huru yemakiyi atove akaodha uye miti mipfupi kwazvo.
- Muti unowana pfuma yenzvimbo mundangariro, sezvo makiyi ari padhuze mukukosha anongogara ari padivi peumwe pane imwechete kana yakavakidzana node.
- Nhamba yemanodhi ekufambisa kana ichidzika mumuti panguva yekutsvaga basa inoderedzwa.
- Huwandu hwemanodhi anoverengwa panguva yemibvunzo yemhando inoderedzwa, sezvo imwe neimwe yadzo yatove nenhamba huru yemakiyi akaodha.
LMDB inoshandisa mutsauko weB-muti unonzi B+ muti kuchengeta data. Dhiagiramu iri pamusoro inoratidza marudzi matatu emanodhi aripo mairi:
- Pamusoro pane mudzi. Haina chimwe chinhu kunze kweiyo pfungwa yedatabase mukati meimba yekuchengetera zvinhu. Mukati mechiitiko chimwe cheLMDB, unogona kugadzira akati wandei dhatabhesi anogovera mepu chaiyo kero nzvimbo. Mumwe nomumwe wavo anotanga kubva pamudzi wayo.
- Pamwero wakaderera pane mashizha. Ivo uye ivo chete ndivo vane kiyi-kukosha mapeya akachengetwa mudhatabhesi. Nenzira, iyi ndiyo yakasarudzika yeB + -miti. Kana zvitoro zveB-miti zvenguva dzose zvichikoshesa zvikamu mumanodhi emazinga ese, saka B + mutsauko unongori wepasi pasi. Kana tagadzirisa chokwadi ichi, tichazodaidzazve subtype yemuti unoshandiswa muLMDB kungoti B-muti.
- Pakati pemudzi nemashizha pane 0 kana kupfuura nhanho dzehunyanzvi dzine node dzekufamba (bazi). Basa ravo nderekuparadzanisa seti yakarongwa yemakiyi pakati pemashizha.
Panyama, nodes zvivharo zvendangariro zvehurefu hwakafanotemerwa. Saizi yavo yakawanda yehukuru hwemapeji ekurangarira muhurongwa hwekushandisa, hwatakakurukura pamusoro apa. Iyo node chimiro inoratidzwa pazasi. Musoro une meta ruzivo, iyo inonyanya kuoneka iyo semuenzaniso ndeye checksum. Tevere kunouya ruzivo nezve offset umo maseru ane data anowanikwa. Iyo data inogona kunge iri makiyi, kana isu tichitaura nezve navigation node, kana yese kiyi-value mapeya kana ari mashizha.
Mushure mekuita nezvemukati zvemukati mapeji node, isu tichaenderera mberi nekumiririra iyo LMDB B-muti nenzira yakapfava mune inotevera fomu.
Mapeji ane node anowanikwa zvakatevedzana padhisiki. Mapeji ane manhamba epamusoro anowanikwa kunoperera faira. Iyo inonzi meta peji ine ruzivo pamusoro pezvinokanganisa izvo midzi yemiti yose inogona kuwanikwa. Pakuvhura faira, LMDB inotarisisa peji refaira nepeji kubva kumagumo kusvika kumavambo mukutsvaga meta peji rinoshanda uye kuburikidza naro rinowana dhatabhesi iripo.
Ikozvino, tiine pfungwa yeiyo inonzwisisika uye yemuviri chimiro che data sangano, tinogona kuenderera mberi nekufunga mbiru yechitatu yeLMDB. Izvo nerubatsiro rwayo kuti zvese zvigadziriso zvekuchengetedza zviitike transactionally uye mukuparadzaniswa kubva kune mumwe nemumwe, zvichipa iyo dhatabhesi seyakazara pfuma yemultiversion.
3.3. Whale #3. Kopa-pa-kunyora
Mamwe mavhisi e-B-muti anosanganisira kuita shanduko yekuchinja kune node dzayo. Mumwe muenzaniso kuwedzera kiyi nyowani kune node yatosvika pakukwanisa kwayo. Muchiitiko ichi, zvakakosha, kutanga, kupatsanura node kuita maviri, uye chechipiri, kuwedzera chinongedzo kune itsva budding node yemwana mumubereki wayo. Iyi nzira ine ngozi zvikuru. Kana nokuda kwechimwe chikonzero (kuparara, kupera kwemagetsi, nezvimwewo) chikamu chimwe chete chekuchinja kubva kune zvakatevedzana chikaitika, ipapo muti ucharamba uri mumamiriro asingaenderani.
Imwe yechinyakare mhinduro yekugadzira dhatabhesi kukanganisa-inoshivirira ndeyekuwedzera imwe pa-dhisiki data chimiro padivi peB-muti - dhizaini rekutengesa, rinozivikanwawo sekunyora-mberi logi (WAL). Iyo faira pamagumo iyo iyo inotarirwa kushanda inonyorwa zvakasimba isati yagadzirisa B-muti pachayo. Saka, kana huwori hwe data hukaonekwa panguva yekuzviongorora, dhatabhesi inobvunza irogi kuti rizvigadzirire.
LMDB yakasarudza nzira yakasiyana senzira yayo yekuregerera kukanganisa, inonzi kopi-pa-kunyora. Chinhu chayo ndechekuti pachinzvimbo chekuvandudza data pane peji iripo, inotanga kuikopa zvachose uye kuita shanduko dzese mukopi.
Tevere, kuitira kuti data yakagadziridzwa ivepo, zvinodikanwa kuti uchinje chinongedzo kune node yave ikozvino mune yayo mubereki node. Sezvo inodawo kugadziridzwa nekuda kweizvi, inokopwa zvakare kare. Iyo nzira inoenderera ichidzokorodza nzira yese kusvika kumudzi. Chinhu chekupedzisira kuchinja i data iri pameta peji
Kana kamwe-kamwe iyo nzira ikaparara panguva yekuvandudza maitiro, saka kana meta nyowani peji haizosikwe, kana kuti haizonyorwe kune disk zvachose, uye cheki yayo ichave isiriyo. Mune imwe yezviitiko zviviri izvi, mapeji matsva anenge asingasvikike, asi ekare haazokanganisike. Izvi zvinobvisa kudiwa kweLMDB kunyora kumberi logi kuchengetedza data kuenderana. De facto, chimiro chekuchengetedza data pane diski inotsanangurwa pamusoro panguva imwe chete inotora basa rayo. Kusavapo kweiyo yakajeka transaction log ndechimwe chezvinhu zveLMDB zvinopa yakakwirira data kuverenga kumhanya.
Iyo inokonzeresa dhizaini, inodaidzwa kuti append-chete B-muti, yakasikwa inopa transaction yekuzviparadzanisa uye akawanda-versioning. MuLMDB, kutengeserana kwega kwega kwakavhurika kunobatanidzwa neiyo iripo yakakodzera mudzi wemuti. Kusvikira kutengeserana kwapera, mapeji emuti ane chekuita nawo haambofa akachinjwa kana kushandiswa zvakare kushanduro itsva dze data.Saka, unogona kushanda kwenguva yakareba sezvaunoda neseti chaiyo yedata yaive yakakosha panguva iyoyo. kutengeserana kwakavhurwa, kunyangwe chengetedzo ichiramba ichivandudzwa panguva ino. Ichi ndicho musimboti we multiversion, zvichiita kuti LMDB ive yakanakira data sosi yevadikani vedu UICollectionView
. Mushure mekuvhura kutengeserana, hapana chikonzero chekuwedzera ndangariro tsoka yechishandiso nekukasira kupomba data razvino mune imwe-mu-memory chimiro, nekutya kusara usina chinhu. Ichi chimiro chinosiyanisa LMDB kubva kune imwecheteyo SQLite, iyo isingagone kuzvirumbidza nekuzviparadzanisa nevamwe. Mushure mekuvhura kutengeserana kuviri mune yekupedzisira uye kudzima imwe rekodhi mukati meimwe yacho, hazvichagoneke kuwana rekodhi yakafanana mukati mechipiri yasara.
Rutivi rwepafiripi rwemari ndiyo inogona kukwira zvakanyanya kushandiswa kweyeuko chaiyo. Iyo slide inoratidza kuti iyo dhatabhesi dhizaini ichaita sei kana ikagadziridzwa panguva imwe chete ne3 yakavhurika kuverenga transaction inotarisa kune akasiyana dhatabhesi. Sezvo LMDB isingakwanise kushandisazve node dzinosvikika kubva kumidzi ine chekuita nekutengeserana kwazvino, chitoro hachina sarudzo kunze kwekugovera mumwe mudzi wechina mundangariro uye zvakare kutevedzera mapeji akagadziridzwa pasi payo.
Pano zvingave zvinobatsira kuyeuka chikamu pane ndangariro-mepu mafaera. Zvinoita sekunge iyo yekuwedzera mashandisiro eiyo chaiyo ndangariro haifanire kutinetsa zvakanyanya, nekuti haibatsire mundangariro tsoka yechishandiso. Nekudaro, panguva imwecheteyo, zvakacherechedzwa kuti iOS inonyima pakuigovera, uye isu hatigone, senge pane sevha kana desktop, kupa LMDB dunhu re1 terabyte uye tisingafungi nezve chinhu ichi zvachose. Kana zvichikwanisika, iwe unofanirwa kuedza kuita kuti hupenyu hwekutengeserana hupfupi sezvinobvira.
4. Kugadzira data schema pamusoro pekiyi-kukosha API
Ngatitangei yedu API ongororo nekutarisa iwo ekutanga abstractions akapihwa neLMDB: nharaunda uye dhatabhesi, makiyi uye kukosha, kutengeserana uye cursors.
Chiziviso pamusoro pemakodhi mazita
Masevhisi ese ari muruzhinji LMDB API anodzosera mhedzisiro yebasa ravo muchimiro chekodhi kodhi, asi mune ese anotevera rondedzero humbowo hwayo hunosiiwa nekuda kwehupfupi.
Senzira inokurumidza yekubatanidza LMDB kune purojekiti yeIOS kana macOS, ini ndinokurudzira yangu CocoaPod
4.1. Basic abstractions
Environment
mamiriro MDB_env
ndiyo inochengeterwa mamiriro emukati meLMDB. Prefixed basa mhuri mdb_env
inokubvumira kugadzirisa zvimwe zvezvivakwa zvayo. Muchiitiko chakareruka, injini yekutanga inotaridzika seizvi.
mdb_env_create(env);
mdb_env_set_map_size(*env, 1024 * 1024 * 512)
mdb_env_open(*env, path.UTF8String, MDB_NOTLS, 0664);
MuMail.ru Cloud application, isu takachinja maitiro ekutanga emaparamita maviri chete.
Yekutanga saizi yeiyo chaiyo kero nzvimbo iyo yekuchengetedza faira yakamepurwa. Nehurombo, kunyangwe pachishandiswa chimwe chete, kukosha chaiko kunogona kusiyanisa zvakanyanya kubva pakumhanya kusvika pakumhanya. Kuti utore chikamu cheiOS ichi, iyo yakanyanya kuchengetedza vhoriyamu inosarudzwa zvine simba. Kutanga kubva kune imwe kukosha, inoteedzana nehafu kusvika basa mdb_env_open
haidzosere mhedzisiro yakasiyana kubva ENOMEM
. Mune dzidziso, kune zvakare nzira yakapesana - kutanga govera hushoma hwendangariro kune injini, uyezve, kana zvikanganiso zvagamuchirwa, MDB_MAP_FULL
, wedzera. Zvisinei, ine minzwa yakawanda zvikuru. Chikonzero ndechekuti maitiro ekugoverazve ndangariro (remap) uchishandisa basa mdb_env_set_map_size
inokonesa masangano ese (macursors, transactions, kiyi uye kukosha) zvakambogamuchirwa kubva kunjini. Kutora iyi shanduko yezviitiko munhoroondo mune kodhi kunozotungamira kune yakakosha kunetsa. Kana, zvisinei, ndangariro chaiyo yakakosha kwauri, saka ichi chingave chikonzero chekutarisa zvakanyanya forogo yaenda kure kumberi.
Yechipiri parameter, iyo yakasarudzika kukosha kwayo isina kuenderana nesu, inogadzirisa mechanics ekuona tambo kuchengetedzwa. Nehurombo, ingangoita iOS 10 ine matambudziko nerutsigiro rwetambo yekuchengetera kwenzvimbo. Nechikonzero ichi, mumuenzaniso uri pamusoro, nzvimbo yekuchengetera inovhurwa nemureza MDB_NOTLS
. Pamusoro peizvi, zvakanga zvakakodzerawo
Databases
Iyo dhatabhesi ndeye yakaparadzana B-muti muenzaniso, yatakakurukura pamusoro. Kuvhurwa kwayo kunoitika mukati mekutengeserana, izvo zvingaite sezvisinganzwisisike pakutanga.
MDB_txn *txn;
MDB_dbi dbi;
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
mdb_dbi_open(txn, NULL, MDB_CREATE, &dbi);
mdb_txn_abort(txn);
Chokwadi, kutengeserana muLMDB inzvimbo yekuchengetedza, kwete chaiyo dhatabhesi entity. Iyi pfungwa inokutendera iwe kuti uite maatomu mashandiro pane masangano ari mumadhatabhesi akasiyana. Muchirevo, izvi zvinovhura mukana wekuenzanisira matafura mumhando yezvinyorwa zvakasiyana, asi pane imwe nguva ndakatora nzira yakasiyana, inotsanangurwa zvakadzama pasi apa.
Makiyi netsika
mamiriro MDB_val
inoenzanisira pfungwa yezvose zvakakosha uye kukosha. Iyo repository haina ruzivo nezve semantics yavo. Kwaari, chimwe chinhu chingori nhevedzano yemabhayiti ehukuru hwakapihwa. Iyo yakakura kiyi saizi ndeye 512 bytes.
typedef struct MDB_val {
size_t mv_size;
void *mv_data;
} MDB_val;
Uchishandisa muenzanisi, chitoro chinoronga makiyi mukukwira. Kana iwe ukasaitsiva neyako, ipapo iyo yakasarudzika ichashandiswa, iyo inovaronga byte-byte mune lexicographic order.
Transactions
Chimiro chekutengeserana chinotsanangurwa zvakadzama mu
- Inotsigira zvese zvakakosha zvivakwa
ACID : atomicity, kuwirirana, kuzviparadzanisa uye kuvimbika. Ini handigone kubatsira asi kucherechedza kuti kune bug maererano nekusimba paMacOS uye iOS iyo yakagadziriswa muMDBX. Unogona kuverenga zvakawanda mune yavoREADME . - Maitiro ekuverengera akawanda anotsanangurwa ne "single munyori / akawanda kuverenga" chirongwa. Vanyori vanovharana, asi musavhare vaverengi. Vaverengi havavharidzi vanyori kana mumwe nemumwe.
- Tsigiro yezvirongwa zvakatenderedzwa.
- Multiversion rutsigiro.
Multiversion muLMDB yakanaka zvekuti ndinoda kuiratidza mukuita. Kubva pane kodhi iri pasi apa unogona kuona kuti kutengeserana kwega kwega kunoshanda pamwe chete neshanduro yedhatabhesi yaive iripo panguva yakavhurwa, ichinyatsoparadzaniswa kubva kune ese anotevera shanduko. Kutanga kuchengetwa uye kuwedzera rekodhi rekodhi kwairi hakumiriri chero chinhu chinonakidza, saka tsika idzi dzakasiiwa pasi pemuparadzi.
Kuwedzera bvunzo yekupinda
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
mdb_env_create(&env);
mdb_env_open(env, "./testdb", MDB_NOTLS, 0664);
mdb_txn_begin(env, NULL, 0, &txn);
mdb_dbi_open(txn, NULL, 0, &dbi);
mdb_txn_abort(txn);
char k = 'k';
MDB_val key;
key.mv_size = sizeof(k);
key.mv_data = (void *)&k;
int v = 997;
MDB_val value;
value.mv_size = sizeof(v);
value.mv_data = (void *)&v;
mdb_txn_begin(env, NULL, 0, &txn);
mdb_put(txn, dbi, &key, &value, MDB_NOOVERWRITE);
mdb_txn_commit(txn);
MDB_txn *txn1, *txn2, *txn3;
MDB_val val;
// Открываем 2 транзакции, каждая из которых смотрит
// на версию базы данных с одной записью.
mdb_txn_begin(env, NULL, 0, &txn1); // read-write
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn2); // read-only
// В рамках первой транзакции удаляем из базы данных существующую в ней запись.
mdb_del(txn1, dbi, &key, NULL);
// Фиксируем удаление.
mdb_txn_commit(txn1);
// Открываем третью транзакцию, которая смотрит на
// актуальную версию базы данных, где записи уже нет.
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn3);
// Убеждаемся, что запись по искомому ключу уже не существует.
assert(mdb_get(txn3, dbi, &key, &val) == MDB_NOTFOUND);
// Завершаем транзакцию.
mdb_txn_abort(txn3);
// Убеждаемся, что в рамках второй транзакции, открытой на момент
// существования записи в базе данных, её всё ещё можно найти по ключу.
assert(mdb_get(txn2, dbi, &key, &val) == MDB_SUCCESS);
// Проверяем, что по ключу получен не абы какой мусор, а валидные данные.
assert(*(int *)val.mv_data == 997);
// Завершаем транзакцию, работающей хоть и с устаревшей, но консистентной базой данных.
mdb_txn_abort(txn2);
Ini ndinokurudzira kuti iwe uedze hunyengeri hwakafanana neSQLite uye ona zvinoitika.
Multiversion inounza zvinhu zvakanaka kwazvo kuhupenyu hwemugadziri weIOS. Uchishandisa ichi chivakwa, iwe unogona nyore uye nemaitiro kugadzirisa chiyero cheiyo data sosi yemafomu ekrini, zvichibva pakufunga kweruzivo rwemushandisi. Semuenzaniso, ngatitorei chimiro cheMail.ru Cloud application senge autoloading zvirimo kubva kune system media gallery. Nekubatana kwakanaka, mutengi anokwanisa kuwedzera akati wandei mafoto pasekondi kune server. Kana iwe ukagadziridza mushure mekurodha yega yega UICollectionView
ine midhiya zvirimo mugore remushandisi, unogona kukanganwa nezve 60 fps uye kupuruzira kwakatsetseka panguva iyi. Kuti udzivise kugara uchigadziridza skrini, iwe unofanirwa kudzikamisa chiyero icho data inochinja mune yepasi UICollectionViewDataSource
.
Kana iyo dhatabhesi isingatsigire multiversion uye inobvumidza iwe kuti ushande chete neyazvino mamiriro, zvino kuti ugadzire nguva-yakagadzikana snapshot yedata raunoda kuikopa kune imwe-mu-memory data chimiro kana kune yechinguva tafura. Chero ipi yeiyi nzira inodhura zvakanyanya. Panyaya yekuchengetedza mu-memory, tinowana mari mundangariro, inokonzerwa nekuchengetedza zvinhu zvakavakwa, uye nekufamba kwenguva, zvine chekuita nekusarudzika kweORM. Kana iri tafura yenguva pfupi, iyi inotonyanya kudhura mafaro, kuita zvine musoro chete mune zvisiri zvidiki zviitiko.
LMDB's multiversion solution inogadzirisa dambudziko rekuchengetedza yakagadzikana data sosi nenzira yakanakisa. Zvakakwana kungovhura kutengeserana uye voila - kusvika tapedza, iyo data set inovimbiswa kugadziriswa. Iyo pfungwa yekumhanyisa kwayo yekuvandudza ikozvino yazara mumaoko eiyo mharidzo layer, isina pamusoro pezvakakosha zviwanikwa.
Vatuki
Macursors anopa nzira yekurongeka iterating pamusoro pekiyi-value peya kuburikidza neB-muti wekufamba. Pasina ivo, zvingave zvisingagoneki kunyatsotevedzera matafura ari mudhatabhesi, yatinotendeukira kwaari zvino.
4.2. Tafura Modelling
Iyo midziyo yekuodha kiyi inobvumidza iwe kuti uvake yakakwira-level abstraction senge tafura pamusoro pezvakakosha abstractions. Ngatitarisei maitiro aya tichishandisa muenzaniso wetafura huru yemutengi wegore, iyo inochengetedza ruzivo nezvese mafaera emushandisi nemaforodha.
Tafura schema
Imwe yezviitiko zvinozivikanwa zvekuti tafura ine muti wefolda inofanirwa kugadziridzwa ndeyekusarudzwa kwezvinhu zvese zviri mukati medhairekitori rakapihwa.
Mufananidzo uri pazasi unoratidza kuti, zvichibva pane basa riripo, chinomiririra makiyi muchimiro chebyte array chingataridzika. Mabhayiti ane chiziviso chedhairekitori revabereki (tsvuku) anoiswa pekutanga, kozoita nerudzi (girinhi) uye mumuswe une zita (blue).Achirongwa neyakagadzika LMDB comparator mune lexicographical order, anoodha mu nzira inodiwa. Sequentially kuyambuka makiyi ane imwechete dzvuku prefix inotipa iwo hukama hwakabatana mukurongeka kwaanofanira kuratidzwa mune mushandisi interface (kurudyi), pasina kuda imwe yekuwedzera post-kugadzirisa.
Serializing Keys uye Values
Nzira dzakawanda dzekugadzirisa zvinhu dzakagadzirwa munyika. Sezvo takanga tisina chimwe chinodiwa kunze kwekumhanya, takasarudza iyo inokurumidza kugoneka isu pachedu - dump yendangariro inotorwa nechiitiko chechimiro chemutauro weC. Saka, kiyi yedhairekitori chinhu chinogona kuenzanisirwa nechimiro chinotevera. NodeKey
.
typedef struct NodeKey {
EntityId parentId;
uint8_t type;
uint8_t nameBuffer[256];
} NodeKey;
Kuchengeta NodeKey
mudura rinodiwa muchinhu MDB_val
isa iyo data pointer kukero yekutanga kwechimiro, uye kuverenga saizi yavo nebasa sizeof
.
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = sizeof(NodeKey),
.mv_data = (void *)key
};
}
Muchitsauko chekutanga chemaitiro ekusarudza dhatabhesi, ndakataura kuderedza kugoverwa kwesimba mukati meCRUD mashandiro sechinhu chakakosha chekusarudza. Basa rekodhi serialize
inoratidza sei mune iyo LMDB inogona kudzivirirwa zvachose kana uchiisa zvinyorwa zvitsva mudhatabhesi. Iyo inouya byte array kubva kuserver inotanga kushandurwa kuita stack zvimiro, uye zvino inozokandwa mudura. Tichifunga kuti hapana zvakare kugoverwa kwesimba mukati meLMDB, unogona kuwana inonakidza mamiriro neIOS zviyero - shandisa chete stack memory kushanda nedata munzira yese kubva kunetiweki kuenda kudhisiki!
Kuraira makiyi ane binary comparator
Hukama hwekuraira hunokosha hunotsanangurwa nebasa rakakosha rinonzi comparator. Sezvo injini isingazive chinhu nezve semantics yemabhayiti aainawo, iyo default comparator haina sarudzo kunze kwekuronga makiyi mune lexicographic kurongeka, kutendeukira kune byte-by-byte kuenzanisa. Kuishandisa kuronga zvimiro kwakafanana nekuveura nedemo rokutema. Zvisinei, muzviitiko zviri nyore ndinoona nzira iyi inogamuchirwa. Imwe nzira inotsanangurwa pazasi, asi pano ini ndichacherechedza akati wandei akapararira munzira iyi.
Chinhu chekutanga kurangarira ndeyekurangarira kumiririrwa kwemaprimitive data types. Saka, pamidziyo yese yeApple, nhamba dzinoverengeka dzakachengetwa mufomati
// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)
Kugadzirisa dambudziko iri, nhamba dzinofanirwa kuchengetwa mukiyi mufomati inokodzera iyo byte-byte comparator. Mabasa kubva kumhuri achakubatsira iwe kuita shanduko inodiwa hton*
(zvikuru sei htons
yenhamba mbiri-byte kubva pamuenzaniso).
Iyo fomati yekumiririra tambo muchirongwa, sezvaunoziva, yakazara
Chechipiri chekuchengeta mupfungwa packed
.
Kuraira makiyi nemuenzanisi wekunze
Iyo yakakosha yekuenzanisa pfungwa inogona kunge yakanyanya kuomarara kune bhinari muenzanisi. Chimwe chezvikonzero zvakawanda kuvepo kwehunyanzvi minda mukati mezvimiro. Ini ndicharatidza kuitika kwavo ndichishandisa muenzaniso wekiyi yedhairekitori chinhu chatinoziva kwatiri.
typedef struct NodeKey {
EntityId parentId;
uint8_t type;
uint8_t nameBuffer[256];
} NodeKey;
Pasinei nekureruka kwayo, muhuwandu hwakawanda hwezviitiko zvinopedza ndangariro dzakawandisa. Iyo buffer yezita inotora 256 bytes, kunyangwe paavhareji faira nemazita emafolda haawanzo kudarika 20-30 mavara.
Imwe yemaitiro akajairwa ekugadzirisa saizi yerekodhi ndeye "kuicheka" kusvika pakukura chaiko. Chinokosha chayo ndechekuti zviri mukati mezvikamu zvese zvakasiyana-zvirefu zvakachengetwa mubhafa kumagumo echimiro, uye hurefu hwazvo hunochengetwa mumhando dzakasiyana. NodeKey
inoshandurwa sezvinotevera.
typedef struct NodeKey {
EntityId parentId;
uint8_t type;
uint8_t nameLength;
uint8_t nameBuffer[256];
} NodeKey;
Kupfuurirazve, kana serializing, saizi yedata haina kutaurwa sizeof
chimiro chese, uye saizi yeminda yese hurefu hwakatarwa pamwe nehukuru hwechikamu chakashandiswa chaizvo chebhafa.
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = offsetof(NodeKey, nameBuffer) + key->nameLength,
.mv_data = (void *)key
};
}
Nekuda kweiyo refactoring, takawana mari yakachengetwa munzvimbo yakagarwa nemakiyi. Nekudaro, nekuda kweiyo tekinoroji munda nameLength
, the default binary comparator haichakodzeri kuenzanisa kwakakosha. Kana tikasaritsiva neredu, ipapo kureba kwezita kuchava chinhu chepamusoro-soro pakuronga kupfuura zita pacharo.
LMDB inobvumira dhatabhesi yega yega kuve neyayo yakakosha yekufananidza basa. Izvi zvinoitwa uchishandisa basa mdb_set_compare
zvakasimba asati avhura. Nezvikonzero zviri pachena, haigone kuchinjwa muhupenyu hwese database. Muenzanisi anogashira makiyi maviri mubhinari fomati sekuisa, uye pazvinobuda inodzosera mhedzisiro yekuenzanisa: isingasviki (-1), yakakura kupfuura (1) kana yakaenzana ne (0). Pseudocode ye NodeKey
zvinoita saizvozvo.
int compare(MDB_val * const a, MDB_val * const b) {
NodeKey * const aKey = (NodeKey * const)a->mv_data;
NodeKey * const bKey = (NodeKey * const)b->mv_data;
return // ...
}
Chero bedzi makiyi ese ari mudhatabhesi ari emhando imwe chete, pasina zvisungo vachikandira yavo byte inomiririra kune rudzi rwechishandiso kiyi chimiro chiri pamutemo. Pane imwe nuance pano, asi ichakurukurwa pazasi muchikamu che "Kuverenga Records".
Seriizing Values
LMDB inoshanda zvakanyanya nemakiyi emarekodhi akachengetwa. Kuenzanisa kwavo kune mumwe nemumwe kunoitika mukati megadziriro yebasa chero ripi zvaro rinoshandiswa, uye kushanda kwemhinduro yose kunoenderana nekumhanya kwemuenzanisi. Munyika yakanaka, iyo yakasarudzika bhanari muenzanisi inofanirwa kukwana kuenzanisa makiyi, asi kana iwe waifanira kushandisa yako, saka maitiro ekubvisa makiyi mairi anofanira kunge achikurumidza sezvinobvira.
Iyo dhatabhesi haina kunyanya kufarira kukosha kwechikamu cherekodhi (kukosha). Shanduko yaro kubva pakumiririra kwebyte kuenda kuchinhu kunoitika chete kana ichinge yatodiwa nekodhi yekushandisa, semuenzaniso, kuiratidza pachiratidziri. Sezvo izvi zvisingawanzo kuitika, zvinodikanwa zvekumhanya zveiyi nzira hazvina kunyanya kunetsa, uye mukuita kwayo isu takasununguka zvakanyanya kutarisa pane zviri nyore.Semuyenzaniso, kuenzanisa metadata nezve mafaera asati atorwa, tinoshandisa. NSKeyedArchiver
.
NSData *data = serialize(object);
MDB_val value = {
.mv_size = data.length,
.mv_data = (void *)data.bytes
};
Nekudaro, pane dzimwe nguva apo kuita kuchiri kukosha. Semuenzaniso, kana tichichengetedza metainformation nezve faira chimiro chegore remushandisi, isu tinoshandisa imwechete ndangariro kuraswa kwezvinhu. Chinonyanya kukosha chebasa rekugadzira serialized inomiririra inyaya yekuti zvinhu zvedhairekitori zvinoteedzerwa nehukuru hwemakirasi.
Kuti uishandise mumutauro weC, minda chaiyo yevadyi venhaka inoiswa muzvimiro zvakasiyana, uye kubatana kwavo nehwaro kunotsanangurwa kuburikidza nemunda wemhando yemubatanidzwa. Izvo chaizvo zviri mukati memubatanidzwa zvinotsanangurwa kuburikidza nehunyanzvi hwemhando yemhando.
typedef struct NodeValue {
EntityId localId;
EntityType type;
union {
FileInfo file;
DirectoryInfo directory;
} info;
uint8_t nameLength;
uint8_t nameBuffer[256];
} NodeValue;
Kuwedzera uye kugadzirisa zvinyorwa
Iyo serialized kiyi uye kukosha kunogona kuwedzerwa kuchitoro. Kuti uite izvi, shandisa basa mdb_put
.
// key и value имеют тип MDB_val
mdb_put(..., &key, &value, MDB_NOOVERWRITE);
Padanho rekugadzirisa, chengetedzo inogona kubvumidzwa kana kurambidzwa kuchengetedza marekodhi akawanda nekiyi imwe chete.Kana kudzokorora kwekiyi kwakarambidzwa, saka pakuisa rekodhi, unogona kuona kuti kugadzirisa rekodhi iripo kunobvumidzwa here kana kuti kwete. Kana kukanganisa kuchingoitika nekuda kwekukanganisa mukodhi, saka iwe unogona kuzvidzivirira kubva kwairi nekutsanangura mureza. NOOVERWRITE
.
Kuverenga zvinyorwa
Kuti uverenge marekodhi muLMDB, shandisa basa racho mdb_get
. Kana iyo kiyi-yakakosha peya inomiririrwa neyakaraswa zvimiro, saka maitiro aya anotaridzika seizvi.
NodeValue * const readNode(..., NodeKey * const key) {
MDB_val rawKey = serialize(key);
MDB_val rawValue;
mdb_get(..., &rawKey, &rawValue);
return (NodeValue * const)rawValue.mv_data;
}
Rondedzero yakaratidzwa inoratidza kuti serialization kuburikidza nekuraswa kwechimiro inokutendera kuti ubvise migove ine simba kwete chete kana uchinyora, asi kana uchiverenga data. Yakatorwa kubva kune basa mdb_get
iyo pointer inotarisa chaizvo iyo chaiyo memory kero uko dhatabhesi inochengeta iyo byte inomiririra yechinhu. Muchokwadi, isu tinowana mhando yeORM inopa yakanyanya kukurumidza kuverenga data kunenge mahara. Pasinei nekunaka kwese kwenzira, zvinodikanwa kuyeuka akati wandei maficha ane hukama nawo.
- Kune yekuverenga chete transaction, chinongedzo kune kukosha kwechimiro chinovimbiswa kuramba chakasimba chete kusvikira kutengeserana kwavharwa. Sezvambotaurwa, iyo B-muti mapeji pane chinhu chiripo, nekuda kweiyo kopi-pa-kunyora musimboti, inoramba isina kuchinjika chero ichinongedzwa neinenge kutengeserana kumwe. Panguva imwecheteyo, nekukurumidza kana kutengeserana kwekupedzisira kwakabatana navo kwapera, mapeji anogona kushandiswa zvakare kune data nyowani. Kana zvichidikanwa kuti zvinhu zvirarame mukutengeserana kwakazvigadzira, saka zvinofanirwa kuteedzerwa.
- Kune yekuverenga yekuverenga transaction, chinongedzo kune chinokonzeresa kukosha chimiro chinozoshanda chete kusvika yekutanga kugadzirisa maitiro (kunyora kana kudzima data).
- Kunyangwe chimiro
NodeValue
kwete yakazara-yakazara, asi yakatemwa (ona chidimbu "Kuodha makiyi uchishandisa wekunze muenzanisi"), unogona kuwana zvakachengeteka minda yayo kuburikidza neinongedza. Chinhu chikuru hachisi chokuzvideredza! - Pasi pemamiriro ezvinhu haafaniri kugadziriswa kuburikidza neinongedzo yakagamuchirwa. Shanduko dzese dzinofanira kuitwa chete kuburikidza nenzira
mdb_put
. Zvisinei, zvisinei kuti unoda kuita izvi zvakaoma sei, hazvizogoneki, sezvo nzvimbo yekuyeuka iyo nzvimbo iyi inowanikwa yakarongwa mukuverenga chete. - Rema faira kune iyo process kero nzvimbo yechinangwa chekuti, semuenzaniso, kuwedzera yakakura saizi yekuchengetedza uchishandisa basa
mdb_env_set_map_size
inobvisa zvachose kutengeserana uye masangano ane hukama mune zvese uye anonongedzera kune zvimwe zvinhu kunyanya.
Chekupedzisira, chimwe chinhu chine hunyengeri zvekuti kuburitsa hunhu hwacho hakuenderane neimwe ndima. Muchitsauko pamusoro pemuti weB, ndakapa mufananidzo wekuti mapeji ayo akarongwa sei mundangariro. Izvi zvinotevera kubva pane izvi kuti kero yekutanga kwebhafa ine serialized data inogona kuve yakapokana. Nekuda kweizvi, chinongedzo kwavari chakagamuchirwa muchimiro MDB_val
uye yakaderedzwa kuva pointer kune chimiro, inoshanduka kuve isina kurongeka mune yakajairika kesi. Panguva imwecheteyo, magadzirirwo emamwe machipisi (munyaya yeIOS iyi armv7) inoda kuti kero yechero data ive yakawanda yesaizi yezwi remuchina kana, nemamwe mazwi, saizi diki yehurongwa ( yeArmv7 i32 bits). Nemamwe mashoko, oparesheni yakaita *(int *foo)0x800002
pavari kwakafanana nokupukunyuka uye kunotungamirira kurufu nomutongo EXC_ARM_DA_ALIGN
. Pane nzira mbiri dzekunzvenga nhamo yakadaro.
Yekutanga inowira pasi pekutanga kukopa data muchimiro chakarongeka. Semuenzaniso, pamuenzanisi wetsika izvi zvicharatidzwa sezvizvi.
int compare(MDB_val * const a, MDB_val * const b) {
NodeKey aKey, bKey;
memcpy(&aKey, a->mv_data, a->mv_size);
memcpy(&bKey, b->mv_data, b->mv_size);
return // ...
}
Imwe nzira ndeyekuzivisa mugadziri pachine nguva kuti makiyi-value zvimiro anogona kunge asina hunhu-akaenderana. aligned(1)
. PaARM unogona kuita zvakafanana
typedef struct __attribute__((packed)) NodeKey {
uint8_t parentId;
uint8_t type;
uint8_t nameLength;
uint8_t nameBuffer[256];
} NodeKey;
Range queries
Kuti udzokorore pamusoro peboka remarekodhi, LMDB inopa chirevo chekubvisa. Ngatitarisei maitiro ekushanda nayo tichishandisa muenzaniso wetafura ine mushandisi wegore metadata yatatojaira kwatiri.
Sechikamu chekuratidza runyoro rwemafaira mune dhairekitori, zvinodikanwa kuti uwane makiyi ese ayo mwana wayo mafaera uye maforodha anobatanidzwa. Muzvikamu zvakapfuura takaronga makiyi NodeKey
zvekuti ivo vanonyanya kurairwa neID yedhairekitori revabereki. Saka, nehunyanzvi, basa rekudzoreredza zviri mukati mefolda rinodzika pakuisa cursor pamuganhu wepamusoro weboka remakiyi ane prefix yakapihwa uyezve ichidzokorodza kumuganhu wezasi.
Iyo yekumusoro yakasungirirwa inogona kuwanikwa zvakananga nekutevera kutsvaga. Kuti uite izvi, iyo cursor inoiswa pakutanga kwese rondedzero yekiyi mudhatabhesi uye inowedzera kuwedzera kusvika kiyi ine identifier yevabereki dhairekitori inoonekwa pazasi payo. Iyi nzira ine 2 zviri pachena kuipa:
- Linear kutsvaga kuomarara, kunyangwe, sekuzivikanwa, mumiti zvakazara uye muB-muti kunyanya inogona kuitwa munguva yelogarithmic.
- Pasina maturo, mapeji ose anotangira ari kutsvakwa anosimudzwa kubva mufaira kuenda kundangariro huru, iyo inodhura zvikuru.
Sezvineiwo, iyo LMDB API inopa nzira inoshanda yekutanga kuisa cursor.Kuita izvi, iwe unofanirwa kugadzira kiyi ine kukosha kwayo kuri pachena kushoma kana kuenzana nekiyi iri kumuganhu wepamusoro wenguva. Semuenzaniso, maererano nerondedzero mumufananidzo uri pamusoro, tinogona kuita kiyi iyo munda parentId
ichaenzana ne2, uye mamwe ese akazadzwa nemaziro. Kiyi yakadaro yakazadzwa zvishoma inopihwa kune yekuisa basa mdb_cursor_get
zvichiratidza kuvhiyiwa MDB_SET_RANGE
.
NodeKey upperBoundSearchKey = {
.parentId = 2,
.type = 0,
.nameLength = 0
};
MDB_val value, key = serialize(upperBoundSearchKey);
MDB_cursor *cursor;
mdb_cursor_open(..., &cursor);
mdb_cursor_get(cursor, &key, &value, MDB_SET_RANGE);
Kana muganho wepamusoro weboka rekiyi wawanikwa, tobva tadzokorora pamusoro pawo kusvika tasangana kana kiyi yasangana neimwe. parentId
, kana kuti makiyi haachapera zvachose.
do {
rc = mdb_cursor_get(cursor, &key, &value, MDB_NEXT);
// processing...
} while (MDB_NOTFOUND != rc && // check end of table
IsTargetKey(key)); // check end of keys group
Chii chakanaka ndechekuti sechikamu cheiyo iteration uchishandisa mdb_cursor_get, isu tinowana kwete chete kiyi, asiwo kukosha. Kana, kuitira kuti uzadzise mamiriro ekuenzanisa, iwe unofanirwa kutarisa, pakati pezvimwe zvinhu, minda kubva kune yakakosha chikamu cherekodhi, saka ivo vanosvikika pasina mamwe majeti.
4.3. Kuenzanisira hukama pakati pematafura
Parizvino, takakwanisa kufunga nezvese maficha ekugadzira uye kushanda neiyo imwe-tafura dhatabhesi. Tinogona kutaura kuti tafura seti yemarekodhi akarongwa anoumbwa nemhando imwechete yekiyi-kukosha pairi. Kana iwe ukaratidza kiyi serectangle uye kukosha kwakabatana separallelepiped, unowana mufananidzo wekuona we database.
Zvisinei, muupenyu hazvibviri kurarama nokudeurwa kweropa kushoma. Kazhinji mune dhatabhesi inodiwa, kutanga, kuve nematafura akati wandei, uye chechipiri, kuita sarudzo mukati mawo muhurongwa hwakasiyana nekiyi yekutanga. Ichi chikamu chekupedzisira chakatsaurirwa kune nyaya dzekusika kwavo uye kubatana.
Index tables
Iyo cloud application ine "Gallery" chikamu. Iyo inoratidza midhiya zvemukati kubva mugore rose, rakarongwa nemazuva. Kuti unyatsoita sarudzo yakadaro, padivi petafura huru iwe unofanirwa kugadzira imwe ine mhando nyowani yemakiyi. Iwo achange aine ndima ine zuva rakagadzirwa faira, iyo ichaita seyekutanga kurongedza. Nekuti makiyi matsva anoreva data rakafanana nemakiyi ari mutafura huru, anonzi makiyi eindex. Mumufananidzo uri pazasi ivo vakajekeswa mune orenji.
Kuti uparadzanise makiyi ematafura akasiyana kubva kune mumwe nemumwe mukati meiyo dhatabhesi imwe, imwe tekinoroji yemunda tableId yakawedzerwa kune ese. Nekuita kuti ive iyo inonyanya kukosha pakuronga, tichawana kuunganidzwa kwemakiyi kutanga nematafura, uye mukati mematafura - zvinoenderana nemitemo yedu.
Indekisi kiyi inonongedza data imwechete sekiyi yekutanga. Kuitwa kwakatwasuka kweichi chivakwa kuburikidza nekubatana nacho kopi yekukosha chikamu chekiyi yekutanga haina kukwana kubva kune akati wandei maonero:
- Panyaya yenzvimbo yakatorwa kumusoro, iyo metadata inogona kupfuma.
- Kubva pakuona kwekuita, sezvo kana uchigadziridza metadata yenode, uchafanirwa kuinyora zvakare uchishandisa makiyi maviri.
- Kubva pakuona kwekutsigirwa kwekodhi, kana tikakanganwa kugadzirisa iyo data kune imwe yekiyi, isu tinowana isinganzwisisike bug yekusawirirana kwedata mukuchengetedza.
Zvadaro, tichaona kuti tingabvisa sei zvikanganiso izvi.
Kuronga hukama pakati pematafura
Chimiro chakanyatsokodzera kubatanidza tafura ye index netafura huru "kiyi sekukosha". Sezvinoratidzwa nezita rayo, kukosha kwechikamu cheiyo index rekodhi ikopi yekutanga yakakosha kukosha. Iyi nzira inobvisa zvipingamupinyi zvose zvataurwa pamusoro apa zvakabatana nekuchengetedza kopi yechikamu chekukosha kwezvinyorwa zvekutanga. Mutengo chete ndewekuti kuti uwane kukosha nekiyi index, unofanirwa kuita 2 mibvunzo kune dhatabhesi pane imwe. Schematically, iyo inoguma database schema inotaridzika seizvi.
Imwe nzira yekuronga hukama pakati pematafura ndeye "dundant key". Chinokosha chayo ndechekuwedzera humwe hunhu kukiyi, izvo zvinodiwa kwete zvekugadzirisa, asi zvekugadzirisa zvakare kiyi yakabatana.MuMail.ru Cloud application pane mienzaniso chaiyo yekushandiswa kwayo, zvisinei, kuitira kudzivirira kunyura kwakadzika mukati. mamiriro eiyo iOS masisitimu, ini ndichapa manyepo, asi muenzaniso wakajeka
Cloud mobile clients vane peji rinoratidza mafaera ese nemaforodha ayo mushandisi akagovana nevamwe vanhu. Sezvo paine mashoma mafaera akadaro, uye kune akawanda emhando dzakasiyana dzeruzivo rwekushambadza kwakabatana navo (ndiani anopihwa mukana, nekodzero dzipi, nezvimwewo), hazvizove zvine musoro kuremedza kukosha kwechikamu cheiyo rekodhi mutafura huru nayo. Nekudaro, kana iwe uchida kuratidza mafaera akadaro kunze kwenyika, iwe uchiri kuda kuichengeta kumwe. Mhinduro yakasikwa ndeyekugadzira tafura yakasiyana nayo. Mudhayagiramu iri pazasi, kiyi yaro yakamisikidzwa ne “P”, uye “propname” inobatirira nzvimbo inogona kutsiviwa neinonyanya kukosha “ruzivo rweruzhinji”.
Yese yakasarudzika metadata, nekuda kwekuchengetedza iyo tafura nyowani yakagadzirwa, inoiswa muchikamu chakakosha cherekodhi. Panguva imwecheteyo, haudi kudzokorora iyo data nezve mafaera uye maforodha akatochengetwa mutafura huru. Pane kudaro, data rakawandisa rinowedzerwa kune "P" kiyi muchimiro che "node ID" uye "timestamp" minda. Kutenda kwavari, iwe unogona kugadzira kiyi ye index, kubva kwaunogona kuwana kiyi yekutanga, kubva iyo, pakupedzisira, iwe unogona kuwana node metadata.
Mhedziso
Isu tinoongorora mhedzisiro yekuitwa kweLMDB zvakanaka. Mushure mazvo, huwandu hwemashandisirwo echando hwakadzikira ne30%.
Mhedzisiro yebasa rakaitwa yakanzwika kupfuura timu yeIOS. Parizvino, chimwe chezvikamu zvikuru zve "Mafaira" muAroid application yachinjawo kushandisa LMDB, uye zvimwe zvikamu zviri munzira. Mutauro weC, umo kiyi-yakakosha chitoro inoshandiswa, yaive rubatsiro rwakanaka rwekutanga kugadzira dhizaini rekushandisa rakaitenderedza muchinjika-chikuva muC ++. Iyo kodhi jenareta yakashandiswa kubatanidza isina musono raibhurari yeC ++ ine kodhi yepuratifomu muObjective-C uye Kotlin.
Source: www.habr.com