Ricerca elastica

Best practice di Elasticsearch e aumento delle prestazioni

Best practice di Elasticsearch e aumento delle prestazioni
In questo post, cercheremo di raccogliere le migliori pratiche e anche cosa evitare quando si lavora con Elasticsearch e si inseriscono dati in esso. In questo modo, sapremo tutte le cose di cui abbiamo bisogno prima ancora di iniziare a lavorare con questo eccellente motore di ricerca Search.

Migliori pratiche di Elasticsearch

Inizieremo a lavorare con le Best Practices da seguire con Elasticsearch e quali problemi può creare quando evitiamo questi punti. Iniziamo.

Definisci sempre le mappature ES

Una cosa che ES può sicuramente fare è lavorare senza mappature. Quindi, quando inizi a fornire dati JSON al tuo indice ES, itererà sui campi di dati e creerà una mappatura adatta. Questo sembra diretto e facile in quanto ES seleziona il tipo di dati stesso. In base ai tuoi dati, potresti aver bisogno che un campo sia di un tipo di dati specifico.

Ad esempio, supponiamo di indicizzare il seguente documento:


"id" : 1,
"title": "Installa ElasticSearch su Ubuntu",
"link": "https://linuxhint.com/install-elasticsearch-ubuntu/",
"data": "2018-03-25"

In questo modo, Elasticsearch contrassegnerà il campo "data" come tipo "data". Ma quando indicizzi il seguente documento:


"id" : 1,
"titolo" : "Migliori pratiche e prestazioni di ES",
"data" : "In attesa"

Questa volta, il tipo del campo data è stato modificato e ES genererà un errore e non consentirà l'indicizzazione del documento. Per semplificare le cose, puoi indicizzare alcuni documenti, vedere quali campi sono indicizzati da ES e prendere la mappatura da questo URL:

GET /nome_indice/tipo_doc/_mapping

In questo modo, non dovrai costruire anche la mappatura completa.

Bandiere di produzione

Viene chiamato il nome del cluster predefinito avviato da ES ricerca elastica. Quando hai molti nodi nel tuo cluster, è una buona idea mantenere i flag di denominazione il più coerenti possibile, come:

grappolo.nome: app_es_production
nodo.nome: app_es_node_001

Oltre a questo, anche le impostazioni di ripristino per i nodi sono molto importanti. Supponiamo che alcuni dei nodi in un cluster si riavviino a causa di un errore e che alcuni nodi si riavviino poco dopo gli altri nodi. Per mantenere i dati coerenti tra tutti questi nodi, dovremo eseguire un programma di coerenza che manterrà tutti i cluster in uno stato coerente.

gateway.recovery_after_nodes: 10

È anche utile comunicare in anticipo al cluster quanti nodi saranno presenti nel cluster e quanto tempo di ripristino sarà necessario per questi:

gateway.nodi_aspettati: 20
gateway.recovery_after_time: 7m

Con la configurazione corretta, un ripristino che avrebbe richiesto ore può richiedere anche un minuto e può far risparmiare molti soldi a qualsiasi azienda.

Approvvigionamento di capacità

È importante sapere quanto spazio occuperanno i tuoi dati e la velocità con cui fluiranno in Elasticsearch, perché questo deciderà la quantità di RAM di cui avrai bisogno su ciascuno dei nodi del cluster e anche sul nodo master.

Naturalmente, non ci sono linee guida specifiche per raggiungere i numeri necessari, ma possiamo adottare alcuni passaggi che ci forniscano una buona idea. Uno dei passaggi sarà quello di simulare il caso d'uso. Crea un cluster ES e alimentalo con quasi la stessa velocità di dati che ti aspetteresti con la tua configurazione di produzione. Il concetto di inizia in grande e ridimensiona può anche aiutarti a essere coerente su quanto spazio è necessario.

Modelli grandi

Quando definisci modelli di grandi dimensioni indicizzati, dovrai sempre affrontare problemi relativi alla sincronizzazione del modello tra i vari nodi del cluster. Tieni sempre presente che il modello dovrà essere ridefinito ogni volta che si verifica una modifica del modello di dati. È un'idea molto migliore mantieni i modelli dinamici. I modelli dinamici aggiornano automaticamente le mappature dei campi in base alle mappature definite in precedenza e ai nuovi campi new. Nota che non c'è alcun sostituto per mantenere i modelli il più piccoli possibile.

2Uso di mlockall sui server Ubuntu

Linux utilizza il processo di scambio quando ha bisogno di memoria per nuove pagine. Lo scambio rallenta le cose poiché i dischi sono più lenti della memoria. Il mlockall la proprietà nella configurazione di ES dice a ES di non scambiare le sue pagine dalla memoria anche se non sono necessarie per ora. Questa proprietà può essere impostata nel file YAML:

bootstrap.mlockall: vero

Nell'ES v5.x+, questa proprietà è stata modificata in:

bootstrap.memory_lock: vero

Se stai usando questa proprietà, assicurati di fornire a ES una memoria heap abbastanza grande usando il -DXmx opzione o ES_HEAP_SIZE.

Riduci al minimo gli aggiornamenti delle mappe

Le prestazioni di un cluster sono leggermente influenzate ogni volta che si effettuano richieste di aggiornamento della mappatura sul cluster ES. Se non puoi controllarlo e desideri comunque apportare aggiornamenti alle mappature, puoi utilizzare una proprietà nel file di configurazione ES YAML:

indici.grappolo.send_refresh_mapping: "falso"

Quando la richiesta di aggiornamento del modello è in attesa di coda per il nodo master e invia i dati con la vecchia mappatura ai nodi, deve anche inviare una richiesta di aggiornamento in seguito a tutti i nodi. Questo può rallentare le cose. Quando impostiamo la proprietà sopra su false, questo ha senso principale che è stato effettuato un aggiornamento alla mappatura e non invierà la richiesta di aggiornamento ai nodi. Nota che questo è utile solo se apporti regolarmente molte modifiche alle tue mappature.

Pool di thread ottimizzato

I nodi ES hanno molti pool di thread per migliorare la gestione dei thread all'interno di un nodo. Ma ci sono limitazioni sulla quantità di dati di cui ogni thread può occuparsi. Per tenere traccia di questo valore, possiamo utilizzare una proprietà ES:

threadpool.massa.dimensione_coda: 2000

Questo informa ES il numero di richieste in uno shard che possono essere accodate per l'esecuzione nel nodo quando non c'èun thread disponibile per elaborare la richiesta. Se il numero di attività supera questo valore, otterrai un RemoteTransportException. Maggiore è questo valore, maggiore sarà la quantità di spazio heap necessaria sulla macchina del nodo e verrà consumato anche l'heap JVM. Inoltre, dovresti tenere pronto il tuo codice nel caso in cui venga generata questa eccezione.

Conclusione

In questa lezione, abbiamo esaminato come possiamo migliorare le prestazioni di Elasticsearch evitando errori comuni e non comuni che le persone commettono. Leggi altri articoli di Elasticsearch su LinuxHint.

Tutorial OpenTTD
OpenTTD è uno dei giochi di simulazione aziendale più popolari in circolazione. In questo gioco, devi creare una meravigliosa attività di trasporto. T...
SuperTuxKart per Linux
SuperTuxKart è un fantastico titolo progettato per offrirti l'esperienza di Mario Kart gratuitamente sul tuo sistema Linux. È piuttosto impegnativo e ...
Tutorial Battaglia per Wesnoth
The Battle for Wesnoth è uno dei giochi di strategia open source più popolari a cui puoi giocare in questo momento. Non solo questo gioco è in svilupp...