{"id":74327,"date":"2020-03-16T08:42:33","date_gmt":"2020-03-16T05:42:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund"},"modified":"2020-03-16T08:42:33","modified_gmt":"2020-03-16T05:42:33","slug":"tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","title":{"rendered":"Cienkie rezerwowanie system\u00f3w plik\u00f3w Linux. Jak tworzy\u0107 kopie zapasowe trzech terabajt\u00f3w bazy danych MySQL w 20 sekund","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Cienkie rezerwowanie system\u00f3w plik\u00f3w Linux. Jak tworzy\u0107 kopie zapasowe trzech terabajt\u00f3w bazy danych MySQL w 20 sekund\" src=\"\/wp-content\/uploads\/2020\/03\/7502785a78bd6f069913e97829ff2f63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nazywam si\u0119 Jurij, jestem kierownikiem grupy administracji system\u00f3w w Sitimobil. Dzi\u015b podziel\u0119 si\u0119 do\u015bwiadczeniem pracy z technologi\u0105 thin provisioning system\u00f3w plik\u00f3w Linux i opowiem, jak mo\u017cna j\u0105 zastosowa\u0107 w technologicznych procesach CI\/CD w firmie. Rozwa\u017cymy sytuacj\u0119, w kt\u00f3rej podczas automatycznego testowania kodu przy wdra\u017caniu go do produkcji potrzebne nam s\u0105 jak najszybsze kopie bazy danych MySQL, maksymalnie zbli\u017cone do wersji \"produkcyjnej\", dost\u0119pne do odczytu i zapisu.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie-zachem-davat-vrednye-sovety\">Wprowadzenie: dlaczego dawa\u0107 szkodliwe rady?<\/h3>\n<p><\/p>\n<p>Logiczne pytanie, bo s\u0105 opracowane mechanizmy migracji schemat\u00f3w baz danych do \u015brodowisk testowych. Po co w og\u00f3le doprowadza\u0107 g\u0142\u00f3wn\u0105, niepodzielon\u0105 baz\u0119 danych do takich rozmiar\u00f3w? A poza tym, do testowania potrzebne s\u0105 nie wszystkie dane. Postaram si\u0119 wyja\u015bni\u0107.<\/p>\n<p><\/p>\n<p>Oko\u0142o rok temu, w obliczu aktywnego wzrostu naszego agregatora taks\u00f3wek (w 2018 roku liczba zako\u0144czonych kurs\u00f3w wzros\u0142a oko\u0142o 15 razy), zwi\u0119kszy\u0142y si\u0119 ilo\u015bci danych, obci\u0105\u017cenie serwer\u00f3w i cz\u0119stotliwo\u015b\u0107 wdro\u017ce\u0144. Znale\u017ali\u015bmy si\u0119 w nast\u0119puj\u0105cej sytuacji:<\/p>\n<p><\/p>\n<ul>\n<li>G\u0142\u00f3wna baza danych MySQL wzros\u0142a do oko\u0142o 1000 tabel o \u0142\u0105cznej pojemno\u015bci 2,5 TB i nadal ros\u0142a.<\/li>\n<li>Nie by\u0142o mo\u017cliwo\u015bci szybkiego podzia\u0142u bazy danych na shard'y. Stary spos\u00f3b \"pisz\u0119 do bazy, co chc\u0119 i jak chc\u0119\", mn\u00f3stwo JOIN'\u00f3w i wewn\u0119trznych zale\u017cno\u015bci tabel utrudnia\u0142 to.<\/li>\n<li>Nie by\u0142o mechanizmu migracji schematu bazy danych do testowych \u015brodowisk.<\/li>\n<li>Nie by\u0142o automatycznego testowania kodu przy wdro\u017ceniu do u\u017cytku.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ostatni problem chcia\u0142em rozwi\u0105za\u0107 jak najszybciej. Zosta\u0142y ju\u017c napisane testy Postman do sprawdzania g\u0142\u00f3wnego monolitu PHP, ale brakowa\u0142o aktualnej bazy danych. Nie mogli\u015bmy tworzy\u0107 replik w nocy, przekszta\u0142ca\u0107 ich w g\u0142\u00f3wn\u0105 i oddawa\u0107 na dyspozycj\u0119 w ci\u0105gu dnia: bardzo du\u017ca liczba wdro\u017ce\u0144 i zmian, zar\u00f3wno w danych, jak i w schemacie bazy danych, uczyni\u0142aby \u015brodowisko niezdolnym do u\u017cytku ju\u017c w po\u0142owie dnia. Ograniczanie wdro\u017ce\u0144 tylko do dni roboczych by\u0142oby r\u00f3wnie\u017c nieefektywne. <\/p>\n<p><\/p>\n<p>Mimo to, zadanie zosta\u0142o wykonane: pierwszy dzia\u0142aj\u0105cy stand mieli\u015bmy ju\u017c po dw\u00f3ch tygodniach. W minionym roku przeszed\u0142 wiele zmian i nadal jest u\u017cywany.<\/p>\n<p><\/p>\n<p>Nast\u0119pnie szczeg\u00f3\u0142owo opisz\u0119 wszystkie kroki i etapy rozwoju naszego rozwi\u0105zania. Upewnicie si\u0119, \u017ce ta metoda zas\u0142uguje na prawo do istnienia.<\/p>\n<p><\/p>\n<p><strong>Czym jest \u201ethin provisioning\u201d?<\/strong><br \/>\nTo jest technologia sprz\u0119towa lub programowa (znana r\u00f3wnie\u017c jako wolumeny sparse), kt\u00f3ra pozwala przypisywa\u0107 wi\u0119ksz\u0105 ilo\u015b\u0107 wymaganego zasobu, ni\u017c jest dost\u0119pne. Przypisany wolumen musi spe\u0142nia\u0107 kryteria just-enough (tyle, ile potrzeba) i just-in-time (w odpowiednim czasie). W g\u0142\u00f3wnej mierze cienkie rezerwowanie stosowane jest w r\u00f3\u017cnych macierzach dyskowych, aby zapewni\u0107 przestrze\u0144 dyskow\u0105 w wymaganych ilo\u015bciach, przekraczaj\u0105cych rzeczywi\u015bcie dost\u0119pne. Technologia ta jest wspierana przez r\u00f3\u017cne systemy plik\u00f3w, takie jak LVM2, ZFS, BTRFS. Jest szeroko stosowana w hipernadzorcach wirtualizacji. Dzi\u0119ki cienkiemu rezerwowaniu mogli\u015bmy szybko utworzy\u0107 z migawkach g\u0142\u00f3wnej partycji z danymi tyle kopii tej partycji, ile potrzebowali\u015bmy (katalog data systemu baz danych MySQL).<\/p>\n<p><\/p>\n<h3 id=\"pervyy-stend-tehnologiya-thin-lvm\">Pierwsze stanowisko, technologia Thin LVM<\/h3>\n<p><\/p>\n<p>Rozdzia\u0142 ten mo\u017cna r\u00f3wnie\u017c nazwa\u0107 \"Jak stworzy\u0107 maksymalnie szybkie migawki du\u017cej ilo\u015bci danych za pomoc\u0105 <noindex><a rel=\"nofollow\" href=\"http:\/\/man7.org\/linux\/man-pages\/man7\/lvmthin.7.html\">Thin LVM<\/a><\/noindex>, zmniejszaj\u0105c stabilno\u015b\u0107 systemu plik\u00f3w i bazy danych MySQL do niedopuszczalnych poziom\u00f3w.\" <\/p>\n<p><\/p>\n<p>Poniewa\u017c ju\u017c wykorzystali\u015bmy LVM do budowy g\u0142\u00f3wnych partycji systemu operacyjnego, postanowili\u015bmy zacz\u0105\u0107 od niej. Na pocz\u0105tek potrzebowali\u015bmy oddzielnej fizycznej maszyny \u2014 repliki naszej g\u0142\u00f3wnej bazy MySQL, na kt\u00f3rej mogliby\u015bmy na \u017c\u0105danie tworzy\u0107 migawk\u0119 repliki i uruchamia\u0107 j\u0105 obok jako oddzielny egzemplarz MySQL. W czasie test\u00f3w pozwolili\u015bmy na stosowanie operacji modyfikuj\u0105cych, a po zako\u0144czeniu test\u00f3w j\u0105 usuwali\u015bmy. Konfiguracja serwera by\u0142a nast\u0119puj\u0105ca:<\/p>\n<p><\/p>\n<ul>\n<li>2 x Intel Silver 4114 (10&#215;2,2 GHz HT)<\/li>\n<li>8 x 32 GB DDR4 <\/li>\n<li>8 x 1920 GB Intel SSD w kontrolerze RAID Adaptec w RAID-10<\/li>\n<\/ul>\n<p><\/p>\n<p>Temat wyboru mi\u0119dzy kontrolerem RAID a programowym RAID MD m\u00f3g\u0142by by\u0107 osobnym artyku\u0142em. Powiem tylko, \u017ce na nasz wyb\u00f3r wp\u0142yn\u0119\u0142y dwa czynniki:<\/p>\n<p><\/p>\n<ul>\n<li>W czasach stawiania zadania wszystkie bazy danych instalowali\u015bmy na kontrolerach RAID, wi\u0119c mo\u017cna powiedzie\u0107, \u017ce tak si\u0119 to u\u0142o\u017cy\u0142o historycznie. <\/li>\n<li>R\u00f3\u017cnica w wydajno\u015bci w syntetycznych testach systemu plik\u00f3w oraz testach z r\u00f3\u017cnymi operacjami w MySQL by\u0142a minimalna. <\/li>\n<\/ul>\n<p><\/p>\n<p>Podzielili\u015bmy uzyskany RAID-10: utworzyli\u015bmy jedn\u0105 Volume Group (VG) na ca\u0142y wolumen (z narzutami wynosz\u0105cymi oko\u0142o 6,7 GB) i utworzyli\u015bmy logiczny wolumen (Logical Volume, LV) pod system o pojemno\u015bci 50 GB. Zwykle ca\u0142\u0105 pozosta\u0142\u0105 przestrze\u0144 przeznaczamy na partycj\u0119 z MySQL. Ale potrzebowali\u015bmy cienkiego kopiowania, wi\u0119c najpierw stworzyli\u015bmy tak zwany pool, wewn\u0105trz kt\u00f3rego utworzyli\u015bmy partycj\u0119 pod \/var\/lib\/mysql o pojemno\u015bci 3,5 TB (na podstawie przewidywanych rozmiar\u00f3w baz danych):<\/p>\n<p><\/p>\n<pre><code class=\"bash\">lvcreate -l 100%FREE -T vga\/thin\nlvcreate -V 3.5T -T vga\/thin -n mysql<\/code><\/pre>\n<p><\/p>\n<p>Sformatowali\u015bmy partycj\u0119 w ext4, zamontowali\u015bmy j\u0105, zapisali\u015bmy replik\u0119 i otrzymali\u015bmy pocz\u0105tkowy zestaw. Nast\u0119pnie stworzyli\u015bmy API, kt\u00f3re powinno tworzy\u0107 migawki, uruchamia\u0107 instancj\u0119 Bazy Danych MySQL na zadanym porcie i usuwa\u0107 stworzon\u0105 instancj\u0119. Poniewa\u017c wykorzystujemy wy\u0142\u0105cznie wywo\u0142ania systemowe, jako j\u0119zyk do pisania skrypt\u00f3w wybrali\u015bmy zwyk\u0142y bash, a jako powi\u0105zanie API HTTP \u2192 bash wykorzystali\u015bmy rozwi\u0105zanie open source. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/phonkee\/goexpose\">goexpose<\/a><\/noindex>, napisane w Go. <\/p>\n<p><\/p>\n<p>Kiedy\u015b opublikujemy nasze skrypty bash w open source, a na razie po prostu opisz\u0119 g\u0142\u00f3wny algorytm:<\/p>\n<p><\/p>\n<p>Tworzenie g\u0142\u00f3wnej migawki snapmain:<\/p>\n<p><\/p>\n<ol>\n<li>Zatrzymujemy g\u0142\u00f3wn\u0105 replik\u0119.<\/li>\n<li>Nak\u0142adamy blokad\u0119 na operacje ze snapshotem snapmain.<\/li>\n<li>Tworzymy now\u0105 migawk\u0119 snapmain.<\/li>\n<li>Uruchamiamy MySQL i usuwamy blokad\u0119.<\/li>\n<\/ol>\n<p><\/p>\n<p>Tworzenie Bazy Danych na dowolnym porcie z snapmain:<\/p>\n<p><\/p>\n<ol>\n<li>Nak\u0142adamy blokad\u0119 na konkretn\u0105 instancj\u0119 Bazy Danych (port).<\/li>\n<li>Sprawdzamy, czy istnieje blokada tworzenia g\u0142\u00f3wnej migawki. Je\u015bli tak, czekamy i ponownie sprawdzamy co 5 sekund.<\/li>\n<li>Sprawdzamy, czy istnieje stara partycja LV instancji.<br \/>\n3.1 Je\u015bli tak, to zatrzymujemy instancj\u0119 MySQL za pomoc\u0105 kill -9 i usuwamy partycj\u0119 LV.<\/li>\n<li>Tworzymy now\u0105 instancj\u0119 z snapmain.<\/li>\n<li>Przygotowujemy i montujemy katalogi dla tej instancji.<\/li>\n<li>Usuwamy znaki s\u0142ugi (pliki) i uruchamiamy instancj\u0119 MySQL.<\/li>\n<li>Uczy\u0144 j\u0105 g\u0142\u00f3wn\u0105.<\/li>\n<li>Usuwamy blokad\u0119.<\/li>\n<\/ol>\n<p><\/p>\n<p>Usuwanie Bazy Danych na dowolnym porcie:<\/p>\n<p><\/p>\n<ol>\n<li>Nak\u0142adamy blokad\u0119 na konkretn\u0105 instancj\u0119 Bazy Danych (port).<\/li>\n<li>Zabijamy instancj\u0119 MySQL za pomoc\u0105 kill -9.<\/li>\n<li>Od\u0142\u0105czamy katalogi.<\/li>\n<li>Usuwamy partycj\u0119 LV i znosimy blokad\u0119.<\/li>\n<\/ol>\n<p><\/p>\n<p>Przyk\u0142ad polece\u0144 do klonowania partycji nowej instancji Bazy Danych:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">lvcreate -n stage_3307 -s vga\/snapmain\nlvchange -ay -K vga\/stage_3307\nmount -o noatime,nodiratime,data=writeback \/dev\/mapper\/vga-stage_3307 \/mnt\/stage_3307<\/code><\/pre>\n<p><\/p>\n<p>Teraz opowiem o g\u0142\u00f3wnym problemie, z kt\u00f3rym si\u0119 zmierzyli\u015bmy podczas korzystania z cienkiego rezerwowania. Napotkali\u015bmy na wydajno\u015b\u0107 dysk\u00f3w SSD. To zdarzy\u0142o si\u0119 z powodu cech Thin LVM: operuje ona na poziomie urz\u0105dzenia, u\u017cywaj\u0105c niskopoziomowych blok\u00f3w danych o domy\u015blnym rozmiarze 4 MB. Jak to wygl\u0105da\u0142o:<\/p>\n<p><\/p>\n<ol>\n<li>Tworzymy zrzut z g\u0142\u00f3wnej partycji \/var\/lib\/mysql.<\/li>\n<li>Uruchamiamy replikacj\u0119, aby nadrobi\u0107 zaleg\u0142o\u015bci wzgl\u0119dem mastera.<\/li>\n<li>Jakiekolwiek zmiany w tabelach repliki powoduj\u0105 zachowanie starych, niezmienionych blok\u00f3w danych w sekcji zrzutu.<\/li>\n<li>Jakiekolwiek zmiany w uruchomionym testowym egzemplarzu powoduj\u0105 zachowanie starych, niezmienionych blok\u00f3w danych w sekcji sklonowanego zrzutu dla tego egzemplarza.<\/li>\n<li>Zyskujemy obci\u0105\u017cenie operacji we\/wy na poziomie 100% na urz\u0105dzeniu, spowalniaj\u0105c wszelkie operacje oraz stopniowo op\u00f3\u017aniaj\u0105c replikacj\u0119.<\/li>\n<li>Pod koniec dnia roboczego otrzymujemy ustawk\u0119 op\u00f3\u017anion\u0105 o kilka godzin.<\/li>\n<\/ol>\n<p><\/p>\n<p>Jak sobie z tym poradzili\u015bmy, aby uzyska\u0107 bardziej rozs\u0105dny wynik (g\u0142\u00f3wne punkty):<\/p>\n<p><\/p>\n<p>Kontroler RAID:<\/p>\n<p><\/p>\n<ul>\n<li>Wy\u0142\u0105czyli\u015bmy wszystkie rodzaje buforowania domy\u015blnie. <\/li>\n<li>Ustawili\u015bmy writeback (gdy dane trafiaj\u0105 do bufora, zapis ko\u0144czy si\u0119, zanim rzeczywiste zapisanie na dysk zostanie uko\u0144czone).<\/li>\n<\/ul>\n<p><\/p>\n<p>System plik\u00f3w:<\/p>\n<p><\/p>\n<ul>\n<li>W punkcie montowania \/var\/lib\/mysql zapisali\u015bmy <em>noatime,nodiratime,data=writeback<\/em><\/li>\n<li>Wy\u0142\u0105czyli\u015bmy dziennikowanie ext4 za pomoc\u0105 tune2fs.<\/li>\n<\/ul>\n<p><\/p>\n<p>MySQL:<\/p>\n<p><\/p>\n<ul>\n<li>Zapisali\u015bmy <em>innodb_flush_method = O_DSYNC<\/em> (zwi\u0119kszyli\u015bmy pr\u0119dko\u015b\u0107 zapisu, obni\u017caj\u0105c tym samym niezawodno\u015b\u0107).<\/li>\n<li>Wy\u0142\u0105czyli\u015bmy dziennikowanie, logi nie s\u0105 nam potrzebne.<\/li>\n<li>Zapisali\u015bmy <em>innodb_buffer_pool_size = 4G<\/em> (im mniejszy rozmiar puli InnoDB, tym szybciej MySQL zako\u0144czy dzia\u0142anie przy zatrzymaniu, a tym samym szybciej stworzymy zrzut).<\/li>\n<\/ul>\n<p><\/p>\n<p>To nie jest pe\u0142na lista, zw\u0142aszcza je\u015bli chodzi o MySQL. Niemniej jednak, pozosta\u0142e zmiany s\u0105 drobne i cz\u0119sto nie s\u0105 stosowane lub nie s\u0105 precyzyjne. Na przyk\u0142ad w pr\u00f3bie odci\u0105\u017cenia dysk\u00f3w przenie\u015bli\u015bmy nawet <em>innodb_parallel_doublewrite_path<\/em> do \/dev\/shm, co w niekt\u00f3rych przypadkach przy uruchomieniu nieprawid\u0142owo zako\u0144czonego egzemplarza oszcz\u0119dza\u0142o nam do 5 sekund.<\/p>\n<p><\/p>\n<p>Dlaczego zatrzymujemy MySQL przed zrobieniem zrzutu? Przecie\u017c mo\u017cemy go wykona\u0107 z dzia\u0142aj\u0105cej repliki. Tak, to prawda, tylko nowy egzemplarz bazy danych na tym zrzucie b\u0119dzie domy\u015blnie uwa\u017cany za uszkodzony i b\u0119dzie wymaga\u0142 pe\u0142nego skanowania podczas uruchamiania. Zatrzymanie repliki jest zdecydowanie szybsze, chocia\u017c jest to ostatecznie najd\u0142u\u017csza operacja w ca\u0142ym procesie.<\/p>\n<p><\/p>\n<p>W rezultacie uzyskali\u015bmy bardziej akceptowalne czasy i gotowy do pracy system. Chocia\u017c, jak pokazuje najbardziej wymowny wykres op\u00f3\u017anienia replikacji g\u0142\u00f3wnej repliki, sytuacja wci\u0105\u017c jest daleka od idea\u0142u:<br \/>\n<img decoding=\"async\" alt=\"Cienkie rezerwowanie system\u00f3w plik\u00f3w Linux. Jak tworzy\u0107 kopie zapasowe trzech terabajt\u00f3w bazy danych MySQL w 20 sekund\" src=\"\/wp-content\/uploads\/2020\/03\/9bb7bb7d9abfea124a75616deec57f05.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z innych wad nale\u017cy wymieni\u0107 praktyczn\u0105 niemo\u017cno\u015b\u0107 monitorowania puli Thin LVM: poza systemowymi standardowymi funkcjami iostat, nie mo\u017cna na przyk\u0142ad zrozumie\u0107, kt\u00f3ry element puli w danym momencie generuje najwi\u0119ksze obci\u0105\u017cenie dla systemu plik\u00f3w.<\/p>\n<p><\/p>\n<p>Osobno nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na jeden powa\u017cny defekt zwi\u0105zany z opisan\u0105 powy\u017cej optymalizacj\u0105: otrzymali\u015bmy system YOLO. Oko\u0142o raz na jeden-dwa miesi\u0105ce ext4 nie wytrzymywa\u0142 podobnych nadu\u017cy\u0107 i bezpowrotnie si\u0119 psu\u0142, wymagaj\u0105c sformatowania i ponownego za\u0142adowania repliki. Zyskawszy na pr\u0119dko\u015bci, beznadziejnie zrujnowali\u015bmy stabilno\u015b\u0107.<\/p>\n<p><\/p>\n<p>Jakie metryki warto monitorowa\u0107 podczas eksploatacji Thin LVM:<\/p>\n<p><\/p>\n<ul>\n<li>Procent danych w puli thin<\/li>\n<li>Procent metadanych w puli thin<\/li>\n<\/ul>\n<p><\/p>\n<p>Je\u015bli nasz system przetrwa brak miejsca na dane (wystarczy posprz\u0105ta\u0107 dyski), to brak miejsca na metadane doprowadzi do ca\u0142kowitego za\u0142amania puli i konieczno\u015bci jej ponownego utworzenia od nowa.<\/p>\n<p><\/p>\n<p>System plik\u00f3w w obr\u0119bie puli z czasem bardzo mocno si\u0119 fragmentuje. Zalecam codzienne uruchamianie poprzez cron polecenia <em>fstrim -v \/var\/lib\/mysql<\/em>.<\/p>\n<p><\/p>\n<p>Podsumowanie:<\/p>\n<p><\/p>\n<ul>\n<li>Technologia jest \u0142atwo stosowalna, podobnie jak sam LVM, i nie wymaga szczeg\u00f3lnych kwalifikacji in\u017cyniera.<\/li>\n<li>Dobrze nadaje si\u0119 do baz danych ma\u0142ego rozmiaru i niezbyt obci\u0105\u017conych. Im mniejsza baza danych, tym mniej kawa\u0142k\u00f3w przemieszcza si\u0119 po systemie plik\u00f3w w obr\u0119bie puli, a obci\u0105\u017cenie dysk\u00f3w jest ni\u017csze.<\/li>\n<li>W przypadku naszego zadania zacz\u0119li\u015bmy szuka\u0107 innych rozwi\u0105za\u0144, o czym b\u0119dzie mowa w nast\u0119pnej sekcji.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vtoroy-stend-tehnologiya-zfs\">Drugi system, technologia ZFS<\/h3>\n<p><\/p>\n<p>Dawno temu mia\u0142em do czynienia z systemem plik\u00f3w ZFS, ale wtedy ZFS dzia\u0142a\u0142 naprawd\u0119 dobrze na swojej macierzystej rodzinie system\u00f3w operacyjnych Solaris. Istnia\u0142a portowana wersja na FreeBSD z ca\u0142kiem dobrym poziomem implementacji. By\u0142 tak\u017ce niedoko\u0144czony port na Linux, kt\u00f3ry niewiele os\u00f3b u\u017cywa\u0142o. Z powodu struktury przechowywania danych B-tree (zreszt\u0105 taka sama struktura jak w InnoDB MySQL), ZFS s\u0142abo sprawdza\u0142 si\u0119 w instalacjach z bardzo du\u017c\u0105 liczb\u0105 plik\u00f3w. Wszystko to, w po\u0142\u0105czeniu z konieczno\u015bci\u0105 poznania teorii przed u\u017cyciem, na d\u0142ugo wykre\u015bli\u0142o ten system plik\u00f3w z mojej praktyki. Pojawi\u0142y si\u0119 ext4 i xfs, kt\u00f3re sta\u0142y si\u0119 standardem. Jednak bior\u0105c pod uwag\u0119, \u017ce ZFS bardziej ni\u017c pasuje do naszego zadania, a wersja na Linux, s\u0105dz\u0105c po opiniach, rozwin\u0119\u0142a si\u0119 w ca\u0142kiem sensowny produkt (cho\u0107 nie w pe\u0142ni wspierany, przez co postawienie systemu na ZFS od podstaw mo\u017cna zrobi\u0107 tylko przy u\u017cyciu r\u00f3\u017cnych sztuczek), postanowili\u015bmy go wypr\u00f3bowa\u0107.<\/p>\n<p><\/p>\n<p>Z oczywistych powod\u00f3w wybrali\u015bmy stanowisko o podobnej konfiguracji (z wyj\u0105tkiem kontrolera RAID). Zainstalowali\u015bmy osiem dysk\u00f3w SSD o pojemno\u015bci 1920 GB. Nie mieli\u015bmy ochoty pisa\u0107 swojego obrazu systemu do wgrania serwera na czystym ZFS, wi\u0119c od ka\u017cdego dysku odj\u0119li\u015bmy 50 GB i utworzyli\u015bmy na nich MD RAID-10 pod system. Pozosta\u0142e 1950 GB na ka\u017cdym dysku po\u0142\u0105czyli\u015bmy w ZFS-analog RAID-10:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">zpool create zpool mirror \/dev\/sda2 \/dev\/sdb2 mirror \/dev\/sdc2 \/dev\/sdd2 mirror \/dev\/sde2 \/dev\/sdf2 mirror \/dev\/sdg2 \/dev\/sdh2<\/code><\/pre>\n<p><\/p>\n<p>Utworzyli\u015bmy partycje dla MySQL:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">zfs create zpool\/mysql\nzfs set compression=gzip zpool\/mysql\nzfs set recordsize=128k zpool\/mysql\nzfs set atime=off zpool\/mysql\nzfs create zpool\/mysql\/data\nzfs set recordsize=16k zpool\/mysql\/data\nzfs set primarycache=metadata zpool\/mysql\/data\nzfs set mountpoint=\/var\/lib\/mysql zpool\/mysql\/data<\/code><\/pre>\n<p><\/p>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce w\u0142\u0105czyli\u015bmy standardowe kompresowanie danych gzip. Na serwerze mamy du\u017co zasob\u00f3w procesorowych, kt\u00f3re nie s\u0105 w pe\u0142ni wykorzystywane. W efekcie 3 TB naszej bazy danych zmieni\u0142o si\u0119 w 1,6 TB, a poniewa\u017c najs\u0142abszym ogniwem, jak w poprzednim przypadku, jest maksymalna wydajno\u015b\u0107 dysk\u00f3w, im mniej danych \u2014 tym lepiej. Od samego pocz\u0105tku zyskujemy doskona\u0142y bonus od ZFS! W godzinach szczytu, przy pe\u0142nym obci\u0105\u017ceniu, na utrzymanie dzia\u0142ania gzip zu\u017cywa si\u0119 do 4 rdzeni, ale nie ma na co narzeka\u0107.<\/p>\n<p><\/p>\n<p>Nast\u0119pnie wdro\u017cenie przebiega\u0142o szybciej. Bez zmian przeniesiono ustawienia replikacji MySQL z standu LVM. Musieli\u015bmy po\u015bwi\u0119ci\u0107 troch\u0119 czasu na przerobienie skrypt\u00f3w na polecenia ZFS, ale og\u00f3lnie algorytmy pozosta\u0142y takie same. Przyk\u0142ad tworzenia migawki:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">zfs set snapdir=visible zpool\/mysql\/data\nzfs create zpool\/stage_3307\nzfs clone zpool\/mysql\/data@snapmain zpool\/stage_3307\/data\nzfs set mountpoint=\/mnt\/stage_3307 zpool\/stage_3307\/data<\/code><\/pre>\n<p><\/p>\n<p>Z dodatkowego tuningu: umie\u015bcili\u015bmy w pami\u0119ci sekcje ZFS z metadanymi i logami l2arc i zil. Okaza\u0142o si\u0119, \u017ce dla naszego zadania by\u0142o to zbyteczne, ale na razie pozostawili\u015bmy t\u0119 optymalizacj\u0119, zmiana przy okazji nie jest trudna. Negatywne efekty \u2014 po restarcie serwera trzeba ponownie tworzy\u0107 odpowiednie obszary pami\u0119ci. Fragment z zpool status:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">logs\n      \/dev\/shm\/zil_slog.img  ONLINE       0     0     0\ncache\n      \/dev\/shm\/l2arc.img     ONLINE       0     0     0<\/code><\/pre>\n<p><\/p>\n<p>W takiej konfiguracji zacz\u0119li\u015bmy testowa\u0107 stanowisko i uzyskali\u015bmy znakomite wyniki: przy dw\u00f3ch jednocze\u015bnie dzia\u0142aj\u0105cych egzemplarzach bazy danych (i aktywnej g\u0142\u00f3wnej replikacji) z migawkami uzyskali\u015bmy obci\u0105\u017cenie dysk\u00f3w na poziomie 50-60%.<\/p>\n<p><\/p>\n<p>Pozbyli\u015bmy si\u0119 naszego g\u0142\u00f3wnego problemu, co wida\u0107 na wykresie op\u00f3\u017anienia replikacji (por\u00f3wnaj z poprzednim wykresem w sekcji Thin LVM):<br \/>\n<img decoding=\"async\" alt=\"Cienkie rezerwowanie system\u00f3w plik\u00f3w Linux. Jak tworzy\u0107 kopie zapasowe trzech terabajt\u00f3w bazy danych MySQL w 20 sekund\" src=\"\/wp-content\/uploads\/2020\/03\/15df9283838a4662ff0f68accfde4089.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opr\u00f3cz tego i dzi\u0119ki temu znacznie przyspieszyli\u015bmy we wszystkich operacjach: pe\u0142ne tworzenie migawki z zatrzymaniem i uruchomieniem replikacji zajmuje do 40 sekund, wdro\u017cenie nowego egzemplarza MySQL z migawki zajmuje do 20 sekund. Co wi\u0119cej ni\u017c zadowala zar\u00f3wno nas, jak i nasze testy kodu.<\/p>\n<p><\/p>\n<p>Podsumowanie:<\/p>\n<p><\/p>\n<ul>\n<li>Wyniki w pe\u0142ni spe\u0142ni\u0142y nasze potrzeby w zakresie uzyskania kopii dzia\u0142aj\u0105cej bazy danych do testowania kodu.<\/li>\n<li>Technologia wymaga wprowadzenia: trzeba zrozumie\u0107, czym jest ZFS i jak z ni\u0105 pracowa\u0107.<\/li>\n<li>Nie sprawdzali\u015bmy bie\u017c\u0105cego statusu pracy ZFS z du\u017c\u0105 ilo\u015bci\u0105 (powy\u017cej 1 mln) ma\u0142ych plik\u00f3w. Ale zak\u0142adamy, \u017ce problem pozostaje, wi\u0119c nie poleca\u0142bym tego systemu plik\u00f3w do jakichkolwiek magazyn\u00f3w plik\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-dalshe\">Co dalej?<\/h3>\n<p><\/p>\n<p>W ramach stoiska nie robimy nic wi\u0119cej, wynik nas satysfakcjonuje. Mo\u017ce w przysz\u0142o\u015bci dodamy do ustawie\u0144 replikacji stoiska wy\u0142\u0105czenia tabel, kt\u00f3re nie s\u0105 potrzebne do testowania, co jeszcze bardziej zmniejszy obj\u0119to\u015b\u0107 bazy danych. Nie testowali\u015bmy systemu BTRFS i jego realizacji technologii cienkiego tworzenia kopii zapasowych. Niemniej jednak, takie zadanie ju\u017c nie istnieje, poniewa\u017c g\u0142\u00f3wny cel zosta\u0142 osi\u0105gni\u0119ty. Og\u00f3lnie rzecz bior\u0105c, oczywi\u015bcie, chcemy odej\u015b\u0107 od opisanego powy\u017cej podej\u015bcia \u2014 wdro\u017cy\u0107 operacyjne migracje bazy danych w \u015brodowisku testowym, stworzy\u0107 osobn\u0105 testow\u0105 p\u0119tl\u0119 bazy danych, zaj\u0105\u0107 si\u0119 shardowaniem g\u0142\u00f3wnej bazy. Wiele z tego ju\u017c realizujemy, o czym z pewno\u015bci\u0105 opowiemy w przysz\u0142ych artyku\u0142ach. <\/p>\n<p><\/p>\n<h3 id=\"itogi\">Podsumowanie<\/h3>\n<p><\/p>\n<p>Pierwotne zadanie zosta\u0142o rozwi\u0105zane, cho\u0107 w nietypowy spos\u00f3b. W po\u015brednich wnioskach opisano zalety i wady ka\u017cdej z zastosowanych technologii, dlatego zdecydujmy, kt\u00f3r\u0105 technologi\u0119 i kiedy mo\u017cna zastosowa\u0107:<\/p>\n<p><\/p>\n<ul>\n<li>Thin LVM \u2014 przy ma\u0142ych bazach danych i gdy nie chce si\u0119 lub nie ma czasu na nauk\u0119 ZFS.<\/li>\n<li>ZFS \u2014 je\u015bli masz do\u015bwiadczenie w pracy z ni\u0105 lub mo\u017cliwo\u015b\u0107 po\u015bwi\u0119cenia czasu na nauk\u0119 w ka\u017cdej sytuacji. <\/li>\n<\/ul>\n<p><\/p>\n<p>Na wy\u017cszym poziomie przedstawienia ten artyku\u0142 to nie tylko por\u00f3wnanie technologii dw\u00f3ch system\u00f3w plik\u00f3w. G\u0142\u00f3wna idea, kt\u00f3r\u0105 chcia\u0142bym przekaza\u0107 i utrwali\u0107, polega na tym, \u017ce nie warto ba\u0107 si\u0119 my\u015ble\u0107 nieszablonowo w sytuacjach krytycznych dla biznesu i korzysta\u0107 tylko z gotowych przepis\u00f3w. Kiedy\u015b mogliby\u015bmy wszyscy w departamencie technicznym pokiwa\u0107 g\u0142owami i powiedzie\u0107, \u017ce zadanie stworzenia tr\u00f3jterabajtowych kopii bazy danych w mniej ni\u017c minut\u0119 jest niemo\u017cliwe i nie potrzebujemy ryzykownych technologii, zr\u00f3bmy to jak nale\u017cy. By\u0142oby to mo\u017cliwe, ale straciliby\u015bmy oko\u0142o p\u00f3\u0142 roku do roku i wiele podr\u00f3\u017cy klient\u00f3w (podr\u00f3\u017ce to nasz g\u0142\u00f3wny wska\u017anik biznesowy) bez test\u00f3w i w trakcie wdro\u017cenia. Podejmuj\u0105c nietypowe kroki, stracili\u015bmy niewiele czasu na wdro\u017cenie, zdobyli\u015bmy do\u015bwiadczenie w nowych i zapomnianych starych technologiach, i przeprowadzili\u015bmy testy dok\u0142adnie w momencie, gdy by\u0142y nam bardzo potrzebne. Niew\u0105tpliwie pozytywnie wp\u0142yn\u0119\u0142o to na wszystkie nasze wska\u017aniki. Wyb\u00f3r zawsze nale\u017cy do was, a my z naszej strony b\u0119dziemy nadal opowiada\u0107 na naszym blogu o interesuj\u0105cych bie\u017c\u0105cych i przysz\u0142ych osi\u0105gni\u0119ciach.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/citymobil\/blog\/492172\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u042e\u0440\u0438\u0439, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0421\u0438\u0442\u0438\u043c\u043e\u0431\u0438\u043b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0442\u043e\u043d\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (thin provisioning) \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 CI\/CD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0435\u0433\u043e \u0432 production \u043d\u0430\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 MySQL, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74328,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74327","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=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0440\u0435\u0445\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 MySQL \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund\" \/>\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-03-16T05:42:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-16T05:42:33+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\udd47Szczeg\u00f3\u0142owe rezerwowanie system\u00f3w plik\u00f3w Linux. Jak tworzy\u0107 kopie zapasowe trzyterabajtowej bazy danych MySQL w 20 sekund | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0440\u0435\u0445\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 MySQL \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","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-03-16T05:42:33+00:00","article:modified_time":"2020-03-16T05:42:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74327","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 18:16:23","updated":"2022-10-01 23:42:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/74327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=74327"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/74327\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/74328"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=74327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=74327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=74327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}