An Elasticsearch Tutorial: Getting Started

#Nota: Elastic ha recentemente annunciato di voler implementare le licenze closed-source per le nuove versioni di Elasticsearch e Kibana oltre la versione 7.9. Per maggiori dettagli, leggi i commenti del nostro CEO Tomer Levy su Truly Doubling Down on Open Source.

Elasticsearch è il cuore pulsante di quella che oggi è la più popolare piattaforma di log analytics – l’ELK Stack (Elasticsearch, Logstash e Kibana). Il ruolo di Elasticsearch è così centrale che è diventato sinonimo del nome stesso dello stack. Principalmente per la ricerca e l’analisi dei log, Elasticsearch è oggi uno dei più popolari sistemi di database disponibili oggi. Questo tutorial su Elasticsearch fornisce ai nuovi utenti le conoscenze e gli strumenti necessari per iniziare a usare Elasticsearch. Include istruzioni per l’installazione, l’indicizzazione iniziale e la gestione dei dati.

Che cos’è Elasticsearch?

Inizialmente rilasciato nel 2010, Elasticsearch (talvolta chiamato ES) è un moderno motore di ricerca e analisi basato su Apache Lucene. Completamente open source e costruito con Java, Elasticsearch è un database NoSQL. Ciò significa che memorizza i dati in modo non strutturato e che non è possibile utilizzare SQL per interrogarlo.

Questo tutorial Elasticsearch potrebbe anche essere considerato un tutorial NoSQL. Tuttavia, a differenza della maggior parte dei database NoSQL, Elasticsearch ha una forte attenzione alle capacità e alle caratteristiche di ricerca – così tanto, infatti, che il modo più semplice per ottenere dati da ES è quello di cercarli utilizzando l’estesa API Elasticsearch.

Nel contesto dell’analisi dei dati, Elasticsearch viene utilizzato insieme agli altri componenti dell’ELK Stack, Logstash e Kibana, e svolge il ruolo di indicizzazione e memorizzazione dei dati.

Installazione di Elasticsearch

I requisiti per Elasticsearch sono semplici: Java 8 (versione specifica consigliata: Oracle JDK versione 1.8.0_131). Dai un’occhiata a questo tutorial su Logstash per assicurarti di essere pronto. Inoltre, vorrai assicurarti che il tuo sistema operativo sia sulla matrice di supporto di Elastic, altrimenti potresti incorrere in strani e imprevedibili problemi. Una volta fatto questo, puoi iniziare a installare Elasticsearch.

Puoi scaricare Elasticsearch come distribuzione standalone o installarlo usando i repository apt e yum. Installeremo Elasticsearch su una macchina Ubuntu 16.04 in esecuzione su AWS EC2 utilizzando apt.

Per prima cosa, è necessario aggiungere la chiave di firma di Elastic in modo da poter verificare il pacchetto scaricato (salta questo passaggio se hai già installato i pacchetti da Elastic):

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

Per Debian, abbiamo bisogno di installare il pacchetto apt-transport-https:

sudo apt-get install apt-transport-https

Il passo successivo è quello di aggiungere la definizione del repository al tuo sistema:

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

Tutto ciò che resta da fare è aggiornare i tuoi repository e installare Elasticsearch:

sudo apt-get updatesudo apt-get install elasticsearch

Configurare Elasticsearch

Le configurazioni di Elasticsearch sono fatte usando un file di configurazione la cui posizione dipende dal tuo sistema operativo. In questo file è possibile configurare le impostazioni generali (ad esempio il nome del nodo), così come le impostazioni di rete (ad esempio host e porta), dove vengono memorizzati i dati, la memoria, i file di log e altro ancora.

Per scopi di sviluppo e test, le impostazioni predefinite saranno sufficienti, ma si raccomanda di fare qualche ricerca su quali impostazioni si dovrebbero definire manualmente prima di andare in produzione.

Per esempio, e specialmente se si installa Elasticsearch sul cloud, è una buona pratica legare Elasticsearch a un IP privato o localhost:

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

Eseguire Elasticsearch

Elasticsearch non verrà eseguito automaticamente dopo l’installazione e sarà necessario avviarlo manualmente. Il modo in cui eseguirai Elasticsearch dipenderà dal tuo sistema specifico. Sulla maggior parte dei sistemi Linux e Unix puoi usare questo comando:

sudo service elasticsearch start

E questo è tutto! Per confermare che tutto funziona bene, punta semplicemente curl o il tuo browser a http://localhost:9200, e dovresti vedere qualcosa come il seguente 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"}

Per eseguire il debug del processo di esecuzione di Elasticsearch, usa i file di log di Elasticsearch situati (su Deb) in /var/log/elasticsearch/.

Creazione di un indice Elasticsearch

L’indicizzazione è il processo di aggiunta di dati a Elasticsearch. Questo perché quando si inseriscono dati in Elasticsearch, i dati vengono inseriti in indici Apache Lucene. Questo ha senso perché Elasticsearch usa gli indici Lucene per memorizzare e recuperare i suoi dati. Anche se non hai bisogno di sapere molto su Lucene, è utile sapere come funziona quando inizi a fare sul serio con Elasticsearch.
Elasticsearch si comporta come un’API REST, quindi puoi usare il metodo POST o PUT per aggiungere dati. Usate PUT quando conoscete o volete specificare il id dell’elemento di dati, o POST se volete che Elasticsearch generi un id per l’elemento di dati:

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

E la risposta:

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

I dati del documento vengono inviati come oggetto JSON. Vi starete chiedendo come possiamo indicizzare i dati senza definire la struttura dei dati. Bene, con Elasticsearch, come con qualsiasi altro database NoSQL, non è necessario definire in anticipo la struttura dei dati. Per garantire prestazioni ottimali, però, è possibile definire le mappature di Elasticsearch in base ai tipi di dati. Più avanti su questo.

Se stai usando uno degli shipper Beats (ad esempio Filebeat o Metricbeat), o Logstash, quelle parti dell’ELK Stack creeranno automaticamente gli indici.

Per vedere una lista dei tuoi indici Elasticsearch, usa:

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

La lista in questo caso include gli indici che abbiamo creato sopra, un indice Kibana e un indice creato da una pipeline Logstash.

Elasticsearch Querying

Una volta indicizzati i tuoi dati in Elasticsearch, puoi iniziare a cercarli e analizzarli. La query più semplice che puoi fare è recuperare un singolo elemento. Leggi il nostro articolo incentrato esclusivamente sulle query Elasticsearch.

Ancora una volta, tramite l’API REST di Elasticsearch, usiamo GET:

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

E la risposta:

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

I campi che iniziano con un underscore sono tutti meta campi del risultato. L’oggetto _source è il documento originale che è stato indicizzato.
Utilizziamo anche GET per fare ricerche chiamando l’endpoint _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":}}

Il risultato contiene una serie di campi extra che descrivono sia la ricerca che il risultato. Ecco un rapido riepilogo:

  • took: Il tempo in millisecondi che la ricerca ha impiegato
  • timed_out: If the search timed out
  • _shards: Il numero di frammenti di Lucene cercati, e i loro tassi di successo e fallimento
  • hits: I risultati effettivi, insieme alle informazioni meta per i risultati

La ricerca che abbiamo fatto sopra è conosciuta come una ricerca URI, ed è il modo più semplice per interrogare Elasticsearch. Fornendo solo una parola, ES cercherà tutti i campi di tutti i documenti per quella parola. Puoi costruire ricerche più specifiche usando le query Lucene:

  • username:johnb – Cerca i documenti dove il campo username è uguale a “johnb”
  • john* – Cerca i documenti che contengono termini che iniziano con john ed è seguito da zero o più caratteri come “john,” “johnb,” e “johnson”
  • john? – Cerca i documenti che contengono termini che iniziano con john seguiti da un solo carattere. Corrisponde a “johnb” e “johns” ma non a “john.”

Ci sono molti altri modi per cercare, compreso l’uso della logica booleana, il potenziamento dei termini, l’uso di ricerche fuzzy e di prossimità, e l’uso di espressioni regolari.

Elasticsearch Query DSL

Le ricerche diURI sono solo l’inizio. Elasticsearch fornisce anche una ricerca nel corpo della richiesta con una Query DSL per ricerche più avanzate. C’è una vasta gamma di opzioni disponibili in questo tipo di ricerche, ed è possibile combinare diverse opzioni per ottenere i risultati desiderati.

Contiene due tipi di clausole: 1) clausole di query in foglia che cercano un valore in un campo specifico e 2) clausole di query composte (che possono contenere una o più clausole di query in foglia).

Tipi di query di Elasticsearch

C’è una vasta gamma di opzioni disponibili in questo tipo di ricerche ed è possibile combinare diverse opzioni per ottenere i risultati richiesti. I tipi di query includono:

  1. Richieste geo,
  2. Query “More like this”
  3. Query scritte
  4. Query di testo completo
  5. Query di forma
  6. Query di tipo span
  7. Query a livello di termine
  8. Query specializzate

A partire da Elasticsearch 6.8, l’ELK Stack ha unito le query Elasticsearch e i filtri Elasticsearch, ma ES li differenzia ancora per contesto. Il DSL distingue tra un contesto di filtro e un contesto di query per le clausole di query. Le clausole in un contesto di filtro testano i documenti in modo booleano: Il documento corrisponde al filtro, “sì” o “no?”. I filtri sono generalmente più veloci delle query, ma le query possono anche calcolare un punteggio di rilevanza in base a quanto un documento corrisponde alla query. I filtri non usano un punteggio di rilevanza. Questo determina l’ordine e l’inclusione dei documenti:

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

E il risultato:

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

Creazione di un cluster Elasticsearch

Mantenere un cluster Elasticsearch può richiedere molto tempo, specialmente se stai facendo ELK fai da te. Ma, date le potenti capacità di ricerca e analisi di Elasticsearch, tali cluster sono indispensabili. Abbiamo un’immersione più profonda sull’argomento con il nostro tutorial sui cluster Elasticsearch, quindi useremo questo come un trampolino di lancio per quel walk-through più approfondito.

Cos’è un cluster Elasticsearch, precisamente? I cluster Elasticsearch raggruppano più nodi e/o istanze Elasticsearch. Naturalmente, si può sempre scegliere di mantenere una singola istanza o nodo Elasticsearch all’interno di un dato cluster. Il punto principale di un tale raggruppamento sta nella distribuzione dei compiti, della ricerca e dell’indicizzazione del cluster sui suoi nodi. Le opzioni dei nodi includono i data nodes, i master nodes, i client nodes e gli ingest nodes.

L’installazione dei nodi può comportare un sacco di configurazioni, che il nostro suddetto tutorial copre. Ma ecco l’installazione di base dei nodi del cluster Elasticsearch:

Prima di tutto, installare Java:

sudo apt-get install default-jre

Poi, aggiungere la chiave di accesso di Elasticsearch:

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

In seguito, installare la nuova iterazione di Elasticsearch:

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

Si dovrà creare e/o impostare il proprio file di configurazione elasticsearch.yml di ogni nodo Elasticsearch (sudo vim /etc/elasticsearch/elasticsearch.yml). Da lì, avvia Elasticsearch e poi controlla lo stato del tuo cluster Elasticsearch. Le risposte saranno qualcosa del genere:

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

Lo stato del cluster Elasticsearch sarà il prossimo della tua lista. Controlla periodicamente lo stato del tuo cluster con la seguente chiamata API:

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

Questo esempio mostra il parametro local come false, (che è effettivamente di default). Questo vi mostrerà lo stato del nodo master. Per controllare il nodo locale, cambia in true.

Il parametro livello, per default, ti mostrerà la salute del cluster, ma i gradi oltre a questo includono indices e shards (come nell’esempio precedente).

Ci sono ulteriori parametri opzionali per i timeout…

timeout
master_timeout

…o, per aspettare che certi eventi si verifichino:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Rimozione dei dati Elasticsearch

Eliminare gli elementi da Elasticsearch è facile come inserire i dati in Elasticsearch. Il metodo HTTP da usare questa volta è – sorpresa, sorpresa – 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}

Per cancellare un indice, usa:

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

Per cancellare tutti gli indici (da usare con estrema cautela) usa:

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

La risposta in entrambi i casi dovrebbe essere:

{ "acknowledged" : true}

Per cancellare un singolo documento:

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

Che succede?

Questo tutorial aiuta i principianti con Elasticsearch e come tale fornisce solo i passi base delle operazioni CRUD in Elasticsearch. Elasticsearch è un motore di ricerca, e come tale presenta un’immensa profondità nelle sue funzioni di ricerca.
Le versioni recenti hanno introdotto alcune nuove incredibili caratteristiche di Elasticsearch e anche alcuni cambiamenti significativi alla struttura dei dati sottostante.

È sempre una buona idea esplorare la documentazione ufficiale di Elasticsearch, così come il nostro tutorial su Logstash e il tutorial su Kibana.

Si consiglia di consultare la documentazione di Elasticsearch.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.