Zaczniemy współpracować z najlepszymi praktykami do naśladowania z ElasticSearch i jakie problemy może stworzyć, gdy unikniemy tych punktów. Zacznijmy.
Zawsze definiuj mapowania ES
Jedną rzeczą może z pewnością zrobić, działa bez mapowania. Tak więc, kiedy zaczniesz podawać dane JSON do indeksu ES, będzie ono iterowane przez pola danych i tworzy odpowiednie mapowanie. Wydaje się to bezpośrednie i łatwe, ponieważ ES wybiera sam typ danych. Na podstawie danych możesz potrzebować pola, aby mieć określony typ danych.
Załóżmy na przykład, że indeksujesz następujący dokument:
„ID”: 1,
„Tytuł”: „Zainstaluj ElasticSearch na Ubuntu”,
„Link”: „https: // Linuxhint.com/install-elasticsearch-ubuntu/",
„Data”: „2018-03-25”
W ten sposób ElasticSearch zaznaczy pole „daty” jako typ „daty”. Ale kiedy indeksujesz następujący dokument:
„ID”: 1,
„Tytuł”: „Najlepsze praktyki i wydajność ES”,
„Data”: „Oczekuje”
Tym razem typ pola daty został zmieniony, a ES rzuci błąd i nie pozwoli na indeksowanie dokumentu. Aby ułatwić, możesz zindyować kilka dokumentów, zobaczyć, jakie pola są indeksowane przez ES i pobrać mapowanie z tego adresu URL:
Get/index_name/doc_type/_mapping
W ten sposób nie będziesz musiał również konstruować pełnego mapowania.
Flagi produkcyjne
Wywołana jest domyślna nazwa klastra, którą uruchamia ES ElasticSearch. Kiedy masz dużo węzłów w swoim klastrze, dobrym pomysłem jest zachowanie flag nazewnictwa tak spójnego, jak to możliwe, na przykład:
grupa.Nazwa: app_es_production
węzeł.Nazwa: app_es_node_001
Oprócz tego, ustawienia odzyskiwania węzłów również bardzo mają znaczenie. Załóżmy, że niektóre węzły w ponownym uruchomie. Aby utrzymać dane spójne między wszystkimi tymi węzłami, będziemy musieli uruchomić program spójności, który utrzyma wszystkie klastry w stałym stanie.
wejście.Recovery_after_nodes: 10
Jest to również pomocne, gdy z góry powiesz klaster, ile węzłów będzie obecnych w klastrze i ile czasu odzyskiwania będą potrzebować:
wejście.Oczekiwane_nody: 20
wejście.Recovery_after_Time: 7m
Dzięki prawidłowej konfiguracji odzyskanie, które zajęłoby godziny, może zająć zaledwie minutę i może zaoszczędzić dużo pieniędzy dla każdej firmy.
Udostępnianie pojemności
Ważne jest, aby wiedzieć, ile miejsca zajmie twoje dane, i szybkość, z jaką przepływają do elasticsearch, ponieważ decyduje o ilości pamięci RAM, której będziesz potrzebować w każdym węźle klastra i węzła głównego również.
Oczywiście nie ma konkretnych wytycznych do osiągnięcia potrzebnych liczb, ale możemy podjąć pewne kroki, które dają nam dobry pomysł. Jednym z kroków będzie symulować Kazanie użycia. Zrób klaster ES i zasil go niemal taką samą szybkością danych, jak można się spodziewać po konfiguracji produkcji. Koncepcja Rozpocznij duże i skaluj może również pomóc Ci być konsekwentnym w kwestii potrzebnego miejsca.
Duże szablony
Po zdefiniowaniu indeksowanych dużych szablonów zawsze będziesz musiał stawić czoła problemom związanym z synchronizacją szablonu w różnych węzłach klastra. Zawsze zauważ, że szablon będzie musiał zostać ponownie zdefiniowany, gdy nastąpi zmiana modelu danych. To znacznie lepszy pomysł Zachowaj szablony jako dynamiczne. Dynamiczne szablony automatycznie aktualizują mapowania pola na podstawie mapowań, które zdefiniowaliśmy wcześniej i nowe pola. Zauważ, że nie ma substytutu utrzymywania szablonów tak małych, jak to możliwe.
2 Using Mlockall na serwerach Ubuntu
Linux wykorzystuje proces zamiany, gdy potrzebuje pamięci na nowe strony. Zmienanie sprawia, że rzeczy jest powolne, ponieważ dyski są wolniejsze niż pamięć. Mlockall Właściwość w konfiguracji ES mówi ES, aby nie wymieniał swoich stron z pamięci, nawet jeśli nie są one na razie wymagane. Ta właściwość można ustawić w pliku YAML:
Bootstrap.Mlockall: True
W ES V5.Wersje X+, ta właściwość zmieniła się na:
Bootstrap.pamięć_lock: true
Jeśli używasz tej właściwości, upewnij się, że zapewniasz ES wystarczająco dużą pozycję sterty za pomocą -Dxmx opcja lub ES_HEAP_SIZE.
Minimalizuj aktualizacje mapowania
Wydajność klastra jest nieco dotknięta za każdym razem, gdy dokonujesz żądań aktualizacji mapowania w klastrze ES. Jeśli nie możesz tego kontrolować i nadal chcesz dokonywać aktualizacji mapowań, możesz użyć właściwości w pliku konfiguracji ES YAML:
wskaźniki.grupa.send_refresh_mapping: false
Gdy żądanie aktualizacji modelu jest w kolejce dla węzła głównego i wysyła dane ze starym mapowaniem do węzłów, musi również wysłać żądanie aktualizacji do wszystkich węzłów. To może sprawić, że wszystko jest powolne. Kiedy ustawiamy powyższą właściwość na false, ma to sens mistrzowski, że aktualizacja została wprowadzona do mapowania i nie wysyła żądania aktualizacji do węzłów. Zauważ, że jest to pomocne tylko wtedy, gdy regularnie wprowadzasz wiele zmian w mapowaniach.
Zoptymalizowany pul
Węzły ES mają wiele pul wątków, aby poprawić sposób zarządzania wątkami w węźle. Ale istnieją ograniczenia dotyczące tego, ile danych może zadbać każdy wątek. Aby śledzić tę wartość, możemy użyć właściwości ES:
pula wątków.cielsko.Queue_Size: 2000
Informuje to liczbę żądań w odłamku, które można ustalić w kolejce do wykonania w węźle, gdy nie jest dostępny wątek do przetworzenia żądania. Jeśli liczba zadań wzrośnie wyżej niż ta wartość, otrzymasz RETOTETRANSPORPORTException. Im wyższa ta wartość, tym wyższa ilość sterty będzie potrzebna na maszynie węzłów, a sterta JVM również zostanie zużyta. Powinieneś również mieć gotowy kod na wypadek, gdyby ten wyjątek został rzucony.
Wniosek
W tej lekcji przyjrzeliśmy się, w jaki sposób możemy poprawić wydajność elasticearch, unikając popularnych i niezbyt powotyłkowych błędów. Przeczytaj więcej artykułów ElasticSearch na Linuxhint.