An Elasticsearch Tutorial: Getting Started – Logz.io An Elasticsearch Tutorial: Introduktion: Kom godt i gang

#Note: Elastic meddelte for nylig, at de ville implementere lukket kildekode-licensering for nye versioner af Elasticsearch og Kibana efter version 7.9. Du kan få flere oplysninger i vores CEO Tomer Levys kommentarer til Truly Doubling Down on Open Source.

Elasticsearch er det levende hjerte i det, der i dag er den mest populære loganalyseplatform – ELK-stakken (Elasticsearch, Logstash og Kibana). Elasticsearchs rolle er så central, at den er blevet synonym med navnet på selve stakken. Elasticsearch, der primært er beregnet til søgning og loganalyse, er i dag et af de mest populære databasesystemer, der findes i dag. Denne Elasticsearch-tutorial giver nye brugere den nødvendige viden og de nødvendige værktøjer til at komme i gang med at bruge Elasticsearch. Den indeholder installationsinstruktioner og indledende instruktioner om indeksering og datahåndtering.

Hvad er Elasticsearch?

Initialt udgivet i 2010 er Elasticsearch (undertiden døbt ES) en moderne søge- og analysemotor, som er baseret på Apache Lucene. Elasticsearch er en NoSQL-database, der er fuldstændig open source og bygget med Java. Det betyder, at den gemmer data på en ustruktureret måde, og at du ikke kan bruge SQL til at forespørge på den.

Denne Elasticsearch-tutorial kan også betragtes som en NoSQL-tutorial. Men i modsætning til de fleste NoSQL-databaser har Elasticsearch et stærkt fokus på søgefunktioner og -muligheder – faktisk så meget, at den nemmeste måde at få data fra ES på er at søge efter dem ved hjælp af den omfattende Elasticsearch API.

I forbindelse med dataanalyse bruges Elasticsearch sammen med de andre komponenter i ELK Stack, Logstash og Kibana, og spiller rollen som indeksering og lagring af data.

Installation af Elasticsearch

Kravene til Elasticsearch er enkle: Java 8 (specifik version anbefales: Oracle JDK version 1.8.0_131). Tag et kig på denne Logstash-tutorial for at sikre, at du er klar. Du skal også sikre dig, at dit operativsystem er på Elastic-supportmatrixen, ellers kan du løbe ind i mærkelige og uforudsigelige problemer. Når det er gjort, kan du begynde med at installere Elasticsearch.

Du kan downloade Elasticsearch som en standalone-distribution eller installere den ved hjælp af apt og yum repositories. Vi vil installere Elasticsearch på en Ubuntu 16.04-maskine, der kører på AWS EC2, ved hjælp af apt.

Først skal du tilføje Elastics signeringsnøgle, så du kan verificere den downloadede pakke (spring dette trin over, hvis du allerede har installeret pakker fra Elastic):

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

For Debian skal vi derefter installere apt-transport-https-pakken:

sudo apt-get install apt-transport-https

Det næste trin er at tilføje repositorydefinitionen til dit system:

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

Det eneste, der er tilbage, er at opdatere dine repositories og installere Elasticsearch:

sudo apt-get updatesudo apt-get install elasticsearch

Konfigurering af Elasticsearch

Elasticsearch-konfigurationer udføres ved hjælp af en konfigurationsfil, hvis placering afhænger af dit operativsystem. I denne fil kan du konfigurere generelle indstillinger (f.eks. nodenavn) samt netværksindstillinger (f.eks. vært og port), hvor data gemmes, hukommelse, logfiler og meget mere.

Til udviklings- og testformål vil standardindstillingerne være tilstrækkelige, men det anbefales alligevel, at du undersøger, hvilke indstillinger du bør definere manuelt, før du går i produktion.

For eksempel, og især hvis du installerer Elasticsearch i skyen, er det en god bedste praksis at binde Elasticsearch til enten en privat IP eller localhost:

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

Kørsel af Elasticsearch

Elasticsearch kører ikke automatisk efter installationen, og du skal starte den manuelt. Hvordan du kører Elasticsearch vil afhænge af dit specifikke system. På de fleste Linux- og Unix-baserede systemer kan du bruge denne kommando:

sudo service elasticsearch start

Så er det nok! Hvis du vil bekræfte, at alt fungerer fint, skal du blot pege curl eller din browser til http://localhost:9200, og du bør se noget i retning af følgende output:

{ "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"}

For at fejlfinde processen med at køre Elasticsearch skal du bruge Elasticsearch-logfilerne, der (på Deb) ligger i /var/log/elasticsearch/.

Skabelse af et Elasticsearch-indeks

Indeksering er processen med at tilføje data til Elasticsearch. Det skyldes, at når du indfører data i Elasticsearch, placeres dataene i Apache Lucene-indekser. Det giver mening, fordi Elasticsearch bruger Lucene-indeksene til at gemme og hente sine data. Selv om du ikke behøver at vide meget om Lucene, hjælper det at vide, hvordan det fungerer, når du begynder at gå seriøst til Elasticsearch.
Elasticsearch opfører sig som et REST API, så du kan bruge enten POST– eller PUT-metoden til at tilføje data til det. Du bruger PUT, når du kender eller ønsker at angive id for dataelementet, eller POST, hvis du ønsker, at Elasticsearch skal generere et id for dataelementet:

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"}'

Og svaret:

{"_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}

Dataene for dokumentet sendes som et JSON-objekt. Du undrer dig måske over, hvordan vi kan indeksere data uden at definere strukturen af dataene. Tja, med Elasticsearch, ligesom med enhver anden NoSQL-database, er der ikke behov for at definere datastrukturen på forhånd. For at sikre optimal ydeevne kan du dog definere Elasticsearch-tilknytninger i henhold til datatyper. Mere om dette senere.

Hvis du bruger en af Beats shippers (f.eks. Filebeat eller Metricbeat) eller Logstash, vil disse dele af ELK Stack automatisk oprette indeksene.

For at se en liste over dine Elasticsearch-indeks skal du bruge:

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

Listen omfatter i dette tilfælde de indeks, vi har oprettet ovenfor, et Kibana-indeks og et indeks oprettet af en Logstash-pipeline.

Elasticsearch-søgning

Når du har indekseret dine data i Elasticsearch, kan du begynde at søge og analysere dem. Den enkleste forespørgsel, du kan foretage, er at hente et enkelt element. Læs vores artikel, der udelukkende fokuserer på Elasticsearch-forespørgsler.

Gennem Elasticsearch REST API bruger vi igen GET:

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

Og svaret:

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

Felterne, der begynder med en understregning, er alle metafelter i resultatet. _source-objektet er det oprindelige dokument, der blev indekseret.
Vi bruger også GET til at foretage søgninger ved at kalde _search-slutpunktet:

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":}}

Resultatet indeholder en række ekstra felter, der beskriver både søgningen og resultatet. Her er en hurtig gennemgang:

  • took: Tiden i millisekunder, som søgningen tog
  • timed_out: If the search timed out
  • _shards: Antallet af Lucene shards, der blev søgt i, og deres succes- og fejlrate
  • hits: De faktiske resultater sammen med metainformationer for resultaterne

Den søgning, vi foretog ovenfor, er kendt som en URI-søgning og er den enkleste måde at forespørge Elasticsearch på. Ved kun at angive et ord vil ES søge i alle felter i alle dokumenter efter dette ord. Du kan opbygge mere specifikke søgninger ved at bruge Lucene-forespørgsler:

  • brugernavn:johnb – Søger efter dokumenter, hvor feltet brugernavn er lig med “johnb”
  • john* – Søger efter dokumenter, der indeholder udtryk, der starter med john og er efterfulgt af nul eller flere tegn som f.eks. “john”, “johnb” og “johnson”
  • john? – Søger efter dokumenter, der indeholder termer, der begynder med john, efterfulgt af kun ét tegn. Matcher “johnb” og “johns”, men ikke “john.”

Der er mange andre måder at søge på, herunder brug af boolsk logik, boosting af termer, brug af fuzzy- og proximity-søgninger og brug af regulære udtryk.

Elasticsearch Query DSL

URI-søgninger er blot begyndelsen. Elasticsearch tilbyder også en request body-søgning med et Query DSL til mere avancerede søgninger. Der er en bred vifte af muligheder i disse typer søgninger, og du kan blande og matche forskellige muligheder for at få de resultater, du har brug for.

Det indeholder to typer klausuler: 1) bladforespørgselsklausuler, der leder efter en værdi i et bestemt felt, og 2) sammensatte forespørgselsklausuler (som kan indeholde en eller flere bladforespørgselsklausuler).

Elasticsearch-forespørgselstyper

Der er et bredt udvalg af muligheder til rådighed i disse typer søgninger, og du kan blande og matche forskellige muligheder for at få de resultater, du har brug for. Forespørgselstyper omfatter bl.a:

  1. Geoforespørgsler,
  2. “More like this”-forespørgsler
  3. Scripted queries
  4. Fuldtekstforespørgsler
  5. Shape queries
  6. Span queries
  7. Term-level queries
  8. Specialized queries

Som i Elasticsearch 6.8 har ELK Stack slået Elasticsearch-forespørgsler og Elasticsearch-filtre sammen, men ES skelner stadig mellem dem efter kontekst. DSL skelner mellem en filterkontekst og en forespørgselskontekst for forespørgselsklausuler. Klausuler i en filterkontekst tester dokumenter på en boolsk måde: Passer dokumentet til filteret, “ja” eller “nej”? Filtre er også generelt hurtigere end forespørgsler, men forespørgsler kan også beregne en relevansscore ud fra, hvor tæt et dokument matcher forespørgslen. Filtre anvender ikke en relevansscore. Dette bestemmer rækkefølgen og inklusionen af dokumenter:

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

Og resultatet:

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

Opretning af en Elasticsearch-klynge

Håndtering af en Elasticsearch-klynge kan være tidskrævende, især hvis du laver DIY ELK. Men i betragtning af Elasticsearchs kraftfulde søge- og analysefunktioner er sådanne klynger uundværlige. Vi har et dybere dyk i emnet med vores Elasticsearch cluster tutorial, så vi vil bruge dette som et springbræt til denne mere grundige gennemgang.

Hvad er en Elasticsearch cluster helt præcist? Elasticsearch-klynger grupperer flere Elasticsearch-noder og/eller -instanser sammen. Du kan naturligvis altid vælge at opretholde en enkelt Elasticsearch-instans eller -node inden for en given klynge. Hovedpointen med en sådan gruppering ligger i klyngens fordeling af opgaver, søgning og indeksering på tværs af dens noder. Node-muligheder omfatter datanoder, master-noder, klientnoder og ingest-noder.

Installation af noder kan involvere en masse konfigurationer, som vores førnævnte tutorial dækker. Men her er den grundlæggende installation af Elasticsearch cluster node:

Først og fremmest skal du installere Java:

sudo apt-get install default-jre

Næst skal du tilføje Elasticsearchs sign-in-nøgle:

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

Næst skal du installere den nye iteration af Elasticsearch:

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

Du skal oprette og/eller konfigurere hver Elasticsearch-nodes egen elasticsearch.yml konfigurationsfil (sudo vim /etc/elasticsearch/elasticsearch.yml). Derfra skal du starte Elasticsearch og derefter kontrollere din Elasticsearch-klyngestatus. Svarene vil se nogenlunde sådan ud:

{ "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" : { } }, },}

Elasticsearch-klyngens tilstand vil være den næste på din liste. Kontroller jævnligt din klynges tilstand med følgende API-kald:

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

Dette eksempel viser parameteren local som false, (hvilket faktisk er som standard). Dette vil vise dig status for master node. Hvis du vil kontrollere den lokale node, skal du ændre til true.

Niveau-parameteren vil som standard vise dig klyngens tilstand, men rækker ud over dette omfatter indices og shards (som i ovenstående eksempel).

Der er yderligere valgfrie parametre for timeouts…

timeout
master_timeout

…eller for at vente på, at visse hændelser indtræffer:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Fjernelse af Elasticsearch-data

Det er lige så nemt at slette elementer fra Elasticsearch som at indtaste data i Elasticsearch. Den HTTP-metode, der skal bruges denne gang – overraskelse, overraskelse – 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}

For at slette et indeks skal du bruge:

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

For at slette alle indeks (brug med ekstrem forsigtighed) skal du bruge:

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

Svaret i begge tilfælde skal være:

{ "acknowledged" : true}

For at slette et enkelt dokument:

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

Hvad er det næste?

Denne vejledning hjælper begyndere med Elasticsearch og giver som sådan kun de grundlæggende trin for CRUD-operationer i Elasticsearch. Elasticsearch er en søgemaskine og har som sådan en enorm dybde i sine søgefunktioner.
Den seneste version har introduceret nogle utrolige nye Elasticsearch-funktioner og også nogle væsentlige ændringer i den underliggende datastruktur.

Det er altid en god idé at udforske den officielle Elasticsearch-dokumentation samt vores Logstash-vejledning og Kibana-vejledning.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.