Wymagania
- Wymagana jest usługa Elasticsearch w wersji 7 (uruchamiana w poniższej sekcji Konfiguracja i punkcie 3).
Instalacja
Szkolenie z instalacji i konfiguracji ElasticSearch-20231121_100214-Nagrywanie spotkania.mp4
Konfiguracja
- Wymagana jest instalacja Dockera wraz z Docker Compose.
- W repozytorium kodu (lub docker-compose.yml) plusworkflow/plusworkflow-core znajduje się docker-compose.yml do uruchomienia elastica i Kibany lokalnie.
- W celu zmiany nazwy użytkownika i hasła do usługi należy zmodyfikować parametry ELASTIC_USERNAME i ELASTIC_PASSWORD w sekcji elasticsearch w pliku docker-compose.yml.
Należy też zmienić parametry ELASTICSEARCH_USERNAME i ELASTICSEARCH_PASSWORD sekcji kibana powyższego pliku (połączenie Kibany z usługą Elastica). Będąc w lokalizacji powyższego pliku docker-compose.yml należy wywołać:
docker compose up
Trzeba ustawić flagę w experimental.properties:
elasticProcessSearch=true
Dodać plik w katalogu domowym w configu: elastic.properties o zawartości:
elastic.hostname=localhost elastic.port=9200 elastic.username=elastic elastic.password=elastic #Opcjonalne elastic.environment= elastic.protocol=
- Opcjonalnie można podać parametr elastic.environment, który jest przydatny w przypadku jednej usługi Elasticsearch dla kilku instancji systemu. Podajemy w nim unikalną nazwę dla każdej z tych instancji.
Nazwa nie może zawierać następujących znaków: spacja, ", *, \, <, |, ,, >, /, ? Opcjonalnie można podać parametr elastic.protocol, który określa, czy komunikacja z usługą Elasticsearch powinna odbywać się po HTTPS, czy HTTP (W zależności od ustawień serwera). Podajemy w nim wartość https lub http. W przypadku braku parametru, komunikacja odbywa się domyślnie po HTTP.
Uwaga
Jeżeli komunikacja z Elasticsearch odbywa się po HTTPS, to należy uzupełnić parametr elastic.protocol wartością https.
Aby komunikacja z usługą działała poprawnie, należy wgrać ważny certyfikat do systemu. Można skorzystać z systemowej zakładki Certyfikaty.- Włączyć parametr systemowy ElasticEnabled (jeśli istnieje)
Dodać zadanie zaplanowane o nazwie: Indeksowanie procesów i zadań. Po jego uruchomieniu zastaną zaindeksowane wszystkie procesy i zadania.
Zadanie powinno być uruchamiane na żądanie, nie powinno być ustawione jako cykliczne. Najczęściej uruchamiamy je przy nowej instancji Elastica dla istniejącego systemu (w celu przesłania danych do Elastica), nowe dane są przesyłane na bieżąco. W przypadku wystąpienia rozbieżności w danych w Elasticu pomocne jest uruchomienie zadania.
Zadanie posiada parametr "Rozmiar części", który odpowiada za dzielenie indeksowanych danych. Manipulując nim można mieć wpływ na szybkość wykonywania zadania.
Zadanie po przetworzeniu każdej z części zapisuje w parametrze zadania "ID ostatniego zaindeksowanego zadania" ID ostatniego zaindeksowanego zadania z paczki. W przypadku wystąpienia błędu podczas wykonywania zadania i po jego ponownym uruchomieniu zadanie wznowi indeksowanie od ID procesu zapisanego w parametrze. W celu zresetowania zadania, należy jako wartość parametru podać 0. Po pomyślnym wykonaniu zadania wartość parametru jest ustawiana na 0.
Zadanie posiada mechanizm powtarzania indeksowania danych w Elasticu (w przypadku np. wystąpienia problemów z połączeniem). Parametr "Ilość ponownych prób" określa ile razy będzia powtarzana próba wysłania danych do Elastica, a "Czas oczekiwania na ponowną próbę" określa czas między kolejnymi próbami.Parametr Maksymalny czas indeksowania pozwala określić jak długo maksymalnie ma wykonywać się zadanie (w godzinach). Domyślna wartość to 96 godzin.
Parametr Usuwaj indeksy decyduje, czy przed rozpoczęciem indeksowania usunąć wszystkie indeksy (przy pierwszym uruchomieniu zadania).
Dodać zadanie zaplanowane o nazwie: Usuwanie indeksów procesów i zadań, które zaleca się uruchamiać przy każdej potrzebie przeindeksowania procesów i zadań (przed uruchomieniem powyżej opisanego zadania). Zadanie usuwa wszystkie indeksu w Elasticsearch i nie powinno być uruchamiane jako cykliczne.
Dodać zadanie zaplanowane o nazwie: Indeksowanie brakujących procesów i zadań, które indeksuje procesy/zadania, niezaindeksowane w Elasticsearch np. z powodu problemów z połączeniem z elasticiem. Zadanie powinno być ustawione jako cykliczne.
Zadanie sprawdza czy w tabeli pm_elastic_missing_docs są jakiekolwiek wpisy, jeśli tak to następuje próba ich ponownego zaindeksowania w Elasticsearch. Pożądanym stanem jest pusta wcześniej wspomniana tabela.
Rekomendacje sprzętowe
- Zalecane jest stosowanie dysków SSD na maszynie, gdzie znajduje się usługa Elastic.
- Ilość pamięci RAM to minimum 8GB. Zaleca się, by pamięć RAM wynosiła 16-64GB. Należy zwrócić uwagę jaką pamięcią dysponuje kontener Elastica.
Jeśli usługa Elastica znajduje się w innej lokalizacji niż system Plusworkflow należy umożliwić połączenie o jak największej przepustowości pomiędzy nimi.
Elastic na środowisku produkcyjnym
W przypadku używania ElasticSearch na środowisku produkcyjnym zaleca się ustawić vm.max_map_count na co najmniej 262144
Linux:
grep vm.max_map_count /etc/sysctl.confsysctl -w vm.max_map_count=262144
Problemy z wydajnością indeksowania oraz pamięcią
- Zwiększyć wartość -Xmx parametru ES_JAVA_OPTS sekcji elasticsearch w pliku docker-compose.yml na odpowiednio wyższą wartość.
Kontener elastica należy zaktualizować przy użyciu polecenia:
docker compose up
- W przypadku, gdy usługa Elastica znajduje się na serwerze w innej lokalizacji można zmniejszać wartość parametru "Rozmiar części" zadania zaplanowanego do indeksowania. Spowoduje to zmniejszenie requesta przesyłanego do Elastica.
Spróbować zwiększyć limit przepustowości w Kibanie z poziomu zakładki Management -> Dev Tools wywołując (domyślnie jest to 20mb):
PUT /_cluster/settings { "persistent" : { "indices.store.throttle.max_bytes_per_sec" : "100mb" } }
Na czas indeksowania można też dokonać następującej zmiany:
PUT /_cluster/settings { "transient" : { "indices.store.throttle.type" : "none" } }
Po skończonym indeksowaniu należy ustawić wartość "merge" tym samym poleceniem.
- Wyłączenie swapping dla większej stabilności node'a https://www.elastic.co/guide/en/elasticsearch/reference/7.17/setup-configuration-memory.html
Obsługa Kibany
- Kibana uruchomiona z powyższej konfiguracji dostępna jest pod adresem: http://localhost:5601/ Dane dostępowe takie jak w elastic.properties powyżej.
Przy pierwszym uruchomieniu Kibany trzeba ustawić patterny dla indeksów (process* dla procesów i activity* dla zadań).
- Zaindeksowane dokumenty przeglądamy w zakładce Discovery.
- W przypadku problemów ze zgodnością danych w elasticu (np. po zmianie typu jakiegoś indeksowanego pola) należy przejść do:
Management -> Stack Management -> IndexManagement
zaznaczyć wszystko (Include rollup indices i Include hidden indices muszą być odznaczone) i wybrać delete indices. Następnie trzeba przeindeksować wszystkie dokumenty zadaniem zaplanowanym.
W przypadku wystąpienia błędu:
Validation Failed: 1: this action would add [2] shards, but this cluster currently has [1000]/[1000] maximum normal shards open;
Należy zwiększyć parametr cluster.max_shards_per_node w Kibanie z poziomu zakładki Management -> Dev Tools wywołując:
PUT /_cluster/settings { "persistent" : { "cluster.max_shards_per_node": "2000" } }
Zadanie zaplanowane automatycznie dostosowuje wartość powyższego parametru (na podstawie liczby definicji procesów/zadań), jednak może być potrzeba ręcznej jego zmiany (np. w przypadku kilku instancji systemu na jednym elasticu).
W przypadku wystąpienia błędu (może wystąpić podczas usuwania procesów):
Trying to create too many scroll contexts. Must be less than or equal to: [500]
Należy zwiększyć parametr search.max_open_scroll_context w Kibanie z poziomu zakładki Management -> Dev Tools wywołując:
PUT /_cluster/settings { "persistent" : { "search.max_open_scroll_context": 10000 } }
Usuwanie wiele indeksów na raz
UWAGA. Usuwanie wielu indeksów bez znajomości składni może skutkować usunięciem nadmiarowej ilości danych.
Domyślnie opcja usuwania wielu niejednoznacznych indeksów jest wyłączona.
Aby móc korzystać z takiej opcji należy wywołać:PUT /_cluster/settings { "transient": { "action.destructive_requires_name":false } }
Przykłady:
Usuwanie indeksów z prefixem activity:
DELETE /activity*
Usuwanie wszystkich indeksów (ukryte indeksy nie zostaną usunięte):
DELETE _all
Obsługa Dockera
Usuwanie kontenerów - Będąc w lokalizacji pliku docker-compose.yml należy wywołać:
docker compose down
Jeżeli chcemy również usunąć wolumen ze wszystkimi danymi wywołujemy z opcją -v
docker compose down -v
Jeżeli chcemy utworzyć kontenery bez wyświetlania logów, dodajemy komendę -d
docker compose up -d
Aby wyświetlić status kontenerów należy wykonać:
docker stats
Uwagi
- Po usunięciu/anulowaniu procesu lub zawieszeniu/anulowaniu/przywróceniu zadania z poziomu widoku wyników wyszukiwania daną mogą nie być spójne, należy ponowne wyszukać.
- Wyszukiwanie zadań z użyciem pól związanych z terminami ostatecznymi nie wyszukuje tylko zadań z terminami ostatecznymi.
- Zmienne tabelaryczne są wyświetlane wyłącznie w ramach jednego wiersza.
Jeśli wystąpi poniższy błąd podczas eksportu wyników wyszukiwania do pliku:
java.io.IOException: entity content is too long [356732089] for the configured buffer limit [104857600]
to należy zmniejszyć wartość parametru systemowego PackSizeInAdvanceSearchExport.
Błąd ten oznacza, że request przesyłany do Elastica jest za duży (domyślnie jest to 100 MB). Istnieje możliwość zwiększenia tego limitu po stronie Elastica (bez zmniejszania parametru systemowego), jednak jest to niezalecane.
Limit można zwiększyć w pliku docker-compose.yml w sekcji elasticsearch -> environment, dodając linijkę:
"http.max_content_length": "200mb"
z odpowiednią wartością rozmiaru request'a. Kontener elastica należy zaktualizować przy użyciu polecenia:
docker compose up
Przydatne linki:
- Jak działa elastic - https://www.elastic.co/blog/found-elasticsearch-top-down
- Multi-nodes docker - https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-dev-mode
- Wydajność - https://www.elastic.co/guide/en/elasticsearch/reference/8.6/tune-for-indexing-speed.html
https://www.elastic.co/guide/en/elasticsearch/guide/master/indexing-performance.html - Optymalizacja wyszukiwania - https://www.elastic.co/blog/found-optimizing-elasticsearch-searches/
- Wymagania sprzętowe - https://www.elastic.co/guide/en/elasticsearch/guide/master/hardware.html
- Optymalizacja pamięci - https://www.elastic.co/guide/en/elasticsearch/reference/7.17/setup-configuration-memory.html