{"id":82734,"date":"2020-05-24T13:42:22","date_gmt":"2020-05-24T11:42:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch"},"modified":"2020-05-24T13:42:22","modified_gmt":"2020-05-24T11:42:22","slug":"optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","title":{"rendered":"Optymalizacja obci\u0105\u017cenia w projekcie Highload za pomoc\u0105 ElasticSearch","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr! Nazywam si\u0119 Maksym Wasiljew, pracuj\u0119 jako analityk i mened\u017cer projekt\u00f3w w FINCH. Dzi\u015b chcia\u0142bym opowiedzie\u0107, jak dzi\u0119ki ElasticSearch uda\u0142o nam si\u0119 przetworzy\u0107 15 mln zapyta\u0144 w ci\u0105gu 6 minut i zoptymalizowa\u0107 codzienne obci\u0105\u017cenia na stronie jednego z naszych klient\u00f3w. Niestety, musimy obej\u015b\u0107 si\u0119 bez imion, poniewa\u017c mamy NDA, mam nadziej\u0119, \u017ce to nie wp\u0142ynie na tre\u015b\u0107 artyku\u0142u. Zaczynajmy.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Jak dzia\u0142a projekt<\/h2>\n<p>\nW naszym backendzie tworzymy us\u0142ugi, kt\u00f3re zapewniaj\u0105 funkcjonowanie stron internetowych i aplikacji mobilnej naszego klienta. Og\u00f3ln\u0105 struktur\u0119 mo\u017cna zobaczy\u0107 na schemacie:<\/p>\n<p><img decoding=\"async\" alt=\"Optymalizacja obci\u0105\u017cenia w projekcie Highload za pomoc\u0105 ElasticSearch\" src=\"\/wp-content\/uploads\/2020\/05\/7bda10a9965163c2b175b501f50bc342.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW trakcie pracy przetwarzamy du\u017c\u0105 ilo\u015b\u0107 transakcji: zakup\u00f3w, wyp\u0142at, operacji z saldami u\u017cytkownik\u00f3w, dla kt\u00f3rych przechowujemy wiele log\u00f3w, a tak\u017ce importujemy i eksportujemy te dane do zewn\u0119trznych system\u00f3w. <\/p>\n<p>Odbieramy tak\u017ce dane od klienta i przekazujemy je u\u017cytkownikom. Ponadto istniej\u0105 r\u00f3wnie\u017c procesy zwi\u0105zane z p\u0142atno\u015bciami i programami lojalno\u015bciowymi.<\/p>\n<h2>Kr\u00f3tka historia<\/h2>\n<p>\nPocz\u0105tkowo jako jedyne miejsce przechowywania danych u\u017cywali\u015bmy PostgreSQL. Jego standardowe zalety dla DBMS: istnienie transakcji, rozwini\u0119ty j\u0119zyk zapyta\u0144, bogate narz\u0119dzia do integracji; w po\u0142\u0105czeniu z dobr\u0105 wydajno\u015bci\u0105 d\u0142ugo zaspokaja\u0142y nasze potrzeby. <\/p>\n<p>Przechowywali\u015bmy w Postgres wszystko: od transakcji po wiadomo\u015bci. Jednak liczba u\u017cytkownik\u00f3w ros\u0142a, a wraz z ni\u0105 liczba zapyta\u0144.<\/p>\n<p><i>Dla por\u00f3wnania, w 2017 roku roczna liczba sesji tylko na wersji desktopowej wynosi\u0142a 131 mln. W 2018 roku \u2014 125 mln. W 2019 roku znowu 130 mln. Dodajcie do tego jeszcze 100-200 mln z mobilnej wersji strony oraz aplikacji mobilnej, a otrzymacie kolosaln\u0105 ilo\u015b\u0107 zapyta\u0144. <\/i><\/p>\n<p>Wraz ze wzrostem projektu, Postgres przesta\u0142 radzi\u0107 sobie z obci\u0105\u017ceniem, nie nad\u0105\u017cali\u015bmy \u2014 pojawi\u0142o si\u0119 wiele r\u00f3\u017cnorodnych zapyta\u0144, dla kt\u00f3rych nie mogli\u015bmy stworzy\u0107 wystarczaj\u0105cej liczby indeks\u00f3w. <\/p>\n<p>Rozumieli\u015bmy, \u017ce istnieje potrzeba innych baz danych, kt\u00f3re mog\u0142yby zaspokoi\u0107 nasze potrzeby i odci\u0105\u017cy\u0107 PostgreSQL. Jako mo\u017cliwe opcje rozwa\u017cali\u015bmy Elasticsearch i MongoDB. Ta ostatnia mia\u0142a kilka wad:<\/p>\n<ol>\n<li>Wolne tempo indeksowania w miar\u0119 wzrostu obj\u0119to\u015bci danych w indeksach. W przypadku Elastic pr\u0119dko\u015b\u0107 nie zale\u017cy od obj\u0119to\u015bci danych.<\/li>\n<li>Brak wyszukiwania pe\u0142notekstowego<\/li>\n<\/ol>\n<p>\nZdecydowali\u015bmy si\u0119 na Elastic i przygotowali\u015bmy si\u0119 do migracji. <\/p>\n<h2>Migracja do Elastic<\/h2>\n<p>\n1. Rozpocz\u0119li\u015bmy migracj\u0119 od us\u0142ugi wyszukiwania punkt\u00f3w sprzeda\u017cy. Nasz klient ma w sumie oko\u0142o 70 000 punkt\u00f3w sprzeda\u017cy, a jednocze\u015bnie wymaga kilku typ\u00f3w wyszukiwania na stronie i w aplikacji:<\/p>\n<ul>\n<li>Wyszukiwanie tekstowe wed\u0142ug nazwy miejscowo\u015bci<\/li>\n<li>Wyszukiwanie geograficzne w zadanym promieniu od okre\u015blonego punktu. Na przyk\u0142ad, je\u015bli u\u017cytkownik chce zobaczy\u0107, kt\u00f3re punkty sprzeda\u017cy s\u0105 najbli\u017cej jego domu.<\/li>\n<li>Wyszukiwanie w zadanym kwadracie \u2013 u\u017cytkownik zaznacza kwadrat na mapie, a system pokazuje wszystkie punkty w tym obszarze. <\/li>\n<li>Wyszukiwanie wed\u0142ug dodatkowych filtr\u00f3w. Punkty sprzeda\u017cy r\u00f3\u017cni\u0105 si\u0119 od siebie asortymentem. <\/li>\n<\/ul>\n<p>\nJe\u015bli chodzi o organizacj\u0119, to w Postgres mamy \u017ar\u00f3d\u0142o danych zar\u00f3wno dotycz\u0105ce mapy, jak i wiadomo\u015bci, a w Elastic tworzone s\u0105 Snapshoty z danych oryginalnych. Rzecz w tym, \u017ce pocz\u0105tkowo Postgres nie radzi\u0142 sobie z wyszukiwaniem wed\u0142ug wszystkich kryteri\u00f3w. Poza tym, \u017ce by\u0142o wiele indeks\u00f3w, mog\u0142y one r\u00f3wnie\u017c zachodzi\u0107 na siebie, dlatego planista Postgres gubi\u0142 si\u0119 i nie rozumia\u0142, kt\u00f3ry indeks powinien u\u017cy\u0107. <\/p>\n<p>2. Nast\u0119pn\u0105 do migracji by\u0142 dzia\u0142 wiadomo\u015bci. Na stronie ka\u017cdego dnia pojawiaj\u0105 si\u0119 publikacje, aby u\u017cytkownik nie zgubi\u0142 si\u0119 w strumieniu informacji, dane musz\u0105 by\u0107 sortowane przed wydaniem. W tym celu potrzebne jest wyszukiwanie: na stronie mo\u017cna szuka\u0107 wed\u0142ug dopasowania tekstowego, a jednocze\u015bnie pod\u0142\u0105cza\u0107 dodatkowe filtry, poniewa\u017c s\u0105 one r\u00f3wnie\u017c zrealizowane przez Elastic. <\/p>\n<p>3. Nast\u0119pnie przenie\u015bli\u015bmy przetwarzanie transakcji. U\u017cytkownicy mog\u0105 kupowa\u0107 okre\u015blone towary na stronie i bra\u0107 udzia\u0142 w losowaniach nagr\u00f3d. Po takich zakupach przetwarzamy du\u017c\u0105 ilo\u015b\u0107 danych, szczeg\u00f3lnie w weekendy i \u015bwi\u0119ta. Dla por\u00f3wnania, je\u015bli w zwyk\u0142e dni liczba zakup\u00f3w wynosi oko\u0142o 1,5-2 mln, to w \u015bwi\u0119ta mo\u017ce osi\u0105gn\u0105\u0107 53 mln.<\/p>\n<p>Jednocze\u015bnie dane musz\u0105 by\u0107 przetwarzane w jak najkr\u00f3tszym czasie \u2014 u\u017cytkownicy nie lubi\u0105 czeka\u0107 na wyniki przez kilka dni. Przez Postgres takich termin\u00f3w nie da si\u0119 osi\u0105gn\u0105\u0107 \u2014 cz\u0119sto mieli\u015bmy zablokowania, a podczas przetwarzania wszystkich zapyta\u0144 u\u017cytkownicy nie mogli sprawdzi\u0107, czy otrzymali nagrody, czy nie. To nie jest przyjemne dla biznesu, dlatego przenie\u015bli\u015bmy przetwarzanie do Elasticsearch.<\/p>\n<h2>Cz\u0119stotliwo\u015b\u0107<\/h2>\n<p>\nAktualizacje s\u0105 obecnie ustawione na zdarzenie, wed\u0142ug nast\u0119puj\u0105cych warunk\u00f3w:<\/p>\n<ol>\n<li>Punkty sprzeda\u017cy. Gdy tylko otrzymujemy dane z zewn\u0119trznego \u017ar\u00f3d\u0142a, natychmiast uruchamiamy aktualizacj\u0119. <\/li>\n<li>Aktualno\u015bci. Gdy tylko na stronie jest edytowana jakakolwiek wiadomo\u015b\u0107, automatycznie wysy\u0142a si\u0119 ona do Elastic.<\/li>\n<\/ol>\n<p>\nRaz jeszcze warto wspomnie\u0107 o zaletach Elastic. W Postgresie podczas wysy\u0142ania zapytania trzeba czeka\u0107, a\u017c uczciwie przetworzy wszystkie zapisane dane. W Elastic mo\u017cna wys\u0142a\u0107 10 tys. wpis\u00f3w i od razu zacz\u0105\u0107 pracowa\u0107, nie czekaj\u0105c, a\u017c dane rozprzestrzeni\u0105 si\u0119 po wszystkich Shardach. Oczywi\u015bcie jaki\u015b Shard lub Replica mog\u0105 nie zobaczy\u0107 danych od razu, ale bardzo szybko wszystko b\u0119dzie dost\u0119pne.<\/p>\n<h2>Sposoby integracji<\/h2>\n<p>\nS\u0105 dwa sposoby integracji z Elastic:<\/p>\n<ol>\n<li>Przez natywny klient za pomoc\u0105 TCP. Natywny sterownik powoli si\u0119 wygasza: przestaje by\u0107 wspierany, ma tak\u017ce bardzo niewygodn\u0105 sk\u0142adni\u0119. Dlatego praktycznie go nie u\u017cywamy i staramy si\u0119 ca\u0142kowicie od niego odst\u0105pi\u0107.<\/li>\n<li>Przez interfejs HTTP, w kt\u00f3rym mo\u017cna u\u017cywa\u0107 zar\u00f3wno zapyta\u0144 JSON, jak i sk\u0142adni Lucene. To ostatnie to silnik tekstowy, kt\u00f3ry wykorzystuje Elastic. W tej opcji uzyskujemy mo\u017cliwo\u015b\u0107 Batch przez zapytania JSON za pomoc\u0105 HTTP. To w\u0142a\u015bnie t\u0119 opcj\u0119 staramy si\u0119 wykorzysta\u0107.<\/li>\n<\/ol>\n<p>\nDzi\u0119ki interfejsowi HTTP mo\u017cemy korzysta\u0107 z bibliotek, kt\u00f3re oferuj\u0105 asynchroniczn\u0105 implementacj\u0119 klienta HTTP. Mo\u017cemy wykorzysta\u0107 przewag\u0119 Batch i asynchronicznego API, co ostatecznie zapewnia wysok\u0105 wydajno\u015b\u0107, kt\u00f3ra bardzo pomog\u0142a w dniach du\u017cej akcji (o tym poni\u017cej)<\/p>\n<p>Troch\u0119 danych do por\u00f3wnania: <\/p>\n<ul>\n<li>Zachowanie u\u017cytkownik\u00f3w, kt\u00f3rzy otrzymali nagrody w Postgresie w 20 strumieniach bez grupowania: 460713 wpis\u00f3w w 42 sekundy<\/li>\n<li>Elastic + klient reaktywny w 10 strumieniach + batch na 1000 element\u00f3w: 596749 wpis\u00f3w w 11 sekund<\/li>\n<li>Elastic + klient reaktywny w 10 strumieniach + batch na 1000 element\u00f3w: <b>23801684 wpis\u00f3w w 4 minuty<\/b><\/li>\n<\/ul>\n<p>\nObecnie napisali\u015bmy mened\u017cera zapyta\u0144 po HTTP, kt\u00f3ry buduje JSON, jako Batch\/nie Batch i wysy\u0142a przez dowolnego klienta HTTP, niezale\u017cnie od biblioteki. Mo\u017cna r\u00f3wnie\u017c wybiera\u0107, czy wysy\u0142a\u0107 zapytania synchronicznie czy asynchronicznie.<\/p>\n<p>W niekt\u00f3rych integracjach wci\u0105\u017c korzystamy z oficjalnego transport clienta, ale to tylko kwestia najbli\u017cszego refaktoryzacji. Przy tym do przetwarzania u\u017cywany jest w\u0142asny klient zbudowany na bazie Spring WebClient.<\/p>\n<p><img decoding=\"async\" alt=\"Optymalizacja obci\u0105\u017cenia w projekcie Highload za pomoc\u0105 ElasticSearch\" src=\"\/wp-content\/uploads\/2020\/05\/112bf3261c93ce585d8559b420e79f64.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Du\u017ca akcja<\/h2>\n<p>\nRaz w roku na projekcie odbywa si\u0119 du\u017ca akcja dla u\u017cytkownik\u00f3w \u2014 to ten sam Highload, poniewa\u017c w tym czasie pracujemy z dziesi\u0105tkami milion\u00f3w u\u017cytkownik\u00f3w jednocze\u015bnie.<\/p>\n<p>Zwykle szczyty obci\u0105\u017cenia wyst\u0119puj\u0105 w dni \u015bwi\u0105teczne, ale ta akcja to zupe\u0142nie inny poziom. W roku przedostatnim, w dniu akcji, sprzedali\u015bmy 27 580 890 sztuk towaru. Dane by\u0142y przetwarzane przez ponad p\u00f3\u0142 godziny, co powodowa\u0142o niedogodno\u015bci dla u\u017cytkownik\u00f3w. U\u017cytkownicy otrzymali nagrody za udzia\u0142, ale sta\u0142o si\u0119 jasne, \u017ce proces nale\u017cy przyspieszy\u0107. <\/p>\n<p>Na pocz\u0105tku 2019 roku postanowili\u015bmy, \u017ce potrzebujemy ElasticSearch. Przez ca\u0142y rok organizowali\u015bmy przetwarzanie otrzymywanych danych w Elastic i ich wydanie w API mobilnej aplikacji i stronie internetowej. W rezultacie w nast\u0119pnym roku podczas akcji przetworzyli\u015bmy <b>15 131 783 rekord\u00f3w w 6 minut. <\/b><\/p>\n<p>Poniewa\u017c mamy wielu ch\u0119tnych na zakup towaru i udzia\u0142 w losowaniu nagr\u00f3d podczas akcji, to jest to rozwi\u0105zanie tymczasowe. Aktualnie wysy\u0142amy bie\u017c\u0105ce informacje do Elastic, ale w przysz\u0142o\u015bci planujemy przenie\u015b\u0107 archiwalne dane z poprzednich miesi\u0119cy do Postgres jako sta\u0142ego magazynu. Aby nie zanieczyszcza\u0107 indeksu Elastic, kt\u00f3ry r\u00f3wnie\u017c ma swoje ograniczenia.<\/p>\n<h2>Podsumowanie\/Wnioski<\/h2>\n<p>\nNa obecn\u0105 chwil\u0119 przenie\u015bli\u015bmy do Elastic wszystkie us\u0142ugi, kt\u00f3re chcieli\u015bmy, i na tym chwilowo zrobili\u015bmy przerw\u0119. Obecnie budujemy indeks w Elastic na podstawowym trwa\u0142ym magazynie w Postgres, kt\u00f3ry przyjmuje obci\u0105\u017cenia u\u017cytkownik\u00f3w.<\/p>\n<p>W przysz\u0142o\u015bci planujemy przenosi\u0107 us\u0142ugi, je\u015bli zrozumiemy, \u017ce zapytania o dane staj\u0105 si\u0119 zbyt r\u00f3\u017cnorodne i s\u0105 wyszukiwane po nieograniczonej liczbie kolumn. To ju\u017c zadanie nie dla Postgres.<\/p>\n<p>Je\u015bli b\u0119dziemy potrzebowa\u0107 wyszukiwania pe\u0142notekstowego w funkcjonalno\u015bci lub je\u015bli pojawi si\u0119 wiele r\u00f3\u017cnorodnych kryteri\u00f3w wyszukiwania, to ju\u017c wiemy, \u017ce trzeba to przenie\u015b\u0107 do Elastic.<\/p>\n<h2>\u2318\u2318\u2318<\/h2>\n<p>\nDzi\u0119kuj\u0119 za przeczytanie. Je\u015bli w Waszej firmie r\u00f3wnie\u017c u\u017cywa si\u0119 ElasticSearch i macie w\u0142asne przypadki wdro\u017ce\u0144, to podzielcie si\u0119 nimi. B\u0119dzie ciekawie dowiedzie\u0107 si\u0119, jak to robi\u0105 inni \ud83d\ude42<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/503214\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ElasticSearch, \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c 15 \u043c\u043b\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430 6 \u043c\u0438\u043d\u0443\u0442 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0438\u043c\u0451\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 NDA, \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":82735,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-82734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH.\" \/>\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\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch\" \/>\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\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Highload-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ElasticSearch | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch\" \/>\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-24T11:42:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-24T11:42:22+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\udd47Optymalizacja obci\u0105\u017cenia na projekcie Highload za pomoc\u0105 ElasticSearch | ProHoster","description":"Cze\u015b\u0107, Habr! Nazywam si\u0119 Maksym Wasiliew, pracuj\u0119 jako analityk i mened\u017cer projekt\u00f3w w FINCH.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","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\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Highload-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ElasticSearch | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","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-24T11:42:22+00:00","article:modified_time":"2020-05-24T11:42:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"82734","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:32:25","updated":"2022-09-28 21:13:07","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\/82734","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=82734"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/82734\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/82735"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=82734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=82734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=82734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}