An Elasticsearch Tutorial: Getting Started

#Uwaga: Elastic niedawno ogłosił, że wdroży licencjonowanie closed-source dla nowych wersji Elasticsearch i Kibana po wersji 7.9. Aby uzyskać więcej szczegółów, przeczytaj komentarze naszego CEO Tomera Levy’ego w Truly Doubling Down on Open Source.

Elasticsearch jest żywym sercem najpopularniejszej obecnie platformy do analizy logów – ELK Stack (Elasticsearch, Logstash i Kibana). Rola Elasticsearcha jest tak kluczowa, że stał się on synonimem nazwy samego stosu. Przeznaczony głównie do wyszukiwania i analizy logów, Elasticsearch jest dziś jednym z najpopularniejszych systemów bazodanowych dostępnych na rynku. Ten przewodnik po Elasticsearch dostarcza nowym użytkownikom niezbędnej wiedzy i narzędzi do rozpoczęcia pracy z Elasticsearch. Zawiera on instrukcje instalacji oraz instrukcje dotyczące początkowego indeksowania i obsługi danych.

Co to jest Elasticsearch?

Pierwotnie wydany w 2010 roku, Elasticsearch (czasami nazywany ES) jest nowoczesnym silnikiem wyszukiwania i analizy, który jest oparty na Apache Lucene. Elasticsearch jest całkowicie open source’ową bazą danych typu NoSQL. Oznacza to, że przechowuje dane w sposób nieustrukturyzowany i że nie można używać SQL do zadawania zapytań.

Ten samouczek Elasticsearch może być również uznany za samouczek NoSQL. Jednak w przeciwieństwie do większości baz danych NoSQL, Elasticsearch kładzie duży nacisk na możliwości i funkcje wyszukiwania – do tego stopnia, że najprostszym sposobem na uzyskanie danych z ES jest wyszukiwanie ich za pomocą rozbudowanego API Elasticsearch.

W kontekście analizy danych, Elasticsearch jest używany razem z innymi komponentami stosu ELK, Logstash i Kibana, i pełni rolę indeksowania i przechowywania danych.

Instalacja Elasticsearch

Wymagania dla Elasticsearch są proste: Java 8 (zalecana konkretna wersja: Oracle JDK w wersji 1.8.0_131). Spójrz na ten samouczek Logstash, aby upewnić się, że jesteś ustawiony. Upewnij się również, że Twój system operacyjny znajduje się na macierzy wsparcia Elastic, w przeciwnym razie możesz napotkać dziwne i nieprzewidywalne problemy. Po wykonaniu tych czynności, możesz zacząć od zainstalowania Elasticsearch.

Możesz pobrać Elasticsearch jako samodzielną dystrybucję lub zainstalować go używając repozytoriów apt i yum. My zainstalujemy Elasticsearch na maszynie Ubuntu 16.04 działającej na AWS EC2 używając apt.

Najpierw należy dodać klucz podpisujący Elastic, aby można było zweryfikować pobrany pakiet (pomiń ten krok, jeśli już zainstalowałeś pakiety z Elastic):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

W przypadku Debiana musimy następnie zainstalować pakiet apt-transport-https:

sudo apt-get install apt-transport-https

Następnym krokiem jest dodanie definicji repozytorium do systemu:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Wystarczy już tylko zaktualizować repozytoria i zainstalować Elasticsearch:

sudo apt-get updatesudo apt-get install elasticsearch

Konfigurowanie Elasticsearch

Konfiguracja Elasticsearch odbywa się za pomocą pliku konfiguracyjnego, którego lokalizacja zależy od systemu operacyjnego. W tym pliku można skonfigurować ustawienia ogólne (np. nazwa węzła), jak również ustawienia sieciowe (np. host i port), gdzie dane są przechowywane, pamięć, pliki dziennika i inne.

Dla celów rozwojowych i testowych, domyślne ustawienia będą wystarczające, ale zalecane jest, aby zrobić kilka badań na temat ustawień, które należy ręcznie zdefiniować przed przejściem do produkcji.

Na przykład, szczególnie w przypadku instalacji Elasticsearch w chmurze, dobrą praktyką jest powiązanie Elasticsearch z prywatnym IP lub localhost:

sudo vim /etc/elasticsearch/elasticsearch.ymlnetwork.host: "localhost"http.port:9200

Uruchamianie Elasticsearch

Elasticsearch nie będzie uruchamiany automatycznie po instalacji i trzeba będzie go uruchomić ręcznie. Sposób uruchomienia Elasticsearch będzie zależał od konkretnego systemu. Na większości systemów opartych na Linuksie i Uniksie możesz użyć tej komendy:

sudo service elasticsearch start

I to wszystko! Aby potwierdzić, że wszystko działa poprawnie, po prostu skieruj curl lub przeglądarkę na http://localhost:9200, a powinieneś zobaczyć coś takiego jak poniższe wyjście:

{ "name" : "33QdmXw", "cluster_name" : "elasticsearch", "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ", "version" : { "number" : "6.1.2", "build_hash" : "5b1fea5", "build_date" : "2018-01-10T02:35:59.208Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}

Aby zdebugować proces uruchamiania Elasticsearch, użyj plików dziennika Elasticsearch znajdujących się (na Debie) w /var/log/elasticsearch/.

Tworzenie indeksu Elasticsearch

Indeksowanie jest procesem dodawania danych do Elasticsearch. Dzieje się tak dlatego, że kiedy wprowadzamy dane do Elasticsearch, są one umieszczane w indeksach Apache Lucene. Ma to sens, ponieważ Elasticsearch używa indeksów Lucene do przechowywania i pobierania swoich danych. Chociaż nie musisz wiedzieć zbyt wiele o Lucene, pomocna jest wiedza na temat jego działania, gdy zaczynasz poważnie zajmować się Elasticsearch.
Elasticsearch zachowuje się jak REST API, więc możesz użyć metody POST lub PUT, aby dodać do niego dane. Używasz PUT, gdy znasz lub chcesz określić id elementu danych, lub POST, jeśli chcesz, aby Elasticsearch wygenerował id dla elementu danych:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "timestamp": "2018-01-24 12:34:56", "message": "User logged in", "user_id": 4, "admin": false}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ "id": 4, "username": "john", "last_login": "2018-01-25 12:34:56"}'

I odpowiedź:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

Dane dla dokumentu są wysyłane jako obiekt JSON. Być może zastanawiasz się, jak możemy indeksować dane bez definiowania ich struktury. Cóż, w Elasticsearch, tak jak w każdej innej bazie danych NoSQL, nie ma potrzeby wcześniejszego definiowania struktury danych. Aby jednak zapewnić optymalną wydajność, możesz zdefiniować mapowania Elasticsearch w zależności od typów danych. Więcej na ten temat później.

Jeśli używasz któregoś z shipperów Beats (np. Filebeat lub Metricbeat) lub Logstash, te części ELK Stack automatycznie utworzą indeksy.

Aby zobaczyć listę indeksów Elasticsearch, użyj:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

Lista w tym przypadku zawiera indeksy, które utworzyliśmy powyżej, indeks Kibana i indeks utworzony przez potok Logstash.

Kwerendy do Elasticsearch

Po zaindeksowaniu danych w Elasticsearch, możesz zacząć je przeszukiwać i analizować. Najprostszym zapytaniem, jakie możesz wykonać, jest pobranie pojedynczego elementu. Przeczytaj nasz artykuł poświęcony wyłącznie zapytaniom Elasticsearch.

Ponownie, poprzez Elasticsearch REST API, używamy GET:

curl -XGET 'localhost:9200/app/users/4?pretty'

I odpowiedź:

{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 1, "found" : true, "_source" : { "id" : 4, "username" : "john", "last_login" : "2018-01-25 12:34:56" }}

Pola zaczynające się od podkreślenia są wszystkimi polami meta wyniku. Obiekt _source to oryginalny dokument, który został zaindeksowany.
Do wyszukiwania używamy również GET, wywołując punkt końcowy _search:

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

Wynik zawiera szereg dodatkowych pól, które opisują zarówno wyszukiwanie, jak i wynik. Oto krótkie zestawienie:

  • took: Czas w milisekundach, jaki zajęło wyszukiwanie
  • timed_out: If the search timed out
  • _shards: Liczba przeszukanych fragmentów Lucene oraz ich współczynniki sukcesu i porażki
  • hits: The actual results, along with meta information for the results

Wyszukiwanie, które wykonaliśmy powyżej, znane jest jako URI Search i jest najprostszym sposobem na zapytanie do Elasticsearch. Podając tylko słowo, ES przeszuka wszystkie pola wszystkich dokumentów dla tego słowa. Możesz zbudować bardziej szczegółowe wyszukiwania używając zapytań Lucene:

  • username:johnb – Szuka dokumentów, w których pole username jest równe „johnb”
  • john* – Szuka dokumentów, które zawierają terminy zaczynające się od john, po których następuje zero lub więcej znaków, takich jak „john”, „johnb” i „johnson”
  • john? – Szuka dokumentów, które zawierają wyrażenia zaczynające się od john, po których występuje tylko jeden znak. Dopasowuje „johnb” i „johns”, ale nie „john.”

Istnieje wiele innych sposobów wyszukiwania, w tym użycie logiki boolean, wzmocnienie terminów, użycie wyszukiwania rozmytego i zbliżeniowego oraz użycie wyrażeń regularnych.

Elasticsearch Query DSL

Szukanie wURI to dopiero początek. Elasticsearch udostępnia również wyszukiwanie w treści żądania z Query DSL dla bardziej zaawansowanych wyszukiwań. Istnieje szeroki wachlarz opcji dostępnych w tego typu wyszukiwaniach i możesz mieszać i dopasowywać różne opcje, aby uzyskać wyniki, których potrzebujesz.

Zawierają one dwa rodzaje klauzul: 1) klauzule zapytań liściowych, które szukają wartości w określonym polu, oraz 2) klauzule zapytań złożonych (które mogą zawierać jedną lub kilka klauzul zapytań liściowych).

Typy zapytań Elasticsearch

W tego rodzaju wyszukiwaniach dostępny jest szeroki wachlarz opcji, a użytkownik może mieszać i dopasowywać różne opcje, aby uzyskać wyniki, których wymaga. Typy zapytań obejmują:

  1. Kwerendy geograficzne,
  2. Kwerendy „More like this”
  3. Kwerendy skryptowe
  4. Kwerendy pełnotekstowe
  5. Kwerendy kształtowe
  6. Kwerendy przestrzenne
  7. Kwerendy na poziomie terminu
  8. Kwerendy wyspecjalizowane

Od Elasticsearch 6.8, ELK Stack połączył zapytania Elasticsearch i filtry Elasticsearch, ale ES nadal rozróżnia je na podstawie kontekstu. DSL rozróżnia pomiędzy kontekstem filtra i kontekstem zapytania dla klauzul zapytania. Klauzule w kontekście filtrującym testują dokumenty w sposób booleański: Czy dokument pasuje do filtra, „tak” czy „nie”? Filtry są również ogólnie szybsze niż zapytania, ale zapytania mogą również obliczać wynik relewancji w zależności od tego, jak blisko dokument pasuje do zapytania. Filtry nie używają wyniku relewancji. Określa to kolejność i włączenie dokumentów:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ "query": { "match_phrase": { "message": "User logged in" } }}'

I wynik:

{ "took" : 28, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : }}'

Tworzenie klastra Elasticsearch

Utrzymywanie klastra Elasticsearch może być czasochłonne, zwłaszcza jeśli robisz DIY ELK. Ale biorąc pod uwagę potężne możliwości Elasticsearch w zakresie wyszukiwania i analizy, takie klastry są niezbędne. Zanurzamy się głębiej w ten temat w naszym samouczku dotyczącym klastrów Elasticsearch, więc użyjemy tego jako odskoczni do tego bardziej szczegółowego przejścia.

Czym dokładnie jest klaster Elasticsearch? Klastry Elasticsearch grupują wiele węzłów i/lub instancji Elasticsearch razem. Oczywiście, zawsze można zdecydować się na utrzymywanie pojedynczej instancji lub węzła Elasticsearch wewnątrz danego klastra. Główny sens takiego grupowania leży w dystrybucji zadań, wyszukiwania i indeksowania pomiędzy węzłami klastra. Opcje węzłów obejmują węzły danych, węzły główne, węzły klienckie i węzły wejściowe.

Instalacja węzłów może wiązać się z wieloma konfiguracjami, które obejmuje nasz wspomniany wcześniej tutorial. Ale oto podstawowa instalacja węzła klastra Elasticsearch:

Po pierwsze i najważniejsze, zainstaluj Javę:

sudo apt-get install default-jre

Następnie, dodaj klucz logowania Elasticsearch:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Następnie, zainstaluj nową iterację Elasticsearch:

sudo apt-get update && apt-get install elasticsearch

Będziesz musiał utworzyć i/lub skonfigurować każdy węzeł Elasticsearcha jego własny elasticsearch.yml plik konfiguracyjny (sudo vim /etc/elasticsearch/elasticsearch.yml). Stamtąd uruchom Elasticsearch, a następnie sprawdź status swojego klastra Elasticsearch. Odpowiedzi będą wyglądać mniej więcej tak:

{ "cluster_name" : "elasticsearch-cluster-demo", "compressed_size_in_bytes" : 255, "version" : 7, "state_uuid" : "50m3ranD0m54a531D", "master_node" : "IwEK2o1-Ss6mtx50MripkA", "blocks" : { }, "nodes" : { "m4-aw350m3-n0D3" : { "name" : "es-node-1", "ephemeral_id" : "x50m33F3mr--A11DnuM83r", "transport_address" : "172.31.50.123:9200", "attributes" : { } }, },}

Zdrowie klastra Elasticsearch będzie następną pozycją na liście. Okresowo sprawdzaj stan swojego klastra za pomocą następującego wywołania API:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

Ten przykład pokazuje parametr local jako false, (który jest w rzeczywistości domyślny). To pokaże ci status węzła głównego. Aby sprawdzić węzeł lokalny, zmień na true.

Parametr level domyślnie pokazuje stan klastra, ale rangi poza nim obejmują indices i shards (jak w powyższym przykładzie).

Istnieją dodatkowe opcjonalne parametry dla timeoutów…

timeout
master_timeout

…lub, aby poczekać na wystąpienie pewnych zdarzeń:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Usuwanie danych Elasticsearch

Usuwanie elementów z Elasticsearch jest tak samo proste jak wprowadzanie danych do Elasticsearch. Metoda HTTP, której należy użyć tym razem to – niespodzianka, niespodzianka –DELETE:

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

Aby usunąć indeks, użyj:

$ curl -XDELETE 'localhost:9200/logs?pretty'

Aby usunąć wszystkie indeksy (używaj z najwyższą ostrożnością) użyj:

$ curl -XDELETE 'localhost:9200/_all?pretty'$

Odpowiedź w obu przypadkach powinna brzmieć:

{ "acknowledged" : true}

Aby usunąć pojedynczy dokument:

$ curl -XDELETE 'localhost:9200/index/type/document'

Co dalej?

Tutorial ten pomaga początkującym użytkownikom Elasticsearch i jako taki przedstawia tylko podstawowe kroki operacji CRUD w Elasticsearch. Elasticsearch jest wyszukiwarką i jako taka posiada bardzo rozbudowane funkcje wyszukiwania.
W ostatnich wersjach wprowadzono kilka nowych funkcji Elasticsearch, a także kilka znaczących zmian w strukturze danych.

Zawsze warto zapoznać się z oficjalną dokumentacją Elasticsearch, a także z naszymi samouczkami Logstash i Kibana.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.