{"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\/ro\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","title":{"rendered":"Stocare sustenabil\u0103 a datelor \u0219i API-uri de fi\u0219iere Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Eu, explor\u00e2nd rezilien\u021ba stoc\u0103rii datelor \u00een sistemele cloud, am decis s\u0103 m\u0103 testez, s\u0103 m\u0103 asigur c\u0103 \u00een\u021beleg conceptele de baz\u0103. Eu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">am \u00eenceput prin a citi specifica\u021bia NVMe<\/a><\/noindex> pentru a \u00een\u021belege ce garan\u021bii referitoare la stocarea rezistent\u0103 a datelor (adic\u0103 garan\u021bii c\u0103 datele vor fi accesibile dup\u0103 o defec\u021biune a sistemului) ne ofer\u0103 disk-urile NVMe. Am ajuns la urm\u0103toarele concluzii principale: trebuie s\u0103 consideri datele ca fiind corupte din momentul \u00een care a fost dat\u0103 comanda de scriere a datelor \u0219i p\u00e2n\u0103 la momentul \u00een care scrierea lor pe suportul de informa\u021bii este finalizat\u0103. Totu\u0219i, \u00een majoritatea programelor de scriere a datelor, se folosesc \u00een mod lini\u0219tit apeluri la sistem.<\/p>\n<p>\u00cen acest material, explorez mecanismele de stocare rezistent\u0103 a datelor oferite de API-urile de fi\u0219iere Linux. Se pare c\u0103 totul ar trebui s\u0103 fie simplu: programul apeleaz\u0103 comanda <code>write()<\/code>, iar dup\u0103 ce aceast\u0103 comand\u0103 este finalizat\u0103, datele vor fi salvate \u00een siguran\u021b\u0103 pe disk. Dar <code>write()<\/code> doar copiaz\u0103 datele aplica\u021biei \u00een cache-ul nucleului, situat \u00een memoria RAM. Pentru a obliga sistemul s\u0103 scrie datele pe disk, trebuie s\u0103 folose\u0219ti c\u00e2teva mecanisme suplimentare.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\"><img decoding=\"async\" alt=\"Stocare sustenabil\u0103 a datelor \u0219i API-uri de fi\u0219iere Linux\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u00cen general, acest material reprezint\u0103 un set de note referitoare la ceea ce am \u00eenv\u0103\u021bat pe tema care m\u0103 intereseaz\u0103. Dac\u0103 ar fi s\u0103 rezum cel mai important aspect, ar fi c\u0103 pentru a organiza stocarea rezistent\u0103 a datelor, trebuie s\u0103 folose\u0219ti comanda <code>fdatasync()<\/code> sau s\u0103 deschizi fi\u0219iere cu flag-ul <code>O_DSYNC<\/code>. Dac\u0103 e\u0219ti interesat s\u0103 afli \u00een detaliu ce se \u00eent\u00e2mpl\u0103 cu datele pe parcursul drumului de la codul surs\u0103 la disk, arunc\u0103 o privire pe <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">aceast\u0103<\/a><\/noindex> articol.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Particularit\u0103\u021bile folosirii func\u021biei write()<\/h2>\n<p>\nApelul de sistem <code>write()<\/code> sunt definite \u00een standardul <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/POSIX\">IEEE POSIX<\/a><\/noindex> ca o \u00eencercare de a scrie date \u00een descriptorul de fi\u0219ier. Dup\u0103 finalizarea cu succes a <code>write()<\/code> opera\u021biunii, citirile de date ar trebui s\u0103 returneze exact acei bi\u021bi care au fost anterior scri\u0219i, f\u0103c\u00e2nd acest lucru chiar \u0219i \u00een cazul \u00een care datele sunt accesate din alte procese sau fire (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">iat\u0103<\/a><\/noindex> sec\u021biunea corespunz\u0103toare din standardul POSIX). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">Aici<\/a><\/noindex>, \u00een sec\u021biunea dedicat\u0103 interac\u021biunii \u00eentre fire \u0219i opera\u021biile standard cu fi\u0219iere, exist\u0103 o not\u0103 care men\u021bioneaz\u0103 c\u0103, dac\u0103 fiecare dintre cele dou\u0103 fire apeleaz\u0103 aceste func\u021bii, fiecare apel trebuie s\u0103 observe fie toate efectele specificate generate de executarea celuilalt apel, fie s\u0103 nu observe niciun efect. Aceasta permite concluzionarea c\u0103 toate opera\u021biile de intrare\/ie\u0219ire cu fi\u0219iere trebuie s\u0103 blocheze resursa cu care lucreaz\u0103.<\/p>\n<p>\u00censeamn\u0103 asta c\u0103 opera\u021bia <code>write()<\/code> este atomic\u0103? Din punct de vedere tehnic \u2013 da. Opera\u021biile de citire a datelor trebuie s\u0103 returneze fie tot, fie nimic din ceea ce a fost scris prin <code>write()<\/code>. Dar opera\u021bia <code>write()<\/code>, conform standardului, nu trebuie neap\u0103rat s\u0103 se finalizeze scriind tot ceea ce i-a fost propus s\u0103 scrie. Are voie s\u0103 realizeze scrierea doar a unei p\u0103r\u021bi din date. De exemplu, putem avea dou\u0103 fire, fiecare dintre ele ad\u0103ug\u00e2nd 1024 de octe\u021bi la un fi\u0219ier descris de acela\u0219i descriptor de fi\u0219ier. Din perspectiva standardului, un rezultat acceptabil ar fi ca fiecare dintre opera\u021biile de scriere s\u0103 poat\u0103 ad\u0103uga \u00een fi\u0219ier doar c\u00e2te un octet. Aceste opera\u021bii vor r\u0103m\u00e2ne atomice, dar, dup\u0103 ce se finalizeaz\u0103, datele scrise de ele \u00een fi\u0219ier vor fi amestecate. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">Iat\u0103<\/a><\/noindex> o discu\u021bie foarte interesant\u0103 pe acest subiect pe Stack Overflow.<\/p>\n<h2>Func\u021biile fsync() \u0219i fdatasync()<\/h2>\n<p>\nCel mai simplu mod de a trimite datele pe disc este prin apelarea func\u021biei <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fsync.2.html\">fsync()<\/a><\/noindex>. Aceast\u0103 func\u021bie solicit\u0103 sistemului de operare transferul tuturor blocurilor modificate din cache pe disc. Acesta include \u0219i toate metadatele fi\u0219ierului (timpul de acces, timpul de modificare a fi\u0219ierului etc.). Cred c\u0103 necesitatea acestor metadate apare rar, a\u0219a c\u0103, dac\u0103 \u0219ti\u021bi c\u0103 nu sunt importante pentru dumneavoastr\u0103, pute\u021bi utiliza func\u021bia <code>fdatasync()<\/code>. \u00cen <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">documenta\u021biei<\/a><\/noindex> pe <code>fdatasync()<\/code> se men\u021bioneaz\u0103 c\u0103, \u00een cadrul acestei func\u021bii, se realizeaz\u0103 salvarea pe disc a unui volum de metadate \u201enecesare pentru execu\u021bia corect\u0103 a urm\u0103toarelor opera\u021bii de citire a datelor\u201d. Iar acest lucru este exact ceea ce \u00eengrijoreaz\u0103 cea mai mare parte a aplica\u021biilor.<\/p>\n<p>O problem\u0103 care poate ap\u0103rea aici este c\u0103 aceste mecanisme nu garanteaz\u0103 c\u0103 fi\u0219ierul va putea fi g\u0103sit dup\u0103 o posibil\u0103 defec\u021biune. \u00cen special, c\u00e2nd se creeaz\u0103 un fi\u0219ier nou, trebuie apelat <code>fsync()<\/code> pentru directorul care \u00eel con\u021bine. Altminteri, dup\u0103 o defectare, se poate \u00eent\u00e2mpla ca acest fi\u0219ier s\u0103 nu existe. Cauza acestui lucru este c\u0103, \u00een UNIX, din cauza utiliz\u0103rii leg\u0103turilor dure, fi\u0219ierul poate exista \u00een mai multe directoare. De aceea, la apel <code>fsync()<\/code> pentru fi\u0219ier nu exist\u0103 nicio modalitate de a \u0219ti care anume director trebuie s\u0103 fie, de asemenea, scris pe disc (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">aici<\/a><\/noindex> despre acest lucru se poate citi mai \u00een detaliu). Se pare c\u0103 sistemul de fi\u0219iere ext4 este capabil <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">automat<\/a><\/noindex> aplicarea <code>fsync()<\/code> pentru directoarele care con\u021bin fi\u0219ierele corespunz\u0103toare, dar \u00een cazul altor sisteme de fi\u0219iere, acest lucru poate s\u0103 nu fie adev\u0103rat.<\/p>\n<p>Acest mecanism poate fi implementat diferit \u00een diverse sisteme de fi\u0219iere. Eu am folosit <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace<\/a><\/noindex> pentru a afla despre ce opera\u021bii de disc sunt utilizate \u00een sistemele de fi\u0219iere ext4 \u0219i XFS. Ambele emit comenzi obi\u0219nuite de scriere pe disc, at\u00e2t pentru con\u021binutul fi\u0219ierelor, c\u00e2t \u0219i pentru jurnalul sistemului de fi\u0219iere, scriu \u00een cache \u0219i finalizeaz\u0103 sarcina, efectu\u00e2nd o scriere FUA (Force Unit Access, scrierea datelor direct pe disc, ocolind cache-ul) \u00een jurnal. Probabil, ele procedeaz\u0103 astfel pentru a confirma desf\u0103\u0219urarea opera\u021biei. Pe discurile care nu suport\u0103 FUA, acest lucru cauzeaz\u0103 dou\u0103 scrieri \u00een cache. Experimentele mele au ar\u0103tat c\u0103 <code>fdatasync()<\/code> este pu\u021bin mai rapid <code>fsync()<\/code>. Utilitar\u0103 <code>blktrace<\/code> indic\u0103 faptul c\u0103 <code>fdatasync()<\/code> de obicei scrie pe disc mai pu\u021bini date (\u00een ext4 <code>fsync()<\/code> scrie 20 KiB, iar <code>fdatasync()<\/code> \u2014 16 KiB). \u00cen plus, am descoperit c\u0103 XFS este pu\u021bin mai rapid dec\u00e2t ext4. \u0218i aici, cu ajutorul <code>blktrace<\/code> am reu\u0219it s\u0103 aflu c\u0103 <code>fdatasync()<\/code> scrie pe disc mai pu\u021bini date (4 KiB \u00een XFS).<\/p>\n<h2>Situa\u021bii neclare care apar \u00een utilizarea fsync()<\/h2>\n<p>\n\u00cemi pot aminti trei situa\u021bii neclare care se refer\u0103 la <code>fsync()<\/code>, cu care m-am confruntat \u00een practic\u0103.<\/p>\n<p>Prima astfel de situa\u021bie a avut loc \u00een 2008. Atunci, interfa\u021ba Firefox 3 \u201ese bloca\u201d atunci c\u00e2nd se efectua scrierea pe disc a unui num\u0103r mare de fi\u0219iere. Problema era c\u0103, \u00een implementarea interfe\u021bei pentru stocarea informa\u021biilor despre starea sa, era utilizat\u0103 o baz\u0103 de date SQLite. Dup\u0103 fiecare modificare care avea loc \u00een interfa\u021b\u0103, era apelat\u0103 func\u021bia <code>fsync()<\/code>, ceea ce oferea bune garan\u021bii de stocare durabil\u0103 a datelor. \u00cen sistemul de fi\u0219iere utilizat atunci, ext3, func\u021bia <code>fsync()<\/code> a resetat pe disc toate paginile \u201emurdare\u201d din sistem, nu doar pe cele care aveau leg\u0103tur\u0103 cu fi\u0219ierul respectiv. Aceasta \u00eensemna c\u0103 un clic pe buton \u00een Firefox putea ini\u021bia scrierea de megabytes de date pe discul magnetic, ceea ce putea dura multe secunde. Solu\u021bia problemei, a\u0219a cum am \u00een\u021beles din <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">aceasta<\/a><\/noindex> material, consta \u00een mutarea lucrului cu baza de date \u00een sarcini de fundal asincrone. Aceasta \u00eenseamn\u0103 c\u0103 anterior, \u00een Firefox, au fost implementate cerin\u021be mai stricte pentru fiabilitatea stoc\u0103rii datelor dec\u00e2t era cu adev\u0103rat necesar, iar caracteristicile sistemului de fi\u0219iere ext3 au agravat aceast\u0103 problem\u0103.<\/p>\n<p>A doua neconcordan\u021b\u0103 a avut loc \u00een 2009. Atunci, dup\u0103 o defec\u021biune a sistemului, utilizatorii noului sistem de fi\u0219iere ext4 s-au confruntat cu faptul c\u0103 multe fi\u0219iere recent create au o lungime zero, \u00een timp ce cu sistemul de fi\u0219iere mai vechi ext3 acest lucru nu s-a \u00eent\u00e2mplat. \u00cen paragraful anterior am men\u021bionat c\u0103 ext3 reseta prea multe date pe disc, ceea ce \u00eencetinea semnificativ func\u021bionarea <code>fsync()<\/code>. Pentru a \u00eembun\u0103t\u0103\u021bi situa\u021bia, \u00een ext4 sunt resetate pe disc doar paginile \u201emurdare\u201d care au leg\u0103tur\u0103 cu un anumit fi\u0219ier. Iar datele altor fi\u0219iere r\u0103m\u00e2n \u00een memorie pentru o perioad\u0103 mult mai lung\u0103 dec\u00e2t \u00een cazul utiliz\u0103rii ext3. Acest lucru a fost realizat pentru a \u00eembun\u0103t\u0103\u021bi performan\u021ba (implicit, datele r\u0103m\u00e2n \u00een aceast\u0103 stare 30 de secunde, iar aceast\u0103 setare poate fi ajustat\u0103 prin <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\">aici<\/a><\/noindex> , unde se pot g\u0103si materiale suplimentare despre aceasta). Acest lucru \u00eenseamn\u0103 c\u0103 un volum mare de date poate fi pierdut iremediabil dup\u0103 o defec\u021biune. Solu\u021bia acestei probleme const\u0103 \u00een utilizarea <code>fsync()<\/code> \u00een aplica\u021biile care trebuie s\u0103 asigure stocarea fiabil\u0103 a datelor \u0219i s\u0103 le protejeze c\u00e2t mai mult posibil de efectele defec\u021biunilor. Func\u021bia <code>fsync()<\/code> func\u021bioneaz\u0103 mult mai eficient atunci c\u00e2nd se utilizeaz\u0103 ext4 dec\u00e2t atunci c\u00e2nd se utilizeaz\u0103 ext3. Dezavantajul acestei abord\u0103ri este c\u0103 utilizarea sa, ca \u0219i \u00eenainte, \u00eencetine\u0219te executarea anumitor opera\u021biuni, cum ar fi instalarea programelor. Detalii despre aceasta pot fi g\u0103site <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">aici<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">aici<\/a><\/noindex>.<\/p>\n<p>A treia problem\u0103, legat\u0103 de <code>fsync()<\/code>, a ap\u0103rut \u00een 2018. Atunci, \u00een cadrul proiectului PostgreSQL, s-a descoperit c\u0103, dac\u0103 func\u021bia <code>fsync()<\/code> se confrunt\u0103 cu o eroare, ea marcheaz\u0103 paginile \u201emurdare\u201d ca fiind \u201ecurate\u201d. Drept rezultat, apelurile urm\u0103toare <code>fsync()<\/code> nu se face nimic cu asemenea pagini. Din acest motiv, paginile modificate sunt stocate \u00een memorie \u0219i nu sunt niciodat\u0103 scrise pe disc. Aceasta este o adev\u0103rat\u0103 catastrof\u0103, deoarece aplica\u021bia va crede c\u0103 anumite date sunt scrise pe disc, c\u00e2nd, de fapt, acestea nu sunt. Astfel de erori <code>fsync()<\/code> apar rar, aplica\u021bia \u00een aceste situa\u021bii aproape c\u0103 nu poate face nimic pentru a lupta \u00eempotriva problemei. \u00cen zilele noastre, c\u00e2nd se \u00eent\u00e2mpl\u0103 acest lucru, PostgreSQL \u0219i alte aplica\u021bii se opresc brusc. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">Aici<\/a><\/noindex>, \u00een materialul \u201ePot aplica\u021biile s\u0103 recupereze de la erorile fsync?\u201d, aceast\u0103 problem\u0103 este investigat\u0103 \u00een toate detaliile. \u00cen prezent, cea mai bun\u0103 solu\u021bie pentru aceast\u0103 problem\u0103 este utilizarea Direct I\/O cu flagul <code>O_SYNC<\/code> sau cu flagul <code>O_DSYNC<\/code>. Prin aceast\u0103 abordare, sistemul va raporta erorile care pot ap\u0103rea \u00een timpul execut\u0103rii unor opera\u021biuni specifice de scriere a datelor, dar aceast\u0103 abordare necesit\u0103 ca aplica\u021bia s\u0103 gestioneze singur\u0103 bufferele. Detaliile despre aceasta pot fi citite <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">aici<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">aici<\/a><\/noindex>.<\/p>\n<h2>Deschiderea fi\u0219ierelor folosind flagurile O_SYNC \u0219i O_DSYNC<\/h2>\n<p>\nS\u0103 revenim la discu\u021bia despre mecanismele Linux care asigur\u0103 stocarea durabil\u0103 a datelor. Anume, este vorba despre utilizarea flagului <code>O_SYNC<\/code> sau flagului <code>O_DSYNC<\/code> la deschiderea fi\u0219ierelor folosind apelul de sistem <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open()<\/a><\/noindex>. Prin aceast\u0103 abordare, fiecare opera\u021biune de scriere a datelor se efectueaz\u0103 de parc\u0103 dup\u0103 fiecare comand\u0103 <code>write()<\/code> sistemului i se dau, respectiv, comenzi <code>fsync()<\/code> \u0219i <code>fdatasync()<\/code>. \u00cen <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">specifica\u021biilor POSIX<\/a><\/noindex> aceasta se nume\u0219te \u201eFinalizarea integrit\u0103\u021bii fi\u0219ierelor I\/O sincronizate\u201d \u0219i \u201eFinalizarea integrit\u0103\u021bii datelor\u201d. Principalul avantaj al acestei abord\u0103ri este c\u0103 pentru a asigura integritatea datelor trebuie efectuat un singur apel de sistem, nu dou\u0103 (de exemplu \u2014 <code>write()<\/code> \u0219i <code>fdatasync()<\/code>). Principalul dezavantaj al acestei abord\u0103ri este c\u0103 toate opera\u021biunile de scriere care folosesc descriptorul de fi\u0219ier corespunz\u0103tor vor fi sincronizate, ceea ce poate limita oportunit\u0103\u021bile de structurare a codului aplica\u021biei.<\/p>\n<h2>Utilizarea Direct I\/O cu flagul O_DIRECT<\/h2>\n<p>\nApelul de sistem <code>open()<\/code> sprijin\u0103 flagul <code>O_DIRECT<\/code>, care este destinat s\u0103 efectueze opera\u021biuni de intrare-ie\u0219ire, interac\u021bion\u00e2nd direct cu discul, ocolind cache-ul sistemului de operare. Aceasta, \u00een multe cazuri, \u00eenseamn\u0103 c\u0103 comenzile de scriere emise de program vor fi transmise direct drept comenzi care lucreaz\u0103 cu discul. Dar, \u00een general, acest mecanism nu este un \u00eenlocuitor pentru func\u021biile <code>fsync()<\/code> sau <code>fdatasync()<\/code>. Problema este c\u0103 discul \u00eensu\u0219i poate <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">am\u00e2na sau cache-ul<\/a><\/noindex> comenzile corespunz\u0103toare pentru \u00eenregistrarea datelor. \u0218i, ceea ce este \u0219i mai r\u0103u, \u00een anumite cazuri speciale, opera\u021biile de intrare-ie\u0219ire efectuate cu utilizarea flagului <code>O_DIRECT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">sunt transmise<\/a><\/noindex> \u00een opera\u021bii tradi\u021bionale cu buffer. Cea mai simpl\u0103 solu\u021bie pentru aceast\u0103 problem\u0103 este s\u0103 folosi\u021bi un flag <code>O_DSYNC<\/code>, ceea ce va \u00eensemna c\u0103 pentru fiecare opera\u021bie de \u00eenregistrare va exista un apel <code>fdatasync()<\/code>.<\/p>\n<p>Se pare c\u0103 \u00een sistemul de fi\u0219iere XFS a fost recent ad\u0103ugat un \u201edrum rapid\u201d pentru <code>O_DIRECT|O_DSYNC<\/code>-\u00eenregistrarea datelor. Dac\u0103 se suprascrie un bloc utiliz\u00e2nd <code>O_DIRECT|O_DSYNC<\/code>, atunci XFS, \u00een loc s\u0103 cur\u0103\u021be cache-ul, va efectua comanda de \u00eenregistrare FUA, \u00een cazul \u00een care dispozitivul o suport\u0103. M-am convins de acest lucru folosind utilitarul <code>blktrace<\/code> \u00een sistemul Linux 5.4\/Ubuntu 20.04. Aceast\u0103 abordare ar trebui s\u0103 fie mai eficient\u0103, deoarece folose\u0219te o cantitate minim\u0103 de date scris\u0103 pe disc \u0219i aplic\u0103 o singur\u0103 opera\u021bie, nu dou\u0103 (\u00eenregistrare \u0219i cur\u0103\u021bare cache). Am g\u0103sit un link la <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">patch<\/a><\/noindex> nucleul anului 2018, \u00een care este implementat acest mecanism. Exist\u0103 o discu\u021bie despre aplicarea acestei optimiz\u0103ri \u0219i \u00een alte sisteme de fi\u0219iere, dar, din c\u00e2te \u0219tiu eu, XFS este singurul sistem de fi\u0219iere care suport\u0103 asta p\u00e2n\u0103 acum.<\/p>\n<h2>Func\u021bia sync_file_range()<\/h2>\n<p>\n\u00cen Linux exist\u0103 un apel de sistem <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sync_file_range.2.html\">sync_file_range()<\/a><\/noindex>, care permite cur\u0103\u021barea pe disc doar a unei p\u0103r\u021bi din fi\u0219ier, nu a \u00eentregului fi\u0219ier. Acest apel ini\u021biaz\u0103 o cur\u0103\u021bare asynchronic\u0103 a datelor \u0219i nu a\u0219teapt\u0103 finalizarea acesteia. Dar \u00een documenta\u021bia <code>sync_file_range()<\/code> se spune c\u0103 aceast\u0103 comand\u0103 este \u201efoarte periculoas\u0103\u201d. Nu este recomandat s\u0103 fie folosit\u0103. Caracteristicile \u0219i pericolele <code>sync_file_range()<\/code> sunt foarte bine descrise \u00een <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2014\/03\/how-syncfilerange-really-works.html\">aceasta<\/a><\/noindex> material. \u00cen special, se pare c\u0103 acest apel folose\u0219te RocksDB pentru a gestiona momentul \u00een care nucleul cur\u0103\u021b\u0103 datele \u201emurdare\u201d pe disc. Dar, \u00een acela\u0219i timp, din nou, pentru a asigura stocarea robust\u0103 a datelor, se folose\u0219te \u0219i <code>fdatasync()<\/code>. \u00cen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/rocksdb\/search?q=sync_file_range\">cod<\/a><\/noindex> RocksDB are comentarii interesante pe aceast\u0103 tem\u0103. De exemplu, se pare c\u0103 apelul <code>sync_file_range()<\/code> atunci c\u00e2nd este utilizat cu ZFS nu duce la cur\u0103\u021barea datelor pe disc. Experien\u021ba \u00eemi spune c\u0103 codul care este folosit rar, poate con\u021bine erori. De aceea, a\u0219 recomanda s\u0103 nu se foloseasc\u0103 acest apel de sistem f\u0103r\u0103 necesitate extrem\u0103.<\/p>\n<h2>Apelurile de sistem care ajut\u0103 la asigurarea stoc\u0103rii robuste a datelor<\/h2>\n<p>\nAm ajuns la concluzia c\u0103 pentru efectuarea opera\u021biunilor de intrare\/ie\u0219ire care asigur\u0103 stocarea persistent\u0103 a datelor, se pot folosi trei abord\u0103ri. Toate necesit\u0103 apelarea func\u021biei <code>fsync()<\/code> pentru directorul \u00een care a fost creat fi\u0219ierul. Iat\u0103 aceste abord\u0103ri:<\/p>\n<ol>\n<li>Apelarea func\u021biei <code>fdatasync()<\/code> sau <code>fsync()<\/code> dup\u0103 func\u021bie <code>write()<\/code> (este recomandat s\u0103 folosi\u021bi <code>fdatasync()<\/code>).<\/li>\n<li>Lucrul cu un descriptor de fi\u0219ier deschis cu firul <code>O_DSYNC<\/code> sau <code>O_SYNC<\/code> (este recomandat \u2013 cu firul <code>O_DSYNC<\/code>).<\/li>\n<li>Utilizarea comenzii <code>pwritev2()<\/code> cu flag-ul <code>RWF_DSYNC<\/code> sau <code>RWF_SYNC<\/code> (preferabil \u2013 cu firul <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>Note despre performan\u021b\u0103<\/h2>\n<p>\nNu m-am ocupat de m\u0103surarea detaliat\u0103 a performan\u021bei diverselor mecanisme investigate de mine. Diferen\u021bele observate \u00een viteza lor de operare sunt destul de mici. Acest lucru \u00eenseamn\u0103 c\u0103 a\u0219 putea gre\u0219i, iar \u00een alte condi\u021bii acela\u0219i lucru poate ar\u0103ta alte rezultate. Mai \u00eent\u00e2i voi vorbi despre ceea ce influen\u021beaz\u0103 mai mult performan\u021ba, apoi despre ceea ce influen\u021beaz\u0103 mai pu\u021bin performan\u021ba.<\/p>\n<ol>\n<li>Rescrierea datelor din fi\u0219ier este mai rapid\u0103 dec\u00e2t ad\u0103ugarea de date la fi\u0219ier (c\u00e2\u0219tigul de performan\u021b\u0103 poate varia \u00eentre 2-100%). Ad\u0103ugarea de date la fi\u0219ier necesit\u00e2nd modific\u0103ri suplimentare \u00een metadatele fi\u0219ierului, chiar \u0219i dup\u0103 apelul de sistem <code>fallocate()<\/code>, dar amploarea acestui efect poate varia. Recomand, pentru a asigura cea mai bun\u0103 performan\u021b\u0103, s\u0103 apela\u021bi <code>fallocate()<\/code> pentru alocarea anticipat\u0103 a spa\u021biului necesar. Apoi, acest spa\u021biu trebuie umplut explicit cu zerouri \u0219i apelat <code>fsync()<\/code>. Datorit\u0103 acestui lucru, blocurile corespunz\u0103toare din sistemul de fi\u0219iere vor fi etichetate ca \u201ealocate\u201d, \u0219i nu ca \u201enealocate\u201d. Aceasta ofer\u0103 o mic\u0103 (aproximativ 2%) \u00eembun\u0103t\u0103\u021bire a performan\u021bei. \u00cen plus, la unele discuri, prima opera\u021biune de acces la un bloc poate fi mai lent\u0103 dec\u00e2t altele. Aceasta \u00eenseamn\u0103 c\u0103 umplerea spa\u021biului cu zerouri poate duce la o \u00eembun\u0103t\u0103\u021bire semnificativ\u0103 (aproximativ 100%) a performan\u021bei. \u00cen special, acest lucru poate ap\u0103rea cu discurile <noindex><a rel=\"nofollow\" href=\"https:\/\/n2ws.com\/blog\/how-to-guides\/pre-warm-ebs-volumes-on-aws\">AWS EBS<\/a><\/noindex> (acestea sunt date neoficiale, nu am reu\u0219it s\u0103 le confirm). Acela\u0219i lucru se aplic\u0103 \u0219i stoc\u0103rilor <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/benchmarking-pd-performance\">GCP Persistent Disk<\/a><\/noindex> (\u0219i aceasta este deja o informa\u021bie oficial\u0103, confirmat\u0103 prin teste). Al\u021bi speciali\u0219ti au f\u0103cut observa\u021bii similare <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">, referitoare la diverse discuri.<\/a><\/noindex>Cu c\u00e2t sunt mai pu\u021bine apeluri de sistem - cu at\u00e2t mai mare este performan\u021ba (c\u00e2\u0219tigul poate fi de aproximativ 5%). Se pare c\u0103 apelul<\/li>\n<li>sau apelul <code>open()<\/code> cu flag-ul <code>O_DSYNC<\/code> este mai rapid dec\u00e2t apelul <code>pwritev2()<\/code> cu flag-ul <code>RWF_SYNC<\/code> mai rapid dec\u00e2t apelul <code>fdatasync()<\/code>Suspectez c\u0103 aceasta este legat\u0103 de faptul c\u0103, prin aceast\u0103 abordare, rolul \u00eel joac\u0103 faptul c\u0103 pentru a rezolva aceea\u0219i problem\u0103 este nevoie de mai pu\u021bine apeluri de sistem (o singur\u0103 apelare \u00een loc de dou\u0103). Dar diferen\u021ba de performan\u021b\u0103 este foarte mic\u0103, a\u0219a c\u0103 pute\u021bi s\u0103 nu \u00eei acorda\u021bi aten\u021bie \u0219i s\u0103 folosi\u021bi \u00een aplica\u021bie ceea ce nu va duce la complicarea logicii acesteia.<\/li>\n<\/ol>\n<p>\nDac\u0103 sunte\u021bi interesat de tema stoc\u0103rii durabile a datelor, iat\u0103 c\u00e2teva materiale utile:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.scylladb.com\/2017\/10\/05\/io-access-methods-scylla\/\">Metode de acces I\/O<\/a><\/noindex> \u2014 o privire de ansamblu asupra principiilor de func\u021bionare ale mecanismelor de intrare\/ie\u0219ire.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">Asigurarea c\u0103 datele ajung pe disc<\/a><\/noindex> \u2014 o poveste despre ce se \u00eent\u00e2mpl\u0103 cu datele pe drumul de la aplica\u021bie la disc.<\/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\">C\u00e2nd ar trebui s\u0103 folosi\u021bi fsync pentru directorul con\u021bin\u0103tor<\/a><\/noindex> \u2014 un r\u0103spuns la \u00eentrebarea despre c\u00e2nd ar trebui s\u0103 aplica\u021bi <code>fsync()<\/code> pentru directoare. Pe scurt, aceasta trebuie f\u0103cut\u0103 atunci c\u00e2nd crea\u021bi un nou fi\u0219ier, iar motivul acestei recomand\u0103ri este c\u0103 \u00een Linux pot exista multe linkuri c\u0103tre acela\u0219i fi\u0219ier.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/bobsql.com\/sql-server-on-linux-forced-unit-access-fua-internals\/\">SQL Server pe Linux: Internals FUA<\/a><\/noindex> \u2014 aici este descris modul \u00een care stocarea durabil\u0103 a datelor este implementat\u0103 \u00een SQL Server pe platforma Linux. Exist\u0103 c\u00e2teva compara\u021bii interesante \u00eentre apelurile de sistem Windows \u0219i Linux. Sunt aproape sigur c\u0103 datorit\u0103 acestui material am aflat despre optimizarea FUA XFS.<\/li>\n<\/ul>\n<p>\nA\u021bi pierdut vreodat\u0103 date pe care le considera\u021bi stocate \u00een siguran\u021b\u0103 pe disc?<\/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=\"Stocare sustenabil\u0103 a datelor \u0219i API-uri de fi\u0219iere 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=\"Stocare sustenabil\u0103 a datelor \u0219i API-uri de fi\u0219iere Linux\" src=\"\/wp-content\/uploads\/2020\/10\/d9fd0b1c09eb6e40944aee2d13ee4088.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Stocarea durabil\u0103 a datelor \u0219i API-urile de fi\u0219iere Linux | ProHoster","description":"Eu, cercet\u00e2nd rezilien\u021ba stoc\u0103rii datelor \u00een sistemele cloud, am decis s\u0103 m\u0103 testez, s\u0103 m\u0103 asigur c\u0103 \u00een\u021beleg conceptele de baz\u0103.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/98090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=98090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/98090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/98091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=98090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=98090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=98090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}