{"id":81936,"date":"2020-05-18T01:42:37","date_gmt":"2020-05-17T23:42:37","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera"},"modified":"2020-05-18T01:42:37","modified_gmt":"2020-05-17T23:42:37","slug":"szhatie-dannyh-v-apache-ignite-opyt-sbera","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","title":{"rendered":"Kompresja danych w Apache Ignite. Do\u015bwiadczenia Sberbanku","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kompresja danych w Apache Ignite. Do\u015bwiadczenia Sberbanku\" src=\"\/wp-content\/uploads\/2020\/05\/0e26c686b1f29e88e6be4b8df81ab668.jpg\" style=\"display:block;margin: 0 auto;\" \/>Przy pracy z du\u017cymi zbiorami danych problem braku miejsca na dyskach mo\u017ce sta\u0107 si\u0119 nagl\u0105cy. Jednym ze sposob\u00f3w rozwi\u0105zania tego problemu jest kompresja, kt\u00f3ra pozwala na zwi\u0119kszenie pojemno\u015bci przechowywania na tym samym sprz\u0119cie. W tym artykule om\u00f3wimy, jak dzia\u0142a kompresja danych w Apache Ignite. Skupimy si\u0119 wy\u0142\u0105cznie na metodach kompresji zaimplementowanych w produkcie. Inne metody kompresji danych (w sieci, w pami\u0119ci), zar\u00f3wno te zaimplementowane, jak i nie, zostan\u0105 pomini\u0119te.<\/p>\n<p>Zatem, w trybie z w\u0142\u0105czonym persistence, w wyniku zmian danych w cache'ach, Ignite zaczyna zapisywa\u0107 na dysku:<\/p>\n<ol>\n<li>Zawarto\u015b\u0107 cache'\u00f3w<\/li>\n<li>Dziennik wcze\u015bniejszego zapisu (Write Ahead Log, dalej WAL)<\/li>\n<\/ol>\n<p>\nOd d\u0142u\u017cszego czasu istnieje mechanizm kompresji WAL, zwany kompresj\u0105 WAL. W niedawno wydanej wersji Apache Ignite 2.8 pojawi\u0142y si\u0119 dwa nowe mechanizmy umo\u017cliwiaj\u0105ce kompresj\u0119 danych na dysku: kompresja stron dyskowych oraz kompresja zrzut\u00f3w stron WAL dla niekt\u00f3rych wpis\u00f3w WAL. Wi\u0119cej o tych trzech mechanizmach poni\u017cej.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Kompresja stron dyskowych<\/h3>\n<p><\/p>\n<h4>Jak to dzia\u0142a<\/h4>\n<p>\nNa pocz\u0105tek kr\u00f3tko opiszmy, jak Ignite przechowuje dane. Do przechowywania wykorzystywana jest pami\u0119\u0107 stronicowa. Rozmiar strony jest okre\u015blany przy uruchamianiu w\u0119z\u0142a i nie mo\u017ce by\u0107 zmieniany na p\u00f3\u017aniejszych etapach, dodatkowo rozmiar strony musi by\u0107 pot\u0119g\u0105 liczby 2 i wielokrotno\u015bci\u0105 rozmiaru bloku systemu plik\u00f3w. Strony s\u0105 \u0142adowane do RAM z dysku w miar\u0119 potrzeb, a rozmiar danych na dysku mo\u017ce przekracza\u0107 przydzielon\u0105 pami\u0119\u0107 RAM. W przypadku braku miejsca w RAM na za\u0142adowanie strony z dysku, stare, ju\u017c nieu\u017cywane strony b\u0119d\u0105 wypychane z RAM.<\/p>\n<p>Na dysku dane s\u0105 przechowywane w nast\u0119puj\u0105cy spos\u00f3b: dla ka\u017cdej partycji ka\u017cdej grupy cache'\u00f3w tworzony jest osobny plik, w kt\u00f3rym strony id\u0105 jedna po drugiej w porz\u0105dku rosn\u0105cym indeksu. Pe\u0142ny identyfikator strony zawiera identyfikator grupy cache, numer partycji oraz indeks strony w pliku. Dzi\u0119ki pe\u0142nemu identyfikatorowi strony mo\u017cemy jednoznacznie okre\u015bli\u0107 plik i offset w pliku dla ka\u017cdej strony. Wi\u0119cej informacji na temat struktury pami\u0119ci stronicowej mo\u017cna przeczyta\u0107 w artykule na wikipedii Apache Ignite: <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/IGNITE\/Ignite+Persistent+Store+-+under+the+hood\">Ignite Persistent Store \u2014 od podstaw<\/a><\/noindex>.<\/p>\n<p>Mechanizm kompresji stron dyskowych, jak mo\u017cna si\u0119 domy\u015bli\u0107 z nazwy, dzia\u0142a na poziomie stron. Przy w\u0142\u0105czonym tym mechanizmie operacje na danych w RAM s\u0105 realizowane bez \u017cadnej kompresji, ale w momencie zapisywania stron z RAM na dysk przeprowadza si\u0119 ich kompresj\u0119.<\/p>\n<p>Jednak skompresowanie ka\u017cdej strony osobno to jeszcze nie rozwi\u0105zanie problemu, trzeba jako\u015b zmniejszy\u0107 rozmiar ko\u0144cowych plik\u00f3w z danymi. Je\u015bli rozmiar strony przestaje by\u0107 sta\u0142y, nie mo\u017cemy ju\u017c zapisywa\u0107 stron do pliku jedna po drugiej, poniewa\u017c mo\u017ce to prowadzi\u0107 do szeregu problem\u00f3w:<\/p>\n<ul>\n<li>Nie b\u0119dziemy w stanie obliczy\u0107 offsetu strony przy pomocy indeksu, na kt\u00f3rym si\u0119 ona znajduje w pliku.<\/li>\n<li>Nie wiadomo, co zrobi\u0107 ze stronami, kt\u00f3re znajduj\u0105 si\u0119 nie na ko\u0144cu pliku i zmieniaj\u0105 sw\u00f3j rozmiar. Je\u015bli rozmiar strony si\u0119 zmniejsza, miejsce, kt\u00f3re zosta\u0142o zwolnione, znika. Je\u015bli rozmiar strony si\u0119 zwi\u0119ksza, trzeba b\u0119dzie szuka\u0107 dla niej nowego miejsca w pliku.<\/li>\n<li>Je\u015bli strona przesunie si\u0119 o liczb\u0119 bajt\u00f3w, kt\u00f3ra nie jest wielokrotno\u015bci\u0105 rozmiaru bloku systemu plik\u00f3w, do jej odczytu lub zapisu zajmie si\u0119 o jeden blok systemu plik\u00f3w wi\u0119cej, co mo\u017ce prowadzi\u0107 do spadku wydajno\u015bci.<\/li>\n<\/ul>\n<p>\nAby nie rozwi\u0105zywa\u0107 tych problem\u00f3w na swoim poziomie, kompresja stron dyskowych w Apache Ignite wykorzystuje mechanizm systemu plik\u00f3w zwany plikami sparsenymi. Plik sparseny to plik, w kt\u00f3rym niekt\u00f3re obszary wype\u0142nione zerami mog\u0105 by\u0107 oznaczone jako \"dziury\". Bloki systemu plik\u00f3w nie s\u0105 przydzielane do przechowywania tych dziur, co prowadzi do oszcz\u0119dno\u015bci miejsca na dysku.<\/p>\n<p>Logiczne jest, \u017ce aby zwolni\u0107 blok systemu plik\u00f3w, rozmiar dziury musi by\u0107 wi\u0119kszy lub r\u00f3wny rozmiarowi bloku systemu plik\u00f3w, co nak\u0142ada dodatkowe ograniczenie na rozmiar strony w Apache Ignite: aby kompresja przynios\u0142a jakikolwiek efekt, rozmiar strony musi by\u0107 \u015bci\u015ble wi\u0119kszy ni\u017c rozmiar bloku systemu plik\u00f3w. Je\u015bli rozmiar strony b\u0119dzie r\u00f3wny rozmiarowi bloku, nigdy nie b\u0119dziemy mogli zwolni\u0107 \u017cadnego bloku, poniewa\u017c aby zwolni\u0107 pojedynczy blok, skompresowana strona musi zajmowa\u0107 0 bajt\u00f3w. Je\u015bli natomiast rozmiar strony b\u0119dzie r\u00f3wny rozmiarowi 2 lub 4 blok\u00f3w, b\u0119dziemy mogli zwolni\u0107 przynajmniej jeden blok, je\u015bli nasza strona skompresuje si\u0119 przynajmniej do 50% lub do 75% odpowiednio.<\/p>\n<p>W ten spos\u00f3b, ko\u0144cowy opis dzia\u0142ania mechanizmu: podczas zapisu strony na dysk, podejmowana jest pr\u00f3ba kompresji strony. Je\u015bli rozmiar skompresowanej strony pozwala na zwolnienie jednego lub wi\u0119cej blok\u00f3w systemu plik\u00f3w, strona jest zapisywana w skompresowanej formie, a w miejscu zwolnionych blok\u00f3w powstaje 'dziura' (wykonywane jest wywo\u0142anie systemowe z flag\u0105 \u201epunch hole\u201d). <code>fallocate()<\/code> Je\u015bli rozmiar skompresowanej strony nie pozwala na zwolnienie blok\u00f3w, strona jest przechowywana bez zmian, w formie nieskompresowanej. Wszystkie offsety stron s\u0105 liczone tak samo jak bez kompresji, mno\u017c\u0105c indeks strony przez rozmiar strony. \u017badna relokacja stron nie jest wymagana. Offsety stron, jak przy braku kompresji, trafiaj\u0105 na granice blok\u00f3w systemu plik\u00f3w.<\/p>\n<p><img decoding=\"async\" alt=\"Kompresja danych w Apache Ignite. Do\u015bwiadczenia Sberbanku\" src=\"\/wp-content\/uploads\/2020\/05\/6a6c6ad83d3b8591f76b9343ff067746.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nW bie\u017c\u0105cej implementacji Ignite mo\u017ce pracowa\u0107 z plikami sparse tylko na systemie Linux, odpowiednio kompresja stron dyskowych mo\u017ce by\u0107 w\u0142\u0105czona tylko podczas korzystania z Ignite na tym systemie operacyjnym.<\/p>\n<p>Algorytmy kompresji, kt\u00f3re mog\u0105 by\u0107 u\u017cywane do kompresji stron dyskowych: ZSTD, LZ4, Snappy. Ponadto istnieje tryb pracy (SKIP_GARBAGE), w kt\u00f3rym tylko wyrzucane jest nieu\u017cywane miejsce na stronie bez stosowania kompresji na pozosta\u0142ych danych, co pozwala zmniejszy\u0107 obci\u0105\u017cenie CPU w por\u00f3wnaniu do wcze\u015bniej wymienionych algorytm\u00f3w.<\/p>\n<h4>Wp\u0142yw na wydajno\u015b\u0107 <\/h4>\n<p>\nNiestety, nie przeprowadza\u0142em rzeczywistych pomiar\u00f3w wydajno\u015bci na rzeczywistych stanowiskach, poniewa\u017c nie planujemy u\u017cywa\u0107 tego mechanizmu w produkcji, ale mo\u017cna rozwa\u017cy\u0107 teoretycznie, gdzie stracimy, a gdzie zyskamy.<\/p>\n<p>W tym celu musimy przypomnie\u0107 sobie, jak odbywa si\u0119 odczyt i zapis stron podczas ich pr\u00f3by:<\/p>\n<ul>\n<li>Podczas wykonywania operacji odczytu najpierw wykonuje si\u0119 jej wyszukiwanie w RAM, je\u015bli wyszukiwanie zako\u0144czy\u0142o si\u0119 niepowodzeniem, strona jest \u0142adowana do RAM z dysku tym samym w\u0105tkiem, kt\u00f3ry wykonuje odczyt.<\/li>\n<li>Podczas wykonywania operacji zapisu, strona w RAM jest oznaczana jako brudna, przy czym fizyczne zapisanie strony na dysk nie nast\u0119puje natychmiast w w\u0105tku, kt\u00f3ry wykonuje zapis. Wszystkie brudne strony zapisuj\u0105 si\u0119 na dysk p\u00f3\u017aniej w procesie checkpointa przez oddzielne w\u0105tki.<\/li>\n<\/ul>\n<p>\nW ten spos\u00f3b wp\u0142yw na operacje odczytu:<\/p>\n<ul>\n<li>Pozytywny (disk IO), dzi\u0119ki zmniejszeniu liczby odczytanych blok\u00f3w systemu plik\u00f3w.<\/li>\n<li>Negatywny (CPU) z powodu dodatkowego obci\u0105\u017cenia, jakie system operacyjny potrzebuje do pracy z plikami sparse. Mo\u017ce r\u00f3wnie\u017c wyst\u0105pi\u0107 dodatkowa operacja IO zwi\u0105zana z zachowaniem bardziej z\u0142o\u017conej struktury pliku sparse (niestety nie znam si\u0119 na szczeg\u00f3\u0142ach pracy z plikami sparse).<\/li>\n<li>Negatywny (CPU) z powodu konieczno\u015bci dekompresji stron.<\/li>\n<li>Nie ma wp\u0142ywu na operacje zapisu.<\/li>\n<li>Wp\u0142yw na proces checkpointingu (wszystko tu jest analogiczne do operacji odczytu):<\/li>\n<li>Pozytywny (disk IO) z powodu zmniejszenia liczby zapisanych blok\u00f3w systemu plik\u00f3w.<\/li>\n<li>Negatywny (CPU, mo\u017cliwe disk IO) z powodu pracy z plikami sparse.<\/li>\n<li>Negatywny (CPU) z powodu konieczno\u015bci kompresji stron.<\/li>\n<\/ul>\n<p>\nKt\u00f3ra strona szali przewa\u017cy? Wszystko bardzo zale\u017cy od \u015brodowiska, ale sk\u0142aniam si\u0119 ku temu, \u017ce kompresja stron dyskowych raczej doprowadzi do degradacji wydajno\u015bci w wi\u0119kszo\u015bci system\u00f3w. Tym bardziej, \u017ce testy na innych DBMS, kt\u00f3re stosuj\u0105 podobne podej\u015bcie z plikami sparse, wykazuj\u0105 spadek wydajno\u015bci przy w\u0142\u0105czonej kompresji.<\/p>\n<h4>Jak w\u0142\u0105czy\u0107 i skonfigurowa\u0107<\/h4>\n<p>\nJak ju\u017c wspomniano, minimalna wersja Apache Ignite wspieraj\u0105ca kompresj\u0119 stron dyskowych to 2.8, a wsparcie dost\u0119pne jest tylko na systemie operacyjnym Linux. W\u0142\u0105czenie i konfiguracja przebiega nast\u0119puj\u0105co:<\/p>\n<ul>\n<li>W class-path musi znajdowa\u0107 si\u0119 modu\u0142 ignite-compression. Domy\u015blnie znajduje si\u0119 on w dystrybucji Apache Ignite w katalogu libs\/optional i nie jest w\u0142\u0105czony do class-path. Mo\u017cna po prostu przenie\u015b\u0107 katalog na jeden poziom wy\u017cej do libs, a wtedy przy uruchamianiu przez ignite.sh zostanie automatycznie w\u0142\u0105czony.<\/li>\n<li>Trwa\u0142o\u015b\u0107 musi by\u0107 w\u0142\u0105czona (W\u0142\u0105cza si\u0119 przez <code>DataRegionConfiguration.setPersistenceEnabled(true))<\/code>.<\/li>\n<li>Rozmiar strony musi by\u0107 wi\u0119kszy ni\u017c rozmiar bloku systemu plik\u00f3w (mo\u017cna go ustawi\u0107 za pomoc\u0105 <code>DataStorageConfiguration.setPageSize()<\/code> ).<\/li>\n<li>Dla ka\u017cdego cache'a, kt\u00f3rego dane wymagaj\u0105 kompresji, konieczne jest w konfiguracji ustawienie metody kompresji oraz (opcjonalnie) poziomu kompresji (metody <code>CacheConfiguration.setDiskPageCompression(), CacheConfiguration.setDiskPageCompressionLevel()<\/code>).<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kompresja WAL<\/h3>\n<p><\/p>\n<h4>Jak to dzia\u0142a<\/h4>\n<p>\nCzym jest WAL i po co jest potrzebny? Kr\u00f3tko m\u00f3wi\u0105c, to dziennik, w kt\u00f3ry trafiaj\u0105 wszystkie zdarzenia zmieniaj\u0105ce ostatecznie magazyn stron. Jest on przede wszystkim potrzebny do mo\u017cliwo\u015bci przywracania w przypadku awarii. Ka\u017cda operacja, zanim odda kontrol\u0119 u\u017cytkownikowi, musi najpierw zapisa\u0107 zdarzenie w WAL, aby w razie awarii m\u00f3c odtworzy\u0107 wszystko z dziennika i przywr\u00f3ci\u0107 wszystkie operacje, na kt\u00f3re u\u017cytkownik otrzyma\u0142 pozytywn\u0105 odpowied\u017a, nawet je\u015bli te operacje nie zd\u0105\u017cy\u0142y jeszcze zosta\u0107 odzwierciedlone w magazynie stron na dysku (wcze\u015bniej opisano, \u017ce faktyczne zapisywanie w magazynie stron wykonywane jest w procesie zwanym \u201echeckpointem\u201d z pewnym op\u00f3\u017anieniem przez oddzielne w\u0105tki).<\/p>\n<p>Zapisy w WAL dziel\u0105 si\u0119 na logiczne i fizyczne. Zapisami logicznymi s\u0105 same klucze i warto\u015bci. Fizyczne \u2014 odzwierciedlaj\u0105 zmiany stron w magazynie stron. Je\u015bli zapisy logiczne mog\u0105 by\u0107 przydatne w jeszcze innych przypadkach, to zapisy fizyczne potrzebne s\u0105 tylko do przywracania w razie awarii i potrzebne s\u0105 zapisy tylko od momentu ostatniego udanego checkpointu. Nie b\u0119dziemy tutaj wnika\u0107 w szczeg\u00f3\u0142y ani wyja\u015bnia\u0107, dlaczego tak to dzia\u0142a, ale zainteresowani mog\u0105 odwo\u0142a\u0107 si\u0119 do ju\u017c wspomnianego artyku\u0142u na Wiki Apache Ignite: <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/IGNITE\/Ignite+Persistent+Store+-+under+the+hood\">Ignite Persistent Store \u2014 od podstaw<\/a><\/noindex>.<\/p>\n<p>Na jeden logiczny zapis cz\u0119sto przypada kilka fizycznych zapis\u00f3w. Oznacza to, \u017ce na przyk\u0142ad jedna operacja put w pami\u0119ci podr\u0119cznej dotyczy kilku stron w pami\u0119ci stronicowej (strony z danymi, strony z indeksami, strony z listami wolnymi). W niekt\u00f3rych syntetycznych testach uda\u0142o mi si\u0119 ustali\u0107, \u017ce fizyczne zapisy zajmowa\u0142y do 90% obj\u0119to\u015bci pliku WAL. Przy tym potrzebne by\u0142y one tylko przez kr\u00f3tki czas (domy\u015blnie interwa\u0142 mi\u0119dzy checkpointami to 3 minuty). Logiczne by\u0142oby pozbycie si\u0119 tych danych po utracie ich aktualno\u015bci. Dok\u0142adnie to wykonuje mechanizm kompresji WAL, kt\u00f3ry usuwa fizyczne zapisy i kompresuje pozosta\u0142e logiczne zapisy za pomoc\u0105 zip, przy tym rozmiar pliku znacznie si\u0119 zmniejsza (czasami nawet dziesi\u0119ciokrotnie).<\/p>\n<p>Fizyczny WAL sk\u0142ada si\u0119 z kilku segment\u00f3w (domy\u015blnie 10) o sta\u0142ym rozmiarze (domy\u015blnie 64MB), kt\u00f3re s\u0105 nadpisywane w cyklu. Gdy bie\u017c\u0105cy segment si\u0119 zape\u0142ni, przypisany zostaje mu nast\u0119pny segment, a zape\u0142niony segment jest kopiowany do archiwum odr\u0119bnym w\u0105tkiem. Kompresja WAL ju\u017c dzia\u0142a z segmentami archiwalnymi. Opr\u00f3cz tego, osobny w\u0105tek \u015bledzi wykonanie punkt\u00f3w kontrolnych i rozpoczyna kompresj\u0119 dla segment\u00f3w archiwalnych, fizyczne zapisy kt\u00f3rych nie s\u0105 ju\u017c potrzebne.<\/p>\n<p><img decoding=\"async\" alt=\"Kompresja danych w Apache Ignite. Do\u015bwiadczenia Sberbanku\" src=\"\/wp-content\/uploads\/2020\/05\/ca8690ba7a350df9530f2ccf01c90975.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h4>Wp\u0142yw na wydajno\u015b\u0107<\/h4>\n<p>\nPoniewa\u017c kompresja WAL dzia\u0142a w osobnym w\u0105tku, nie powinna mie\u0107 bezpo\u015bredniego wp\u0142ywu na wykonywane operacje. Niemniej jednak generuje dodatkowe obci\u0105\u017cenie w tle dla CPU (kompresja) i dysku (odczyt ka\u017cdego segmentu WAL z archiwum i zapis skompresowanych segment\u00f3w), dlatego je\u015bli system dzia\u0142a na granicy mo\u017cliwo\u015bci, mo\u017ce to r\u00f3wnie\u017c prowadzi\u0107 do degradacji wydajno\u015bci.<\/p>\n<h4>Jak w\u0142\u0105czy\u0107 i skonfigurowa\u0107<\/h4>\n<p>\nW\u0142\u0105czy\u0107 kompresj\u0119 WAL mo\u017cna za pomoc\u0105 w\u0142a\u015bciwo\u015bci <code>WalCompactionEnabled<\/code> do <code>DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)<\/code>). Mo\u017cna r\u00f3wnie\u017c ustawi\u0107 poziom kompresji za pomoc\u0105 metody DataStorageConfiguration.setWalCompactionLevel(), je\u015bli domy\u015blna warto\u015b\u0107 (BEST_SPEED) nie jest zadowalaj\u0105ca.<\/p>\n<h3>Kompresja migawki strony WAL<\/h3>\n<p><\/p>\n<h4>Jak to dzia\u0142a<\/h4>\n<p>\nJu\u017c wcze\u015bniej ustalili\u015bmy, \u017ce zapisy WAL dziel\u0105 si\u0119 na logiczne i fizyczne. Dla ka\u017cdej zmiany ka\u017cdej strony w pami\u0119ci roboczej tworzony jest fizyczny zapis WAL. Fizyczne zapisy z kolei dziel\u0105 si\u0119 na dwa podtypy: zapis migawki strony (page snapshot record) oraz zapis delta (delta record). Za ka\u017cdym razem, gdy zmieniamy co\u015b na stronie i przechodzimy z stanu czystego do brudnego, w WAL zapisywana jest pe\u0142na kopia tej strony (page snapshot record \u2014 migawka strony). Nawet je\u015bli zmieniamy tylko jeden bajt, w WAL zapisuje si\u0119 zapis o rozmiarze nieco wi\u0119kszym ni\u017c rozmiar strony. Je\u015bli jednak zmieniamy co\u015b na ju\u017c brudnej stronie, w WAL tworzy si\u0119 zapis delta, kt\u00f3ry odzwierciedla jedynie zmiany w por\u00f3wnaniu z poprzednim stanem strony, a nie ca\u0142\u0105 stron\u0119 jako tak\u0105. Poniewa\u017c resetowanie stanu stron z brudnego na czysty wykonywane jest w trakcie punktu kontrolnego, tu\u017c po rozpocz\u0119ciu punktu kontrolnego prawie wszystkie fizyczne zapisy b\u0119d\u0105 sk\u0142ada\u0107 si\u0119 tylko z migawek stron (poniewa\u017c wszystkie strony bezpo\u015brednio po rozpocz\u0119ciu punktu kontrolnego s\u0105 czyste), a nast\u0119pnie w miar\u0119 zbli\u017cania si\u0119 do nast\u0119pnego punktu kontrolnego udzia\u0142 zapis\u00f3w delta zaczyna rosn\u0105\u0107, by zn\u00f3w zosta\u0107 zresetowany na pocz\u0105tku nast\u0119pnego punktu kontrolnego. Pomiar na kilku syntetycznych testach wykaza\u0142, \u017ce udzia\u0142 migawek stron w og\u00f3lnej obj\u0119to\u015bci zapis\u00f3w fizycznych osi\u0105ga 90%.<\/p>\n<p>Ide\u0105 kompresji migawki strony WAL jest kompresowanie migawek stron przy u\u017cyciu istniej\u0105cego narz\u0119dzia do kompresji stron (por. kompresja stron na dysku). W tym przypadku zapisy w WAL s\u0105 przechowywane sekwencyjnie w trybie append-only i nie ma potrzeby wi\u0105zania zapis\u00f3w z granicami blok\u00f3w systemu plik\u00f3w, dlatego tutaj, w przeciwie\u0144stwie do mechanizmu kompresji stron na dysku, nie potrzebujemy plik\u00f3w sparse, w zwi\u0105zku z czym ten mechanizm zadzia\u0142a nie tylko na systemie operacyjnym Linux. Ponadto nie jest ju\u017c dla nas istotne, jak bardzo uda\u0142o nam si\u0119 skompresowa\u0107 stron\u0119. Nawet je\u015bli uwolnili\u015bmy 1 bajt, to ju\u017c pozytywny wynik, a my mo\u017cemy przechowywa\u0107 w WAL skompresowane dane, w przeciwie\u0144stwie do kompresji stron na dysku, gdzie przechowujemy skompresowan\u0105 stron\u0119 tylko wtedy, gdy uwolnili\u015bmy wi\u0119cej ni\u017c 1 blok systemu plik\u00f3w.<\/p>\n<p>Strony to dane, kt\u00f3re dobrze si\u0119 kompresuj\u0105, ich udzia\u0142 w ca\u0142kowitej obj\u0119to\u015bci WAL jest bardzo wysoki, w ten spos\u00f3b, nie zmieniaj\u0105c formatu pliku WAL, mo\u017cemy uzyska\u0107 znacz\u0105ce zmniejszenie jego rozmiaru. Kompresja log\u00f3w logicznych wymaga\u0142aby natomiast zmiany formatu i utraty zgodno\u015bci, na przyk\u0142ad dla zewn\u0119trznych u\u017cytkownik\u00f3w, kt\u00f3rzy mog\u0105 by\u0107 zainteresowani zapisami logicznymi, a jednocze\u015bnie nie przynios\u0142aby istotnego zmniejszenia obj\u0119to\u015bci pliku.<\/p>\n<p>Podobnie jak w przypadku kompresji stron dyskowych, dla kompresji zrzut\u00f3w stron WAL mog\u0105 by\u0107 u\u017cywane algorytmy kompresji ZSTD, LZ4, Snappy, a tak\u017ce tryb SKIP_GARBAGE.<\/p>\n<h4>Wp\u0142yw na wydajno\u015b\u0107<\/h4>\n<p>\nJak \u0142atwo zauwa\u017cy\u0107, bezpo\u015brednie w\u0142\u0105czenie kompresji zrzut\u00f3w stron WAL wp\u0142ywa tylko na w\u0105tki, kt\u00f3re zapisuj\u0105 dane w pami\u0119ci stron, tzn. na te w\u0105tki, kt\u00f3re zmieniaj\u0105 dane w pami\u0119ciach podr\u0119cznych. Odczyt z fizycznych zapis\u00f3w WAL odbywa si\u0119 tylko raz, w momencie uruchamiania w\u0119z\u0142a po awarii (i tylko w przypadku awarii podczas checkpointu).<\/p>\n<p>Wp\u0142yw na w\u0105tki zmieniaj\u0105ce dane jest nast\u0119puj\u0105cy: uzyskujemy negatywny efekt (CPU) z powodu konieczno\u015bci ka\u017cdorazowego kompresowania strony przed zapisem na dysk i pozytywny efekt (disk IO) z powodu zmniejszenia liczby zapisanych danych. Odpowiednio, tu wszystko jest proste, je\u015bli wydajno\u015b\u0107 systemu ogranicza procesor CPU, otrzymujemy niewielk\u0105 degradacj\u0119, je\u015bli chodzi o dyskowy wej\u015bcie\/wyj\u015bcie - otrzymujemy przyrost.<\/p>\n<p>Po\u015brednio zmniejszenie rozmiaru WAL r\u00f3wnie\u017c wp\u0142ywa (pozytywnie) na w\u0105tki, kt\u00f3re przenosz\u0105 segmenty WAL do archiwum oraz na w\u0105tki kompresji WAL.<\/p>\n<p>Rzeczywiste testy wydajno\u015bci w naszym \u015brodowisku na danych syntetycznych pokaza\u0142y niewielki wzrost (przepustowo\u015b\u0107 wzros\u0142a o 10%-15%, op\u00f3\u017anienie zmniejszy\u0142o si\u0119 o 10%-15%).<\/p>\n<h4>Jak w\u0142\u0105czy\u0107 i skonfigurowa\u0107<\/h4>\n<p>\nMinimalna wersja Apache Ignite: 2.8. W\u0142\u0105czenie i konfiguracja odbywa si\u0119 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li>W class-path musi znajdowa\u0107 si\u0119 modu\u0142 ignite-compression. Domy\u015blnie znajduje si\u0119 on w dystrybucji Apache Ignite w katalogu libs\/optional i nie jest w\u0142\u0105czony do class-path. Mo\u017cna po prostu przenie\u015b\u0107 katalog na jeden poziom wy\u017cej do libs, a wtedy przy uruchamianiu przez ignite.sh zostanie automatycznie w\u0142\u0105czony.<\/li>\n<li>Trwa\u0142o\u015b\u0107 musi by\u0107 w\u0142\u0105czona (W\u0142\u0105cza si\u0119 przez <code>DataRegionConfiguration.setPersistenceEnabled(true)<\/code>).<\/li>\n<li>Tryb kompresji nale\u017cy ustawi\u0107 za pomoc\u0105 metody <code>DataStorageConfiguration.setWalPageCompression()<\/code>, domy\u015blnie kompresja jest wy\u0142\u0105czona (tryb DISABLED).<\/li>\n<li>Opcjonalnie mo\u017cna okre\u015bli\u0107 stopie\u0144 kompresji za pomoc\u0105 metody <code>DataStorageConfiguration.setWalPageCompression()<\/code>, dopuszczalne warto\u015bci dla ka\u017cdego z tryb\u00f3w znajdziesz w javadoc metody.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Podsumowanie<\/h3>\n<p>\nRozwa\u017cane mechanizmy kompresji danych w Apache Ignite mog\u0105 by\u0107 u\u017cywane niezale\u017cnie od siebie, ale r\u00f3wnie\u017c dopuszczalne s\u0105 wszelkie ich kombinacje. Zrozumienie zasad ich dzia\u0142ania pozwoli okre\u015bli\u0107, jak dobrze pasuj\u0105 do Twoich zada\u0144 w Twoim \u015brodowisku oraz co trzeba b\u0119dzie po\u015bwi\u0119ci\u0107 przy ich u\u017cywaniu. Kompresja stron dysku jest przeznaczona do kompresji g\u0142\u00f3wnego magazynu i mo\u017ce zapewni\u0107 \u015bredni poziom kompresji. Kompresja zrzut\u00f3w stron WAL zapewni \u015bredni poziom kompresji plik\u00f3w WAL, przy czym prawdopodobnie nawet zwi\u0119kszy wydajno\u015b\u0107. Kompaktowanie WAL nie wp\u0142ynie pozytywnie na wydajno\u015b\u0107, ale maksymalnie zmniejszy rozmiar plik\u00f3w WAL poprzez usuni\u0119cie fizycznych zapis\u00f3w.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sberbank\/blog\/502136\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0430\u0445. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0436\u0430\u0442\u0438\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443, \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0431\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81937,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81936","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\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\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\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u041e\u043f\u044b\u0442 \u0421\u0431\u0435\u0440\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\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-05-17T23:42:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-17T23:42:37+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\udd47Kompresja danych w Apache Ignite. Do\u015bwiadczenie Sber | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","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\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u041e\u043f\u044b\u0442 \u0421\u0431\u0435\u0440\u0430 | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","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-05-17T23:42:37+00:00","article:modified_time":"2020-05-17T23:42:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81936","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 15:47:30","updated":"2022-10-02 17:21:32","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\/81936","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=81936"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/81936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/81937"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=81936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=81936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=81936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}