{"id":98090,"date":"2020-10-24T02:42:38","date_gmt":"2020-10-24T00:42:38","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux"},"modified":"2020-11-18T00:58:48","modified_gmt":"2020-11-17T22:58:48","slug":"ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","title":{"rendered":"Usaldusv\u00e4\u00e4rne andmete ja failide salvestamine Linuxis","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Uurides andmete s\u00e4ilitamise usaldusv\u00e4\u00e4rsust pilves\u00fcsteemides, otsustasin end proovile panna ja veenduda, et m\u00f5istan p\u00f5hiasju. Ma <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">alustasin NVMe spetsifikatsiooni lugemisega<\/a><\/noindex> et m\u00f5ista, milliseid garantiisid pakuvad NMVe kettad seoses andmete usaldusv\u00e4\u00e4rse s\u00e4ilitamisega (st garanteerides, et andmed on s\u00fcsteemi rikke korral kergesti k\u00e4ttesaadavad). Minu p\u00f5hij\u00e4reldused olid j\u00e4rgmised: andmeid tuleb pidada kahjustatuks hetkest, kui on antud andmete kirjutamise k\u00e4sk, kuni nende t\u00e4ieliku kirjutamiseni salvestusseadmesse. Kuid enamikus andmete kirjutamise programmides kasutatakse s\u00fcsteemi kutseid t\u00e4iesti rahulikult.<\/p>\n<p>Selles materjalis uurin Linuxi failide API-de kaudu pakutavaid andmete usaldusv\u00e4\u00e4rse s\u00e4ilitamise mehhanisme. Tundub, et siin peaks k\u00f5ik olema lihtne: programm kutsub v\u00e4lja k\u00e4su <code>write()<\/code>, ja kui selle k\u00e4su t\u00f6\u00f6 on l\u00f5petatud, on andmed usaldusv\u00e4\u00e4rselt salvestatud kettale. Kuid <code>write()<\/code> ainult kopeerib rakenduse andmed tuuma vahem\u00e4llu, mis asub juhuslikus m\u00e4lus. Kettale andmete kirjutamise sundimiseks on vaja kasutada m\u00f5ningaid t\u00e4iendavaid mehhanisme.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\"><img decoding=\"async\" alt=\"Usaldusv\u00e4\u00e4rne andmete ja failide salvestamine Linuxis\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Kokkuv\u00f5ttes on see materjal m\u00e4rkmete kogum, mis k\u00e4sitleb, mida olen \u00f5ppinud mind huvitavast teemast. Kui r\u00e4\u00e4kida k\u00f5ige olulisemast v\u00e4ga l\u00fchidalt, siis tuleb andmete usaldusv\u00e4\u00e4rse salvestamise organiseerimiseks kasutada k\u00e4sku <code>fdatasync()<\/code> v\u00f5i avada faile lipuga <code>O_DSYNC<\/code>. Kui olete huvitatud, et teada saada, mis t\u00e4pselt juhtub andmetega programmikoodist kuni ketaseni, vaadake <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">seda<\/a><\/noindex> artiklit.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Funktsiooni write() kasutamise omadused<\/h2>\n<p>\nS\u00fcsteemik\u00f5ne <code>write()<\/code> on m\u00e4\u00e4ratletud standardis <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/POSIX\">IEEE POSIX<\/a><\/noindex> kui katse andmete kirjutamiseks failikirjeldajasse. P\u00e4rast edukat t\u00e4itmist <code>write()<\/code> peavad andmete lugemise operatsioonid tagastama t\u00e4pselt need baitid, mis olid enne kirjutatud, isegi juhul, kui andmetele p\u00e4\u00e4sevad juurde teised protsessid v\u00f5i l\u00f5imud (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">siin on<\/a><\/noindex> vastav jaotis POSIX standardist). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">Siit<\/a><\/noindex>, jaotises, mis k\u00e4sitleb voogude suhete loomist tavaliste failitoimetamistega, on m\u00e4rge, mille kohaselt kui iga voog kutsub neid funktsioone, peab iga kutse n\u00e4gema kas k\u00f5iki m\u00e4\u00e4ratud tagaj\u00e4rgi, mis tulenevad teise kutse t\u00e4itmisest, v\u00f5i mitte n\u00e4gema \u00fcldse mingeid tagaj\u00e4rgi. See toetab j\u00e4reldust, et k\u00f5ik sisendi\/v\u00e4ljundi failitoimingud peavad hoidma ressurssi, millega nad t\u00f6\u00f6tavad, lukustatud.<\/p>\n<p>Kas see t\u00e4hendab, et operatsioon <code>write()<\/code> on atomaarne? Tehnilisest vaatepunktist - jah. Andmete lugemise operatsioonid peavad tagastama kas k\u00f5ik v\u00f5i mitte midagi, mis on kirjutatud kasutades <code>write()<\/code>. Kuid operatsioon <code>write()<\/code>, vastavalt standardile ei pea see tingimata l\u00f5petama, kirjutades kogu, mis on talle ette n\u00e4htud. Tal on lubatud salvestada ainult osa andmetest. N\u00e4iteks v\u00f5ib meil olla kaks voogu, iga\u00fcks neist lisab 1024 baidi faili, mis on kirjeldatud sama failihandleriga. Standardi seisukohalt on vastuv\u00f5etav tulemus, kui iga salvestusoperatsioon suudab faili lisada vaid \u00fche baidi. Need operatsioonid j\u00e4\u00e4vad aatomaarseteks, kuid p\u00e4rast nende l\u00f5petamist on failis salvestatud andmed omavahel segamini. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">Siin on<\/a><\/noindex> selle teema kohta on v\u00e4ga huvitav arutelu Stack Overflow's.<\/p>\n<h2>Funktsioonid fsync() ja fdatasync()<\/h2>\n<p>\nLihtsaim viis andmete diskile kirjutamiseks on funktsiooni v\u00e4ljakutse <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fsync.2.html\">fsync()<\/a><\/noindex>. See funktsioon palub operatsioonis\u00fcsteemil viia k\u00f5ik muudetud plokid vahem\u00e4lust diskile. See h\u00f5lmab ka k\u00f5iki failide metaandmeid (juurdep\u00e4\u00e4su aeg, faili muutmise aeg jne). Arvan, et nende metaandmete vajadus tekib harva, seega kui teate, et need ei ole teie jaoks olulised, v\u00f5ite kasutada funktsiooni <code>fdatasync()<\/code>. Dokumendihalduses <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">abi<\/a><\/noindex> kohta <code>fdatasync()<\/code> On v\u00e4idetud, et selle funktsiooni t\u00f6\u00f6tamise k\u00e4igus salvestatakse kettale sellises mahus metaandmeid, mis on vajalik j\u00e4rgmiste andmelugemise toimingute \u00f5igeaegseks t\u00e4itmiseks. See on just see, mis enamikku rakendusi huvitab.<\/p>\n<p>\u00dcks probleem, mis siin v\u00f5ib tekkida, on see, et need mehhanismid ei garanteeri, et faili saab p\u00e4rast v\u00f5imalikke t\u00f5rkeid leida. Eriti siis, kui luuakse uus fail, tuleb kutsuda <code>fsync()<\/code> kausta, mis seda sisaldab. Vastasel juhul v\u00f5ib p\u00e4rast t\u00f5rget selguda, et see fail ei eksisteeri. Selle p\u00f5hjuseks on see, et UNIXis, j\u00e4igade linkide kasutamise t\u00f5ttu, v\u00f5ib fail eksisteerida mitmes kaustas. Seet\u00f5ttu kutsudes <code>fsync()<\/code> faili puhul ei ole v\u00f5imalik teada saada, millise kausta andmeid tuleb samuti kettale salvestada (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">siin<\/a><\/noindex> selle kohta saab lugeda rohkem). Tundub, et failis\u00fcsteem ext4 on suuteline <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">automaatselt<\/a><\/noindex> rakendama <code>fsync()<\/code> kaustadele, mis sisaldavad vastavaid faile, kuid teiste failis\u00fcsteemide puhul ei pruugi see nii olla.<\/p>\n<p>See mehhanismi rakendamine v\u00f5ib erinevates failis\u00fcsteemides erineda. Kasutasin <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace<\/a><\/noindex> , et teada saada, milliseid kettaoperatsioone kasutatakse failis\u00fcsteemides ext4 ja XFS. M\u00f5lemad v\u00e4ljastavad tavap\u00e4rased ketta kirjutamise k\u00e4sud, nii failisisu osas kui ka failis\u00fcsteemi logis, t\u00fchjendavad vahem\u00e4lu ja l\u00f5petavad t\u00f6\u00f6, tehes FUA-kirjutuse (Force Unit Access, andmete kirjutamine otse kettale, m\u00f6\u00f6da vahem\u00e4lu) logisse. T\u00f5en\u00e4oliselt k\u00e4ituvad nad nii operatsiooni kinnitamise tagamiseks. Ketastel, mis ei toeta FUA-d, p\u00f5hjustab see kahe vahem\u00e4lu t\u00fchjendamise. Minu katsed on n\u00e4idanud, et <code>fdatasync()<\/code> veidi kiiremini <code>fsync()<\/code>. T\u00f6\u00f6riist <code>blktrace<\/code> n\u00e4itab, et <code>fdatasync()<\/code> tavaliselt kirjutab kettale v\u00e4hem andmeid (ext4 <code>fsync()<\/code> kirjutab 20 KiB, samas kui <code>fdatasync()<\/code> \u2014 16 KiB). Lisaks avastasin, et XFS on veidi kiirem kui ext4. Ja siin abil <code>blktrace<\/code> sain teada, et <code>fdatasync()<\/code> t\u00fchjendab kettale v\u00e4hem andmeid (4 KiB XFS).<\/p>\n<h2>Kahtlased olukorrad, mis tekivad fsync() kasutamisel<\/h2>\n<p>\nM\u00e4letan kolme kahtlast olukorda, millega olen praktikas silmitsi seisnud. <code>fsync()<\/code>, millega ma praktikas kokku puutusin.<\/p>\n<p>Esimene selline juhtum leidis aset 2008. aastal. Sel ajal 'riputas' Firefox 3 liides, kui salvestati suure arvu failide andmeid kettale. Probleem oli seotud sellega, et liidese olekuandmete talletamiseks kasutati SQLite andmebaasi. Iga kord, kui liideses toimus muutus, kutsuti v\u00e4lja funktsioon <code>fsync()<\/code>, mis pakkus head garantiid andmete stabiilse salvestamise kohta. Toona kasutusel olnud ext3 failis\u00fcsteemis funktsioon <code>fsync()<\/code> salvestas kettale k\u00f5ik 'm\u00e4danenud' lehed s\u00fcsteemis, mitte ainult need, mis olid seotud vastava failiga. See t\u00e4hendas, et Firefoxi nuppudele kl\u00f5psamine v\u00f5is alustada megabaitide andmete salvestamist magnetkettale, mis v\u00f5is kesta mitu sekundit. Probleemi lahendus, nii nagu ma aru sain <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">sellest<\/a><\/noindex> materjalist, seisnes andmebaasiga t\u00f6\u00f6tamise \u00fcleviimises as\u00fcnkroonsetesse taustategevustesse. See t\u00e4hendab, et varem rakendati Firefoxis rangemaid n\u00f5udeid andmete stabiilse salvestamise osas, kui see reaalselt vajalik oli, ja ext3 failis\u00fcsteemi erip\u00e4ra s\u00fcvendas seda probleemi.<\/p>\n<p>Teine probleem tekkis 2009. aastal. P\u00e4rast s\u00fcsteemi riket sattusid uue ext4 failis\u00fcsteemi kasutajad olukorda, kus paljud hiljuti loodud failid olid nullpikkusega, samas kui vanema ext3 failis\u00fcsteemi puhul seda ei juhtunud. Eelnevas l\u00f5igus r\u00e4\u00e4kisin, et ext3 salvestas kettale liiga palju andmeid, mis aeglustas t\u00f6\u00f6d m\u00e4rkimisv\u00e4\u00e4rselt. <code>fsync()<\/code>Selle olukorra parandamiseks salvestatakse ext4 failile kettale vaid need 'mustad' lehek\u00fcljed, mis on seotud konkreetse failiga. \u00dclej\u00e4\u00e4nud failide andmed j\u00e4\u00e4vad m\u00e4llu palju pikemaks ajaks kui ext3 kasutamisel. See tehti j\u00f5udluse parandamise nimel (vaikimisi j\u00e4\u00e4vad andmed sellesse olekusse 30 sekundiks, seda saab seadistada koos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/vm.txt\">dirty_expire_centisecs<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/www.spinics.net\/lists\/linux-ext4\/msg68941.html\">siin<\/a><\/noindex> leiate t\u00e4iendavaid materjale selle kohta). See t\u00e4hendab, et suur hulk andmeid v\u00f5ib p\u00e4rast rikete tekkimist p\u00f6\u00f6rdumatult kaduma minna. Selle probleemi lahenduseks on <code>fsync()<\/code> rakendustes, mis peavad tagama andmete stabiilse s\u00e4ilitamise ja maksimaalselt nende kaitsmise rikete tagaj\u00e4rgede eest. Funktsioon <code>fsync()<\/code> ext4 t\u00f6\u00f6tab m\u00e4rksa t\u00f5husamalt kui ext3. Selle l\u00e4henemise miinus on aga see, et selle kasutamine aeglustab teatud toimingute, n\u00e4iteks programmide installimise, teostamist. Lisainfot leiate siit <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">siit<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">siit<\/a><\/noindex>.<\/p>\n<p>Kolmas probleem, mis puudutab <code>fsync()<\/code>, tekkis 2018. aastal. Siis selgus PostgreSQL projekti raames, et kui funktsioon <code>fsync()<\/code> kohtub veaga, m\u00e4rgib ta 'mustad' lehed kui 'puhtad'. Selle tulemusena ei tehta j\u00e4rgmiste k\u00f5nede <code>fsync()<\/code> selliste lehtedega midagi. Selle t\u00f5ttu j\u00e4\u00e4vad muudetud lehed m\u00e4llu ja neid ei kirjutata kunagi kettale. See on t\u00f5eline katastroof, kuna rakendus arvab, et andmed on kettale kirjutatud, kuid tegelikult see nii ei ole. Sellised t\u00f5rked <code>fsync()<\/code> on haruldased, rakendus ei suuda sellistes olukordades peaaegu midagi teha probleemi lahendamiseks. T\u00e4nap\u00e4eval, kui see juhtub, PostgreSQL ja teised rakendused l\u00f5petavad \u00e4kki t\u00f6\u00f6. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">Siit<\/a><\/noindex>, artiklis 'Kas rakendused saavad fsync t\u00f5rgetest taastuda?', uuritakse seda probleemi k\u00f5igis detailides. Praegu on parim lahendus selle probleemi lahendamiseks Direct I\/O kasutamine koos lipuga <code>O_SYNC<\/code> v\u00f5i lipuga <code>O_DSYNC<\/code>. Selle l\u00e4henemise korral teatab s\u00fcsteem vigadest, mis v\u00f5ivad tekkida konkreetsete andmete kirjutamise toimingute k\u00e4igus, kuid see n\u00f5uab, et rakendus haldaks puhverdusi ise. Lisateavet leiate siit <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">siit<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">siit<\/a><\/noindex>.<\/p>\n<h2>Failide avamine O_SYNC ja O_DSYNC lipukestega<\/h2>\n<p>\nNaaseme arutelule Linuxi mehhanismide \u00fcle, mis tagavad andmete j\u00e4rjepideva salvestamise. Eelk\u00f5ige r\u00e4\u00e4gime me lipu kasutamisest <code>O_SYNC<\/code> v\u00f5i lipust <code>O_DSYNC<\/code> failide avamisel s\u00fcsteemik\u00f5ne kaudu <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open()<\/a><\/noindex>. Selle l\u00e4henemisega viiakse iga andme kirjutamise toiming l\u00e4bi nagu p\u00e4rast iga k\u00e4sku antaks s\u00fcsteemile vastavad k\u00e4sud <code>write()<\/code> POSIX spetsifikatsioonide <code>fsync()<\/code> ja <code>fdatasync()<\/code>. Dokumendihalduses <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">seda nimetatakse \u201eS\u00fcnkroonitud I\/O Faili Terviklikkuse T\u00e4itmine\u201c ja \u201eAndmete Terviklikkuse T\u00e4itmine\u201c. Selle l\u00e4henemise peamine eelis on see, et andmete terviklikkuse tagamiseks tuleb teha vaid \u00fcks s\u00fcsteemik\u00f5ne, mitte kaks (n\u00e4iteks \u2014<\/a><\/noindex> ). Selle l\u00e4henemise peamine puudus on see, et k\u00f5ik kirjutamisoperatsioonid, mis kasutavad vastavat failide kirjeldajat, synchroniseeritakse, mis v\u00f5ib piirata rakenduse koodi struktureerimise v\u00f5imalusi. <code>write()<\/code> ja <code>fdatasync()<\/code>). Selle l\u00e4henemise peamine puudus on see, et k\u00f5ik kirjutamise operatsioonid, mis kasutavad vastavat faili deskriptorit, saavad olema s\u00fcnkroniseeritud, mis v\u00f5ib piirata rakenduse koodistruktuuri loomise v\u00f5imalusi.<\/p>\n<h2>Direct I\/O kasutamine O_DIRECT lipuga<\/h2>\n<p>\nS\u00fcsteemik\u00f5ne <code>open()<\/code> toetab lippu <code>O_DIRECT<\/code>, mis on m\u00f5eldud selleks, et v\u00e4ltida operatsioonis\u00fcsteemi vahem\u00e4lu, teostades sisendi-v\u00e4ljundi toiminguid otse kettaga. See t\u00e4hendab, et paljusid juhtumeid, kirjutamisk\u00e4sklusi, mis on antud programmile, edastatakse otse kettale suunatud k\u00e4sklusteks. Kuid \u00fcldiselt ei asenda see mehhanism funktsioone <code>fsync()<\/code> v\u00f5i <code>fdatasync()<\/code>. Asi on selles, et ise ketas v\u00f5ib <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">edasi l\u00fckata v\u00f5i vahem\u00e4luda<\/a><\/noindex> vastavaid andmete kirjutamise k\u00e4ske. Ja mis veelgi hullem, m\u00f5ningatel erijuhtudel, sisendi-v\u00e4ljundi toimingud, mis teostatakse lippu kasutades <code>O_DIRECT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">t\u00f5lgitakse<\/a><\/noindex> traditsioonilisteks puhverdatud toiminguteks. Selle probleemi lahendamine on lihtsaim viis avada failid ka lipuga <code>O_DSYNC<\/code>, mis t\u00e4hendab, et iga kirjutamistoiminguga kaasneb kutse <code>fdatasync()<\/code>.<\/p>\n<p>Leiti, et failis\u00fcsteemis XFS on hiljuti lisatud \"kiire tee\" <code>O_DIRECT|O_DSYNC<\/code>-andmete kirjutamiseks. Kui kirjutatakse \u00fcle plokk, kasutades <code>O_DIRECT|O_DSYNC<\/code>, siis XFS, asemel vahem\u00e4lu t\u00fchjendamise, t\u00e4idab FUA-kirje k\u00e4sku, kui seade seda toetab. Olen selle kinnitanud t\u00f6\u00f6riista kasutamisega <code>blktrace<\/code> Linuxi s\u00fcsteemis 5.4\/Ubuntu 20.04. See l\u00e4henemine peaks olema efektiivsem, kuna selle kasutamisel kirjutatakse kettale minimaalne kogus andmeid ja kasutatakse \u00fchte toimingut, mitte kahte (kirjutamine ja vahem\u00e4lu t\u00fchjendamine). Leidsin viite <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">plekk<\/a><\/noindex> 2018. aasta tuuma, kus see mehhanism on rakendatud. Seal on arutelu, mis k\u00e4sitleb selle optimeerimise rakendamist ka teistes failis\u00fcsteemides, kuid niipalju kui mina tean, on XFS praegu ainus failis\u00fcsteem, mis seda toetab.<\/p>\n<h2>sync_file_range()<\/h2>\n<p>\nLinuxis on s\u00fcsteemi k\u00f5ne <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sync_file_range.2.html\">sync_file_range()<\/a><\/noindex>, mis v\u00f5imaldab kirjutada kettale ainult osa failist, mitte kogu faili. See k\u00f5ne algatab as\u00fcnkroonse andmete kirjutamise ja ei oota selle l\u00f5petamist. Kuid juhendis <code>sync_file_range()<\/code> \u00f6eldakse, et k\u00e4sk on \"v\u00e4ga ohtlik\". Selle kasutamine ei ole soovitatav. Erip\u00e4ra ja ohtlikud aspektid <code>sync_file_range()<\/code> on v\u00e4ga h\u00e4sti kirjeldatud <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2014\/03\/how-syncfilerange-really-works.html\">selles<\/a><\/noindex> materjalis. Eriti paistab silma, et see kutse kasutab RocksDB-d selleks, et hallata, millal s\u00fcdamik \"r\u00e4pane\" teave kettale kirjutab. Kuid selleks, et andmed oleksid stabiilselt salvestatud, kasutatakse ka <code>fdatasync()<\/code>. Dokumendihalduses <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/rocksdb\/search?q=sync_file_range\">koodis<\/a><\/noindex> RocksDB-s on selle teema kohta huvitavad kommentaarid. N\u00e4iteks tundub, et kutse <code>sync_file_range()<\/code> ZFS-i kasutamisel ei p\u00f5hjusta andmete kirjutamist kettale. Minu kogemus \u00fctleb, et harva kasutatav kood v\u00f5ib sisaldada vigu. Seet\u00f5ttu soovitaksin seda s\u00fcsteemikutsumist v\u00e4ltida, kui see ei ole h\u00e4davajalik.<\/p>\n<h2>S\u00fcsteemikutsed, mis aitavad tagada andmete stabiilse salvestamise<\/h2>\n<p>\nJ\u00f5udsin j\u00e4reldusele, et andmete stabiilse salvestamise tagamiseks saab kasutada kolme l\u00e4henemisviisi. K\u00f5ik need n\u00f5uavad funktsiooni v\u00e4ljakutset <code>fsync()<\/code> kaustas, kus fail on loodud. Siin on need l\u00e4henemisviisid:<\/p>\n<ol>\n<li>Funktsiooni v\u00e4ljakutse <code>fdatasync()<\/code> v\u00f5i <code>fsync()<\/code> p\u00e4rast funktsiooni <code>write()<\/code> (soovitatav on kasutada <code>fdatasync()<\/code>).<\/li>\n<li>Failideskirpti kasutamine, mis on avatud lipuga <code>O_DSYNC<\/code> v\u00f5i <code>O_SYNC<\/code> (parem \u2014 lipuga <code>O_DSYNC<\/code>).<\/li>\n<li>K\u00e4skluse kasutamine <code>pwritev2()<\/code> lipu <code>RWF_DSYNC<\/code> v\u00f5i <code>RWF_SYNC<\/code> (eelistatult \u2014 lipuga <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>Toimivuse m\u00e4rkmed<\/h2>\n<p>\nMa ei ole teadlikult m\u00f5\u00f5tnud erinevate uuritud mehhanismide j\u00f5udlust. Minu t\u00e4hele pandud kiiruseread on \u00fcsna v\u00e4iksed. See t\u00e4hendab, et ma v\u00f5in eksida ja et samade tingimuste korral v\u00f5ivad tulemused olla erinevad. Esiteks r\u00e4\u00e4gin sellest, mis m\u00f5jutab j\u00f5udlust k\u00f5ige enam, ja seej\u00e4rel, mis m\u00f5jutab j\u00f5udlust v\u00e4hem.<\/p>\n<ol>\n<li>Faili andmete \u00fcle kirjutamine on kiirem kui andmete lisamine failile (j\u00f5udluse kasum v\u00f5ib ulatuda 2\u2013100%). Failile andmete lisamine n\u00f5uab lisamuudatusi faili metaandmetes, isegi p\u00e4rast s\u00fcsteemik\u00f5net, <code>fallocate()<\/code>, kuid selle efekti ulatus v\u00f5ib varieeruda. Soovitan parima j\u00f5udluse tagamiseks kutsuda <code>fallocate()<\/code> v\u00e4lja vajaliku ruumi eelnevalt eraldamiseks. Siis tuleb see ruum selges\u00f5naliselt nullidega t\u00e4ita ja kutsuda <code>fsync()<\/code>. T\u00e4nu sellele m\u00e4rgistatakse vastavad plokid failis\u00fcsteemis kui \"valitud\", mitte kui \"mittevalitud\". See toob kaasa v\u00e4ikese (umbes 2%) j\u00f5udluse paranemise. Lisaks sellele v\u00f5ivad m\u00f5ned kettad esimesel ploki ligip\u00e4\u00e4su operatsioonil olla aeglasemad kui teised. See t\u00e4hendab, et ruumi t\u00e4itmine nullidega v\u00f5ib tuua kaasa m\u00e4rkimisv\u00e4\u00e4rse (umbes 100%) j\u00f5udluse paranemise. Eelk\u00f5ige v\u00f5ib see juhtuda ketastega <noindex><a rel=\"nofollow\" href=\"https:\/\/n2ws.com\/blog\/how-to-guides\/pre-warm-ebs-volumes-on-aws\">AWS EBS<\/a><\/noindex> (need on mitteformaalne andmed, neid ei ole v\u00f5imalik kinnitada). Sama kehtib ka salvestuste kohta. <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/benchmarking-pd-performance\">GCP Persistent Disk<\/a><\/noindex> (see on juba ametlik teave, kinnitatud katsetega). Teised spetsialistid on teinud sarnaseid <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">t\u00e4heldusi<\/a><\/noindex>, mis on seotud erinevate ketastega.<\/li>\n<li>Mida v\u00e4hem on s\u00fcsteemik\u00f5nesid, seda k\u00f5rgem on j\u00f5udlus (kasv v\u00f5ib olla umbes 5%). Tundub, et k\u00f5ne <code>open()<\/code> lipu <code>O_DSYNC<\/code> v\u00f5i k\u00f5ne <code>pwritev2()<\/code> lipu <code>RWF_SYNC<\/code> on kiiremini kui k\u00f5ne <code>fdatasync()<\/code>Kahtlen, et asi on selles, et sellise l\u00e4henemise puhul m\u00e4ngib rolli, et \u00fche ja sama \u00fclesande t\u00e4itmiseks tuleb teha v\u00e4hem s\u00fcsteemi k\u00f5nesid (\u00fcks k\u00f5ne kahe asemel). Kuid j\u00f5udluse erinevus on v\u00e4ga v\u00e4ike, seega v\u00f5ite selle t\u00e4iesti t\u00e4helepanuta j\u00e4tta ja kasutada rakenduses seda, mis ei too kaasa selle loogika keerukuse suurenemist.<\/li>\n<\/ol>\n<p>\nKui teid huvitab andmete usaldusv\u00e4\u00e4rne salvestamine, siis siin on m\u00f5ned kasulikud materjalid:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.scylladb.com\/2017\/10\/05\/io-access-methods-scylla\/\">I\/O sisenemismeetodid<\/a><\/noindex> \u2014 \u00fclevaade sisenemise ja v\u00e4ljumise mehhanismidest.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">Andmete j\u00f5udmine kettale<\/a><\/noindex> \u2014 jutt sellest, mis juhtub andmetega rakendusest ketta suunas.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">Millal peaksite fsync'i rakendama sisaldavale kaustale<\/a><\/noindex> \u2014 vastus k\u00fcsimusele, millal tuleb seda rakendada <code>fsync()<\/code> kaustade jaoks. Kui seda kahe s\u00f5naga r\u00e4\u00e4kida, selgub, et seda tuleks teha uue faili loomisel, ja p\u00f5hjuseks on see, et Linuxis v\u00f5ib olla palju linke \u00fche ja sama faili jaoks.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/bobsql.com\/sql-server-on-linux-forced-unit-access-fua-internals\/\">SQL Server Linuxil: FUA sisemised seadmed<\/a><\/noindex> \u2014 siin on kirjeldus, kuidas andmete p\u00fcsiv hoidmine on realiseeritud SQL Serveris Linuxi platvormil. Siin on tehtud m\u00f5ned huvitavad v\u00f5rdlused Windowsi ja Linuxi s\u00fcsteemikutsungite vahel. Olen peaaegu kindel, et just selle materjali kaudu \u00f5ppisin FUA optimeerimisest XFS-s.<\/li>\n<\/ul>\n<p>\nKas olete kunagi kaotanud andmeid, mida pidasite kindlalt kettale salvestatuks?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=ustojchivoe_xranenie_dannyx_i_fajlovye_api_linux#order\"><img decoding=\"async\" alt=\"Usaldusv\u00e4\u00e4rne andmete ja failide salvestamine Linuxis\" src=\"\/wp-content\/uploads\/2020\/10\/8bea3fc2b65a5a683655d9c15e153c93.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub\/news\/read\/123?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=ustojchivoe_xranenie_dannyx_i_fajlovye_api_linux\"><img decoding=\"async\" alt=\"Usaldusv\u00e4\u00e4rne andmete ja failide salvestamine Linuxis\" src=\"\/wp-content\/uploads\/2020\/10\/d9fd0b1c09eb6e40944aee2d13ee4088.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98091,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98090","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 API Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-24T00:42:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:48+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47P\u00fcsiv andmete hoidmine ja Linuxi failide API | ProHoster","description":"Uurides andmete p\u00fcsivuse hoidmist pilves\u00fcsteemides, otsustasin testida oma teadmisi ja veenduda, et m\u00f5istan p\u00f5hipunkte. Alustasin NVMe spetsifikatsiooni lugemisest, et m\u00f5ista, milliseid garantiisid, mis on seotud p\u00fcsiva andmete hoidmisega (st garantiid, et andmed on p\u00e4rast s\u00fcsteemi t\u00f5rget saadaval), annavad meile NMVe kettad. Tegin j\u00e4rgmised p\u00f5hij\u00e4reldused:","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 API Linux | ProHoster","og:description":"\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-24T00:42:38+00:00","article:modified_time":"2020-11-17T22:58:48+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98090","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:05:49","updated":"2022-09-28 03:22:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/98090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=98090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/98090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/98091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=98090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=98090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=98090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}