{"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":"P\u00fcsiv andmete ja failide API Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Olen uurinud andmete salvestamise usaldusv\u00e4\u00e4rsust pilves\u00fcsteemides ja olen otsustanud end proovile panna, et aru saada, kas ma m\u00f5istan p\u00f5hilisi aspekte. Ma <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">alustasin NVMe spetsifikatsiooni lugemisest<\/a><\/noindex> , et m\u00f5ista, milliseid tagatisi p\u00fcsiva andmete salvestamise kohta (st tagatisi, et andmed on saadaval p\u00e4rast s\u00fcsteemi riket) pakuvad NMVe kettad. J\u00f5udsin j\u00e4rgmistele peamistele j\u00e4reldustele: andmeid tuleb pidada rikutuks hetkel, kui on antud andmete kirjutamise k\u00e4sk, ja kuni hetkeni, mil nende kirjutamine andmekandjale l\u00f5petatakse. Siiski, enamikus andmete kirjutamise programmides kasutatakse v\u00e4ga rahulikult s\u00fcsteemi v\u00e4ljakutseid.<\/p>\n<p>K\u00e4esolevas materjalis uurin p\u00fcsivate andmete salvestamise mehhanisme, mida pakuvad Linuxi failide API-d. Tundub, et siin peaks k\u00f5ik olema lihtne: programm kutsub v\u00e4lja k\u00e4su <code>write()<\/code>, ja p\u00e4rast selle k\u00e4su t\u00e4itmist peaksid andmed olema usaldusv\u00e4\u00e4rselt salvestatud kettale. Kuid <code>write()<\/code> see lihtsalt kopeerib rakenduse andmed tuuma vahem\u00e4llu, mis asub aktiivses m\u00e4lus. Et sundida s\u00fcsteemi andmeid kettale kirjutama, tuleb 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=\"P\u00fcsiv andmete ja failide API Linux\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u00dcldiselt on see materjal kogumik m\u00e4rkmeid, mis k\u00e4sitlevad seda, mida ma huvitaval teemal \u00f5ppisin. Kui v\u00e4ga l\u00fchidalt r\u00e4\u00e4kida k\u00f5ige olulisemast, siis selgub, et p\u00fcsiva andmete salvestamise korraldamiseks tuleb kasutada k\u00e4sku <code>fdatasync()<\/code> v\u00f5i avada faile flagi <code>O_DSYNC<\/code>abil. Kui teid huvitab \u00fcksikasjalik \u00fclevaade sellest, mis juhtub andmetega teel programmikoodist kettale, 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>write() funktsiooni kasutamise erip\u00e4rad<\/h2>\n<p>\nS\u00fcsteemi v\u00e4ljakutse <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 failide deskiptorisse. P\u00e4rast operatsiooni edukat l\u00f5petamist <code>write()<\/code> peavad andmete lugemise toimingud tagastama t\u00e4pselt need baitid, mis olid eelnevalt kirjutatud, isegi juhul, kui andmetele p\u00e4\u00e4sevad ligi teised protsessid v\u00f5i l\u00f5imed (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">siin on<\/a><\/noindex> vastav POSIXi standardi osa). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">Siin<\/a><\/noindex>, jaotises, mis k\u00e4sitleb voogude suhtlemist tavaliste failitegevustega, on m\u00e4rge, kus \u00f6eldakse, et kui iga voog kutsub neid funktsioone v\u00e4lja, peab iga v\u00e4ljakutse n\u00e4gema kas k\u00f5iki m\u00e4\u00e4ratud tagaj\u00e4rgi, mida p\u00f5hjustab muu v\u00e4ljakutse t\u00e4itmine, v\u00f5i ei n\u00e4e mitte \u00fchtegi tagaj\u00e4rge. See v\u00f5imaldab j\u00e4reldada, et k\u00f5ik sisendi\/v\u00e4ljundi failitegevused peavad hoidma ressursi lukus, millega nad t\u00f6\u00f6tavad.<\/p>\n<p>Kas see t\u00e4hendab, et operatsioon <code>write()<\/code> on aatomaarne? Tehniliselt \u2014 jah. Andmete lugemise operatsioonid peaksid tagastama kas k\u00f5ik v\u00f5i mitte midagi sellest, mis on kirjutatud funktsiooni <code>write()<\/code>. Kuid operatsioon <code>write()<\/code>, vastavalt standardile, ei pea tingimata l\u00f5pule viima, kirjutades k\u00f5ik, mis tal oli ette n\u00e4htud kirjutada. Tal on lubatud kirjutada ainult osa andmeid. N\u00e4iteks v\u00f5ib meil olla kaks voogu, iga\u00fcks, kes lisab 1024 baiti faili, millel on sama failihaldur. Standardi kohaselt on vastuv\u00f5etav tulemus, kui iga kirjutamisoperatsioon suudab faili lisada vaid \u00fche baiti. Need operatsioonid j\u00e4\u00e4vad aatomaarseks, kuid nende l\u00f5puleviimisel on neile kirjutatud andmed failis segamini. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">Siin<\/a><\/noindex> Sellel teemal on v\u00e4ga huvitav arutelu Stack Overflow's.<\/p>\n<h2>Funktsioonid fsync() ja fdatasync()<\/h2>\n<p>\nLihtsaim viis andmete kettale 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 taotleb operatsioonis\u00fcsteemilt k\u00f5igi muudetud plokkide edastamist vahem\u00e4lust kettale. Siia kuuluvad ka k\u00f5ik faili metaandmed (j\u00f5udmisaja, faili muutmise aeg jne). Ma usun, et nende metaandmete vajadus tekib harva, seega kui teate, et need ei ole teile olulised, v\u00f5ite kasutada funktsiooni <code>fdatasync()<\/code>. Failis <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">abi<\/a><\/noindex> 6TB <code>fdatasync()<\/code> \u00fctleb, et selle funktsiooni t\u00f6\u00f6 k\u00e4igus salvestatakse kettale nii palju metaandmeid, kui on \"vajalik j\u00e4rgmiste andmete lugemise operatsioonide korrektseks teostamiseks\". Ja see on t\u00e4pselt see, mis enamiku rakenduste jaoks muret tekitab.<\/p>\n<p>\u00dcks probleem, mis siit v\u00f5ib tekkida, on see, et need mehhanismid ei garanteeri, et faili saab p\u00e4rast v\u00f5imalikku riket leida. Eriti siis, kui luuakse uus fail, tuleb v\u00e4ljakutse teha <code>fsync()<\/code> katalooge, mis seda sisaldab. Vastasel juhul v\u00f5ib p\u00e4rast t\u00f5rget juhtuda, et seda faili ei eksisteeri. Selle p\u00f5hjuseks on asjaolu, et UNIXis, tugevate linkide kasutamise t\u00f5ttu, v\u00f5ib fail eksisteerida mitmes kataloogis. Seet\u00f5ttu kutsutakse esile <code>fsync()<\/code> faili jaoks pole v\u00f5imalust teada, milliste kataloogide andmeid tuleb samuti kettale kirjutada (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">siit<\/a><\/noindex> sellest saab lugeda l\u00e4hemalt). Tundub, et failis\u00fcsteem ext4 on v\u00f5imeline <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">automaatne<\/a><\/noindex> rakendama <code>fsync()<\/code> kataloogidesse, mis sisaldavad vastavaid faile, kuid teiste failis\u00fcsteemide puhul ei pruugi see nii olla.<\/p>\n<p>Seda mehhanismi v\u00f5ib erinevates failis\u00fcsteemides eri viisil rakendada. Ma kasutasin <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace'i<\/a><\/noindex> selgitamaks, milliseid kettategevusi kasutatakse failis\u00fcsteemides ext4 ja XFS. M\u00f5lemad annavad tavalised kettale kirjutamise k\u00e4sud nii failide sisu kui ka failis\u00fcsteemi \u017eurnali jaoks, kirjutavad vahem\u00e4lud t\u00fchjaks ja l\u00f5petavad t\u00f6\u00f6tamise, teostades FUA-kirjutamise (Force Unit Access, andmete kirjutamine otse kettale, vahe m\u00e4lu vahele k\u00fcsimata) \u017eurnali. T\u00f5en\u00e4oliselt k\u00e4ituvad nad nii, et kinnitada operatsiooni teostamise fakti. Kettadel, mis ei toeta FUA-d, tekitab see kaks vahem\u00e4lu t\u00fchjendust. Minu katsed n\u00e4itasid, et <code>fdatasync()<\/code> veidi kiiremini <code>fsync()<\/code>. Utiliit <code>blktrace'i<\/code> j\u00e4tab mulje, et <code>fdatasync()<\/code> kirjutab tavaliselt 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 sain <code>blktrace'i<\/code> teada, et <code>fdatasync()<\/code> kirjutab kettale v\u00e4hem andmeid (4 KiB XFS-is).<\/p>\n<h2>Ebamugavad olukorrad, mis tekivad fsync() kasutamisel<\/h2>\n<p>\nMulle tuleb meelde kolm ebamugavat olukorda, mis on seotud <code>fsync()<\/code>, millega ma olen praktikas kokku puutunud.<\/p>\n<p>Esimene selline juhtum toimus 2008. aastal. Sel ajal \u2018j\u00e4i\u2019 Firefox 3 kasutajaliides seisma, kui kirjutati kettale palju faile. Probleem oli selles, et liidese oleku teabe salvestamiseks kasutati SQLite andmebaasi. P\u00e4rast iga muudatust, mis toimus liideses, kutsuti v\u00e4lja funktsioon <code>fsync()<\/code>, mis pakkus head garantiid andmete p\u00fcsiva hoidmise osas. Tol ajal kasutatud failis\u00fcsteemis ext3 funktsioon <code>fsync()<\/code> salvestas s\u00fcsteemis k\u00f5ik \u201er\u00e4pased\u201c lehed, mitte ainult need, mis olid seotud vastava failiga. See t\u00e4hendas, et hiirekl\u00f5ps Firefoxis v\u00f5is algatada megabaidise andmete salvestamise magnetketta peale, mis v\u00f5is v\u00f5tta palju sekundeid. Probleemi lahendus, nii nagu ma aru sain, oli <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">selle<\/a><\/noindex> materjalist, et andmebaasihalduse viimine as\u00fcnkroonsetesse taustat\u00f6\u00f6desse oli vajalik. See t\u00e4hendab, et varem olid Firefoxis rakendatud rangemad andmete salvestamise vastupidavuse n\u00f5uded, kui see tegelikult vajalik oli, ja ext3 failis\u00fcsteemi omadused halvendavad seda probleemi veelgi.<\/p>\n<p>Teine vastuolu tekkis 2009. aastal. Siis, p\u00e4rast s\u00fcsteemi nurjumist, leidsid uue ext4 failis\u00fcsteemi kasutajad, et paljud hiljuti loodud failid on nullpikkusega, kuid vanema ext3 failis\u00fcsteemi puhul ei toimunud sellist asja. Eelmises l\u00f5igus r\u00e4\u00e4kisin, et ext3 salvestas kettale liiga palju andmeid, mis aeglustas oluliselt <code>fsync()<\/code>t\u00f6\u00f6d. Situatsiooni parandamiseks salvestab ext4 kettale ainult need \u201er\u00e4pased\u201c lehed, mis on seotud konkreetse failiga. Teiste failide andmed j\u00e4\u00e4vad m\u00e4lu sisse palju pikemaks ajaks kui ext3 kasutamisel. See tehti j\u00f5udluse parandamiseks (vaikimisi on andmed sellises olekus 30 sekundit, seda saab seadistada <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\">siit<\/a><\/noindex> leiate t\u00e4iendavat teavet selle kohta). See t\u00e4hendab, et suurel andmemahtude puhul v\u00f5ivad andmed olla p\u00e4rast s\u00fcsteemiviga p\u00f6\u00f6rdumatult kadunud. Selle probleemi lahendus seisneb selle kasutamises <code>fsync()<\/code> rakendustes, mis peavad tagama usaldusv\u00e4\u00e4rse andmesalvestuse ja maksimaalselt kaitsta neid t\u00f5rgete tagaj\u00e4rgede eest. Funktsioon <code>fsync()<\/code> toimib ext4 kasutamisel palju t\u00f5husamalt kui ext3 kasutamisel. Selle l\u00e4henemise miinus on see, et selle rakendamine aeglustab, nagu ennegi, teatud toimingute t\u00e4itmist, n\u00e4iteks programmide installimist. \u00dcksikasjad selle kohta leiate <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">siin<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">siin<\/a><\/noindex>.<\/p>\n<p>Kolmas probleem, mis <code>fsync()<\/code>, kerkis esile 2018. aastal. Sel ajal, PostgreSQL projekti raames, selgitati v\u00e4lja, et kui funktsioon <code>fsync()<\/code> kohtab viga, m\u00e4rgib see \u201er\u00e4pased\u201c lehed kui \u201epuhtad\u201c. Seet\u00f5ttu j\u00e4rgmised v\u00e4ljakutsed <code>fsync()<\/code> Selliseid lehti ei tehta midagi. Seet\u00f5ttu s\u00e4ilivad muudetud lehed m\u00e4lu piires ja neid ei salvestata kunagi kettale. See on t\u00f5eline katastroof, kuna rakendus usub, et teatud andmed on kettale salvestatud, kuigi tegelikult see ei ole nii. Sellised vead <code>fsync()<\/code> esinevad harva, rakendus sellistes olukordades peaaegu ei saa probleemi lahendamiseks midagi ette v\u00f5tta. T\u00e4nap\u00e4eval, kui see juhtub, katkestavad PostgreSQL ja teised rakendused oma t\u00f6\u00f6. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">Siin<\/a><\/noindex>, artiklis \u201eKas rakendused saavad fsynci t\u00f5rgetest taastuda?\u201d, uuritakse seda probleemi \u00fcksikasjalikult. Praegu on parim lahendus selle probleemi jaoks kasutada Direct I\/O koos lipuga <code>O_SYNC<\/code> v\u00f5i lipuga <code>O_DSYNC<\/code>. Sellise l\u00e4henemise korral teatab s\u00fcsteem vigu, mis v\u00f5ivad tekkida andmete kirjutamise konkreetsete operatsioonide t\u00e4itmisel, kuid see l\u00e4henemine n\u00f5uab, et rakendus haldaks puhverdamist ise. Lisateavet selle kohta lugege <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">siin<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">siin<\/a><\/noindex>.<\/p>\n<h2>Failide avamine O_SYNC ja O_DSYNC lippudega<\/h2>\n<p>\nNaaseme arutelu juurde Linuxi mehhanismide kohta, mis tagavad andmete p\u00fcsiva salvestamise. Nimelt r\u00e4\u00e4gime me lipu kasutamisest <code>O_SYNC<\/code> v\u00f5i lipu <code>O_DSYNC<\/code> failide avamisel s\u00fcsteemi s\u00fcsteemik\u00f5nes <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open()<\/a><\/noindex>. Sellise l\u00e4henemise korral toimub iga andmete kirjutamise toiming nii, nagu oleks p\u00e4rast iga k\u00e4sku <code>write()<\/code> s\u00fcsteemile antud vastavalt k\u00e4sud <code>fsync()<\/code> ja <code>fdatasync()<\/code>. Failis <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">POSIXi spetsifikatsioon<\/a><\/noindex> nii \u00f6eldakse \"S\u00fcnkroniseeritud I\/O Faili Terviklikkuse T\u00e4itmine\" ja \"Andmete Terviklikkuse T\u00e4itmine\". Selle l\u00e4henemise peamine eelis on see, et andmete terviklikkuse tagamiseks peab toimuma ainult \u00fcks s\u00fcsteemi k\u00f5ne, mitte kaks (n\u00e4iteks \u2014 <code>write()<\/code> ja <code>fdatasync()<\/code>). Selle l\u00e4henemise peamine puudus on see, et k\u00f5ik kirjutamisoperatsioonid, mis kasutavad vastavat failikirjet, s\u00fcnkroniseeritakse, mis v\u00f5ib piirata rakenduse koodi struktureerimise v\u00f5imalusi.<\/p>\n<h2>Direct I\/O kasutamine O_DIRECT lipuga<\/h2>\n<p>\nS\u00fcsteemi v\u00e4ljakutse <code>open()<\/code> toetab lippu <code>O_DIRECT<\/code>, mis on m\u00f5eldud selleks, et m\u00f6\u00f6da minna operatsioonis\u00fcsteemi vahem\u00e4lust ning teostada sisendi-v\u00e4ljundi toiminguid, suheldes otse ketastega. See t\u00e4hendab paljudes olukordades, et programmi poolt antud kirjutamisk\u00e4sked t\u00f5lgitakse otse ketastele suunatud k\u00e4skudeks. Kuid \u00fcldiselt ei asenda see mehhanism funktsioone <code>fsync()<\/code> v\u00f5i <code>fdatasync()<\/code>. Asi on selles, et ise kettas v\u00f5ib <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">t\u00e4htsustada v\u00f5i vahem\u00e4lu<\/a><\/noindex> vastavaid andmete salvestamise k\u00e4sklusi. Ja mis veel hullem, m\u00f5ningatel erijuhtudel sisendi-v\u00e4ljundi toimingud, mida viiakse l\u00e4bi lipu kasutamisel <code>O_DIRECT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">edastatakse<\/a><\/noindex> traditsioonilistesse puhvrifunktsioonidesse. Selle probleemi lihtsaim lahendus on kasutada failide avamisel ka lippu <code>O_DSYNC<\/code>, mis t\u00e4hendab, et iga salvestamistoiminguga kaasneb kutse <code>fdatasync()<\/code>.<\/p>\n<p>Leiti, et XFS failis\u00fcsteemisse on hiljuti lisatud \"kiire tee\" <code>O_DIRECT|O_DSYNC<\/code>-andmete salvestamiseks. Kui bloke peatatakse, kasutades <code>O_DIRECT|O_DSYNC<\/code>, siis XFS, selle asemel et vahem\u00e4lu t\u00fchjendada, viib l\u00e4bi FUA-salvestamise k\u00e4su, kui seade seda toetab. Ma olen seda veendunud, kasutades t\u00f6\u00f6riista <code>blktrace'i<\/code> Linuxis 5.4 \/ Ubuntu 20.04. Selline l\u00e4henemine peaks olema efektiivsem, kuna selle kasutamisel salvestatakse kettale minimaalne andmemahu hulk ja rakendatakse \u00fchte operatsiooni, mitte kahte (salvestamine ja vahem\u00e4lu t\u00fchjendamine). Leidsin viite <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">pat\u0161<\/a><\/noindex> 2018. aasta tuumale, milles see mehhanism on rakendatud. Seal on arutelu selle optimeerimise rakendamise kohta ka teistes failis\u00fcsteemides, kuid niipalju kui ma tean, on XFS praegu ainus failis\u00fcsteem, mis seda toetab.<\/p>\n<h2>funktsioon sync_file_range()<\/h2>\n<p>\nLinuxis on s\u00fcsteemikutsumus <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 salvestada kettale vaid osa failist, mitte kogu faili. See kutsung algatab as\u00fcnkroonse andmete t\u00fchjendamise ja ei oota selle l\u00f5petamist. Kuid juhendis <code>sync_file_range()<\/code> \u00f6eldakse, et see k\u00e4sk on \"v\u00e4ga ohtlik\". Selle kasutamist ei soovitata. Omadused ja ohud <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. Eelk\u00f5ige n\u00e4ib, et see kutse kasutab RocksDB-d selleks, et hallata, millal tuum t\u00fchjendab \"mustad\" andmed kettale. Kuid samal ajal kasutatakse seal andmete p\u00fcsimise tagamiseks ka <code>fdatasync()<\/code>. Failis <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> kasutades ZFS ei viibi andmete t\u00fchjendamiseni kettale. Kogemus vihjab, et harva kasutatav kood v\u00f5ib sisaldada vigu. Seet\u00f5ttu soovitaksin seda s\u00fcsteemikutsumust mitte kasutada ilma \u00e4\u00e4rmise vajaduseta.<\/p>\n<h2>S\u00fcsteemikutsumised, mis aitavad tagada andmete p\u00fcsivuse<\/h2>\n<p>\nOlen j\u00f5udnud j\u00e4reldusele, et andmete p\u00fcsivaks salvestamiseks m\u00f5eldud sisendi\/v\u00e4ljundi toiminguteks on olemas kolm l\u00e4henemist. K\u00f5ik need n\u00f5uavad funktsiooni v\u00e4ljakutset <code>fsync()<\/code> kausta, kus fail on loodud. Need l\u00e4henemised on:<\/p>\n<ol>\n<li>Funktsiooni v\u00e4ljakutse <code>fdatasync()<\/code> v\u00f5i <code>fsync()<\/code> p\u00e4rast funktsiooni <code>write()<\/code> (on parem kasutada <code>fdatasync()<\/code>).<\/li>\n<li>Faili descriptoriga t\u00f6\u00f6tamine, mis on avatud lipuga <code>O_DSYNC<\/code> v\u00f5i <code>O_SYNC<\/code> (on parem \u2014 lipuga <code>O_DSYNC<\/code>).<\/li>\n<li>K\u00e4su kasutamine <code>pwritev2()<\/code> lipuga <code>RWF_DSYNC<\/code> v\u00f5i <code>RWF_SYNC<\/code> (on eelistatavam \u2014 lipuga <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>J\u00f5udluse m\u00e4rkmed<\/h2>\n<p>\nMa ei ole p\u00f5hjalikult m\u00f5\u00f5tnud erinevate l\u00e4henemiste j\u00f5udlust, mida olen uurinud. M\u00e4rgatud kiirusvahed on \u00fcsna v\u00e4ikesed. See t\u00e4hendab, et v\u00f5in eksida ja teistes tingimustes v\u00f5ivad samad asjaolud anda teistsuguseid tulemusi. Esiteks r\u00e4\u00e4gin sellest, mis m\u00f5jutab j\u00f5udlust enam, ja seej\u00e4rel sellest, mis m\u00f5jutab j\u00f5udlust v\u00e4hem.<\/p>\n<ol>\n<li>Faili andmete \u00fclekatte t\u00e4itmine on kiirem kui andmete failiga liitmine (j\u00f5udluse kasu v\u00f5ib olla 2-100%). Andmete failiga liitmine n\u00f5uab t\u00e4iendavate muudatuste tegemist faili metaandmetes, isegi p\u00e4rast s\u00fcsteemikutsumist <code>fallocate()<\/code>, kuid selle efekti ulatus v\u00f5ib varieeruda. Soovitan, et parima j\u00f5udluse tagamiseks kutsuda <code>fallocate()<\/code> vajaliku ruumi eelnevalt reserveerimiseks. Seej\u00e4rel tuleb see ruum selgelt nullidega t\u00e4ita ja kutsuda <code>fsync()<\/code>. Nii m\u00e4rgitakse vastavad plokid failis\u00fcsteemis kui 'reserveeritud', mitte kui 'reserveerimata'. See toob kaasa v\u00e4ikese (umbes 2%) j\u00f5udluse paranemise. Lisaks v\u00f5ivad m\u00f5ned kettad esmakordsel plokiga juurdep\u00e4\u00e4sutegemisel t\u00f6\u00f6tada aeglasemalt kui teised. See t\u00e4hendab, et ruumi nullidega t\u00e4itmine v\u00f5ib viia m\u00e4rkimisv\u00e4\u00e4rse (umbes 100%) j\u00f5udluse paranemiseni. Eriti 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 andmed on mitteametlikud, ma ei suutnud neid 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, mis on kinnitatud katsetega). Teised spetsialistid on teinud samasuguseid <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">vaatlusi<\/a><\/noindex>, mis on seotud erinevate ketastega.<\/li>\n<li>Mida v\u00e4hem on s\u00fcsteemikutsungeid, seda k\u00f5rgem on j\u00f5udlus (kasu v\u00f5ib olla umbes 5%). Tundub, et <code>open()<\/code> lipuga <code>O_DSYNC<\/code> v\u00f5i kutse <code>pwritev2()<\/code> lipuga <code>RWF_SYNC<\/code> kiiremini kutse <code>fdatasync()<\/code>. Kahtlen, et asi on selles, et sellise l\u00e4henemise korral on oluline, et sama \u00fclesande lahendamiseks on vaja teha v\u00e4hem s\u00fcsteemik\u00f5nesid (\u00fcks k\u00f5ne kahe asemel). Kuid j\u00f5udluse erinevus on v\u00e4ga v\u00e4ike, seet\u00f5ttu v\u00f5ite selle t\u00e4helepanuta j\u00e4tta ja kasutada rakenduses seda, mis ei too kaasa selle loogika keerukust.<\/li>\n<\/ol>\n<p>\nKui teid huvitab andmete p\u00fcsivuse teema \u2013 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 juurdep\u00e4\u00e4sumeetodid<\/a><\/noindex> \u2013 \u00fclevaade sisendi\/v\u00e4ljaande mehhanismide p\u00f5him\u00f5tetest.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">Kuidas tagada, et andmed j\u00f5uavad kettale<\/a><\/noindex> \u2013 jutt sellest, mis juhtub andmetega teel rakendusest kettale.<\/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 tuleks fsync'da sisaldav kaust<\/a><\/noindex> \u2013 vastus k\u00fcsimusele, millal tuleks rakendada <code>fsync()<\/code> kaustadele. Kui r\u00e4\u00e4kida sellest l\u00fchidalt, siis tuleb seda teha uue faili loomisel, ning soovituse p\u00f5hjus seisneb selles, et Linuxis v\u00f5ib olla palju viiteid \u00fche ja sama faili kohta.<\/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 detailid<\/a><\/noindex> \u2013 siin on toodud kirjeldus selle kohta, kuidas andmete p\u00fcsivust rakendatakse SQL Serveris Linuxi platvormil. Siin on m\u00f5ned huvitavad v\u00f5rdlused Windowsi ja Linuxi s\u00fcsteemik\u00f5nede vahel. Olen peaaegu kindel, et just t\u00e4nu sellele materjalile sain teada FUA optimeerimisest XFS-il.<\/li>\n<\/ul>\n<p>\nKas olete kunagi kaotanud andmeid, mida pidasite usaldusv\u00e4\u00e4rselt 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=\"P\u00fcsiv andmete ja failide API Linux\" 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=\"P\u00fcsiv andmete ja failide API Linux\" 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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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\udd47Andmete p\u00fcsivus ja Linuxi failide API | ProHoster","description":"Uurides andmete p\u00fcsivuse s\u00e4ilitamist pilves\u00fcsteemides, otsustasin end proovile panna, et veenduda, et m\u00f5istan p\u00f5hialuseid.","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.","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":{"focus":[],"additional":[]},"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":"2026-08-11 12:50:05","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}