#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ą:
- Kwerendy geograficzne,
- Kwerendy „More like this”
- Kwerendy skryptowe
- Kwerendy pełnotekstowe
- Kwerendy kształtowe
- Kwerendy przestrzenne
- Kwerendy na poziomie terminu
- 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.