Lanciato nel 2010, Elasticsearch è stato uno dei primi motori di ricerca distribuiti a eseguire query rapide sui dati da visualizzare negli analytics o nei Big Data Output. A quel tempo, un maggior numero di aziende aziendali accumulava enormi quantità di dati, ma i motori di database tradizionali non erano in grado di tenere il passo. Elasticsearch è stato introdotto come database vettoriale in grado di archiviare dati strutturati e non strutturati. È stato il primo grande passo verso l'indicizzazione dei Big Data e query più veloci quando gli analytics aziendali hanno superato i terabyte di dati causando problemi di performance.
Che cos'è Elasticsearch?
Elasticsearch è un datastore utilizzato per riunire i dati e renderli ricercabili tramite un'API. Si basa su Apache Lucene, un servizio di indicizzazione e storage che distribuisce i dati in shard. Ogni shard contiene i propri dati, ma gli shard sono tenuti separati l'uno dall'altro per distribuire i dati tra i nodi. Elasticsearch raggruppa tutti gli shard e fornisce agli sviluppatori un'API per eseguire query sui dati. Con l'API, gli amministratori possono impostare autorizzazioni per utenti specifici per proteggere ulteriormente i dati e fornire accesso a dati specifici solo agli utenti autorizzati.
Gli sviluppatori non si limitano ai dati strutturati o non strutturati. Elasticsearch consente agli utenti di estrarre dati strutturati e non strutturati, ma esegue query sui dati nei suoi frammenti distribuiti come se lo storage fosse un unico grande database. Il modo in cui Elasticsearch gestisce i dati li rende molto più veloci rispetto a un motore di database standard, quindi è meglio per le applicazioni con analytics, funzionalità di ricerca su molti dati o analisi del traffico di rete.
Componenti chiave dell'architettura Elasticsearch
Il primo componente principale di Elasticsearch è il nodo. Un nodo è un server o un dispositivo in cui sono memorizzati i dati. I cluster sono costituiti da una raccolta di nodi. I nodi e i cluster possono essere distribuiti tra i data center per la ridondanza, ma i dati distribuiti sono ciò che migliora le performance nelle query dei dati. Elasticsearch è un database vettoriale, ma memorizza i dati come documento. Un documento è un'entità che memorizza i dati non strutturati, anche se i dati strutturati possono essere memorizzati.
I dati vengono frazionati tra i nodi. Gli shard sono una parte dei dati che segmenta i datastore di grandi dimensioni in parti più piccole, il che facilita la distribuzione e allo stesso tempo esegue query per unire i dati in un insieme di risultati per l'applicazione frontend. Logstash viene utilizzato come pipeline dei dati, che prende i dati nella loro forma raw e li trasforma in una forma utilizzabile.
Elasticsearch dispone anche di un'API che costituisce il gateway per i dati. Gli sviluppatori devono autenticarsi nell'API e interrogarla con una chiave. L'API controlla l'accesso ai dati e il modo in cui gli sviluppatori possono eseguire query. La disponibilità di un'API nasconde anche l'architettura di backend e la protegge, rendendola accessibile agli sviluppatori che non hanno familiarità con il funzionamento di Apache Lucene e di altri componenti.
Nodi e cluster
Un cluster è un gruppo di nodi, ma i nodi hanno il proprio ruolo specifico in un cluster. Il nodo master, in generale, controlla il cluster. Il nodo master può creare o eliminare indici e tenere traccia degli altri nodi che partecipano al cluster. Ogni cluster ha un nodo master.
Un nodo dati memorizza i dati. Qualsiasi manipolazione o modifica dei dati è responsabilità del nodo dati. Man mano che si aggregano i dati, si aggiunge al nodo dati. La funzionalità di ricerca avviene anche nel nodo dati.
Considera il coordinamento dei nodi come i gateway che controllano il traffico verso il nodo giusto. Un nodo di coordinamento invia le richieste al nodo master o ai nodi dati, a seconda della destinazione. Ad esempio, quando una ricerca viene inviata al cluster, il nodo di coordinamento gestisce la richiesta.
Elasticsearch dispone di una pipeline per trasformare e spostare i dati. Il nodo di acquisizione è responsabile della gestione dei documenti e della loro trasformazione per l'indicizzazione. Elasticsearch consiglia di avere un nodo di acquisizione indipendente dal master e dai nodi dati in ambienti con trasferimenti di dati pesanti.
I nodi idonei per il telelavoro inviano richieste ad altri cluster nel sistema Elasticsearch. Le query di ricerca possono trovare i dati utilizzando la funzionalità multi-cluster con un nodo idoneo per la gestione remota. Anche la replica dei dati tra cluster è responsabilità dei nodi idonei per la gestione remota.
Frammenti e repliche
Le ricerche e le query rapide richiedono indici. Gli indici sono il modo in cui un datastore organizza i dati in modo da velocizzare le ricerche. In Elasticsearch, ogni indice è costituito da una serie di frammenti. Gli shard vengono archiviati tra i nodi in cui Elasticsearch li distribuisce nel cluster per un'elaborazione più rapida. Gli shard contengono una copia dei dati, ma Elasticsearch può eseguire ricerche simultanee su più shard.
La ridondanza è necessaria per il failover e la tolleranza ai guasti, quindi le repliche gestiscono una copia degli shard. Le repliche vengono memorizzate su nodi diversi in modo che i dati non vadano persi quando un nodo si guasta. Se un nodo si guasta, Elasticsearch sarà in grado di accedere ai dati su una replica su un altro nodo.
Flusso di dati in Elasticsearch
Elasticsearch fornisce agli sviluppatori un'API per inviare le loro query. L'API protegge gli sviluppatori dalla complessità del backend. Come discusso, il backend è costituito da diversi componenti, tra cui frammenti, nodi, indici e repliche. Invece di costringere gli sviluppatori a gestire i ricercatori Elasticsearch, il flusso di dati inizia con una query all'API.
L'API invia prima la query a un coordinatore. Il coordinatore lo invia al nodo appropriato in cui si trovano i frammenti. Una query può anche essere inviata a più frammenti, ciascuno con il proprio set di dati. Il routing viene eseguito dal coordinatore, che determina le parti giuste per la query.
Dopo la raccolta dei documenti da parte degli shard, gli indici dei documenti vengono rispediti al coordinatore. Quando più frammenti inviano i dati al coordinatore, questi organizzerà gli indici, li unirà e li ordinerà. Con gli indici ordinati, il coordinatore recupera i documenti effettivi dalle parti. Una volta recuperati, i dati vengono inviati all'applicazione tramite l'API.
Best practice per ottimizzare l'architettura Elasticsearch
Elasticsearch è molto più complesso del motore di database medio, quindi l'ottimizzazione richiede un approccio diverso. Per prima cosa devi assicurarti che nel backend sia in esecuzione una quantità di risorse sufficiente. Se le query sono troppo lente, considerare l'aumento della capacità di CPU, memoria o storage del server.
Gli indici sono necessari per la ricerca dei dati, ma alcuni dati non vengono utilizzati con la stessa frequenza degli altri. Elasticsearch consente di congelare gli indici, che spostano gli indici inutilizzati in un'altra shard. I coordinatori hanno quindi meno frammenti da cercare per ogni query, migliorando le performance.
I pool di thread nelle dimensioni delle query di controllo Elasticsearch devono essere ottimizzati per supportare la quantità di dati gestiti in ogni query. Configura i thread pool per gestire una quantità di dati sufficiente per le query, ma anche per collegarli alle risorse dei nodi. Sia i nodi che i pool di thread dovrebbero avere risorse sufficienti, altrimenti si potrebbero vedere prestazioni degradate durante query di volumi elevati.
Conclusione
Elasticsearch è molto più complesso di un database standard, quindi per ottenere performance ottimali è necessario disporre dell'architettura e delle risorse di calcolo giuste. Usa le best practice quando configuri Elasticsearch, ma è anche importante disporre delle risorse di calcolo giuste per supportare le query e il data storage necessari per il backend.
Un modo per assicurarti di disporre di risorse di storage sufficienti è sfruttare Pure Storage® FlashBlade®. FlashBlade supporta la crescita esponenziale per le piccole e grandi imprese. Le applicazioni possono essere scalate man mano che un numero sempre maggiore di utenti memorizza i dati e supporta un numero qualsiasi di clienti.