Elasticsearch — architektura, optymalizacja i wdrożenia
Poznaj wszystko o Elasticsearch — od architektury i instalacji po zaawansowaną optymalizację wydajności. Praktyczny przewodnik oparty na doświadczeniach z rzeczywistych wdrożeń enterprise.
Elasticsearch to potężny, rozproszony silnik wyszukiwania i analityki, zaprojektowany do obsługi różnych typów danych — od strukturalnych po niestrukturalne, od tekstowych po numeryczne. Zbudowany na bazie Apache Lucene, Elasticsearch zapewnia skalowalne, wysokowydajne rozwiązanie do wyszukiwania pełnotekstowego, analityki w czasie rzeczywistym i wielu innych zastosowań.
Czym jest Elasticsearch?
Elasticsearch to rozproszony silnik wyszukiwania i analityki działający w czasie rzeczywistym. Jest to platforma open-source, która umożliwia przechowywanie, przeszukiwanie i analizę ogromnych ilości danych w czasie niemal rzeczywistym. Oparta na Apache Lucene, oferuje interfejs RESTful oraz możliwości skalowania poziomego.
Kluczowa przewaga: Elasticsearch może obsługiwać petabajty danych, skalując się do setek węzłów i zapewniając wyszukiwanie w milisekundach.
Architektura Elasticsearch — kluczowe komponenty
Węzły (Nodes)
W Elasticsearch węzeł to działająca instancja oprogramowania. Każdy węzeł w klastrze ma unikalny identyfikator i rolę:
- Węzły danych — przechowują dane i uczestniczą w indeksowaniu oraz wyszukiwaniu.
- Węzły master — odpowiadają za działania na poziomie klastra, jak tworzenie indeksów i śledzenie węzłów.
- Węzły ingest — służą do wstępnego przetwarzania dokumentów przed indeksowaniem.
Klastry (Clusters)
Klaster to kolekcja jednego lub więcej węzłów, które razem przechowują wszystkie dane i zapewniają sfederowane możliwości indeksowania i wyszukiwania we wszystkich węzłach. Klaster jest identyfikowany przez unikalną nazwę (domyślnie „elasticsearch”).
Indeksy (Indices)
Indeksy to sposób logicznego podziału danych. Indeks w Elasticsearch jest podobny do bazy danych w świecie relacyjnych baz danych. Każdy indeks ma nazwę używaną jako referencja podczas operacji indeksowania, wyszukiwania, aktualizacji i usuwania.
Dokumenty i pola
W Elasticsearch dokument to podstawowa jednostka informacji, którą można indeksować. Jest wyrażany w formacie JSON. Każdy dokument to kolekcja pól — par klucz-wartość zawierających dane.
Shardy i repliki
Sharding to funkcja, która wyróżnia Elasticsearch spośród innych silników wyszukiwania:
- Shard — część indeksu przechowująca porcję danych.
- Replika — kopia shardu zapewniająca redundancję i wysoką dostępność.
Zalecany rozmiar shardu to 30-40 GB. Jeśli indeks będzie przechowywał 300 GB danych, należy przypisać około 8-10 shardów.
Główne korzyści Elasticsearch
Wysoka wydajność
Elasticsearch oferuje wysoką wydajność dzięki swojej rozproszonej naturze i możliwości wykonywania złożonych zapytań w czasie niemal rzeczywistym. Może przechowywać, przeszukiwać i analizować duże wolumeny danych w milisekundach.
Operacje w czasie niemal rzeczywistym
Elasticsearch osiąga to dzięki mechanizmowi odświeżania, który sprawia, że nowo indeksowane dane stają się przeszukiwalne niemal natychmiast (zwykle w ciągu sekundy). Interwał odświeżania można dostosować do potrzeb biznesowych.
Komplementarne narzędzia i wtyczki
Elasticsearch oferuje bogaty ekosystem narzędzi:
- Kibana — narzędzie do wizualizacji danych.
- Logstash — potok przetwarzania danych.
- Beats — lekkie programy do przesyłania danych.
Łatwy rozwój aplikacji
RESTful API i format danych JSON sprawiają, że budowanie aplikacji w wielu językach programowania jest proste. Dostępne są biblioteki klienckie dla Java, Python, .NET, PHP i wielu innych.
Przypadki użycia Elasticsearch
Wyszukiwanie korporacyjne
Elasticsearch jest powszechnie używany do wyszukiwania w danych organizacyjnych — dokumentach, e-mailach, bazach danych. Umożliwia tworzenie dostosowanych doświadczeń wyszukiwania z funkcjami pełnotekstowymi i scoringiem relevancji.
Zarządzanie wydajnością aplikacji (APM)
Zdolność Elasticsearch do obsługi dużych wolumenów danych czyni go przydatnym w APM. Jest używany do zbierania, indeksowania i analizowania danych wydajnościowych w czasie rzeczywistym.
SIEM (Security Information and Event Management)
Możliwości analizy w czasie rzeczywistym są kluczowe dla SIEM. Umożliwiają zespołom bezpieczeństwa szybkie wykrywanie i reagowanie na incydenty bezpieczeństwa.
E-commerce i handel detaliczny
Wykorzystywany do inteligentnego wyszukiwania produktów, zaawansowanego filtrowania, spersonalizowanych rekomendacji i analizy zachowań klientów.
7 skutecznych sposobów optymalizacji wydajności Elasticsearch
1. Hardware
Możesz wykonać wszystkie możliwe optymalizacje, ale jeśli nie masz wystarczającego sprzętu, nadal będziesz mieć problemy z wydajnością. Dla wysokiej wydajności Elasticsearch skup się na:
- pamięci cache,
- przestrzeni dyskowej (zalecane SSD),
- procesorach,
- pamięci RAM.
2. Load balancing
W środowisku produkcyjnym prawdopodobnie masz wiele węzłów. Load balancing to prosty sposób rozdzielenia obciążenia między węzły, zmniejszając nacisk na poszczególne węzły.
3. Indeksy
Indeksy to miejsca przechowywania danych w Elasticsearch. Nie musisz przechowywać wszystkich danych w jednym indeksie. W zależności od przypadku użycia możesz ustawić indeks do przechowywania danych przez miesiąc, dzień lub godzinę.
Ważne: dane w Elasticsearch są niezmienne. Podczas aktualizacji dokumentu Elasticsearch tworzy nowy dokument z najnowszymi wartościami, dlatego ważne jest regularne reindeksowanie.
4. Projektowanie dokumentów
Każdy indeks zawiera dokumenty przechowujące instancje danych. Właściwe projektowanie dokumentów zmniejszy czas przetwarzania żądań:
- Unikaj zagnieżdżonych pól i struktur rodzic-dziecko.
- Staraj się uczynić dokumenty jak najbardziej płaskimi.
- Przetwarzaj dane w odpowiednie pola przed indeksowaniem.
5. Sharding
Ze względu na duży rozmiar danych, nie zaleca się przechowywania całego zestawu danych jako jednego w indeksie. Dane są dzielone na części zwane shardami. Każde zapytanie działa w pojedynczym wątku na shard, ale wiele shardów może być wykonywanych równolegle.
Zalecenie: rozmiar shardu powinien wynosić 30-40 GB. Dla 300 GB danych przypisz około 8-10 shardów na indeks.
6. Interwał odświeżania
Gdy dane trafiają do Elasticsearch, nie są od razu dostępne po indeksowaniu. Domyślny interwał odświeżania to jedna sekunda. Dostosuj go do swoich potrzeb biznesowych — jeśli nie potrzebujesz danych w czasie rzeczywistym, możesz zwiększyć interwał.
7. Optymalizowane żądania
Elasticsearch został stworzony z myślą o zapytaniach bulk. Kilka zasad:
- Żądania bulk działają lepiej niż wiele pojedynczych żądań.
- Używaj słowa kluczowego
_sourcedo pobierania tylko wymaganych pól. - Wykorzystuj filtry do zawężenia wyszukiwania.
- Używaj
range,match,termsdo precyzyjnego filtrowania.
Metryki wydajności Elasticsearch do monitorowania
Zdrowie klastra
Prostą odpowiedź na pytanie „Czy moja konfiguracja Elasticsearch jest w porządku?” da ci zdrowie klastra. Trzy statusy:
- Czerwony — określony shard nie jest przydzielony w klastrze.
- Żółty — shard podstawowy jest przydzielony, ale repliki nie.
- Zielony — wszystkie shardy są przydzielone.
Wskaźnik indeksowania
Mówi o liczbie dokumentów indeksowanych w danym momencie. Wyższy wskaźnik indeksowania to dobrze — oznacza, że konfiguracja nadąża za wymaganiami.
Wskaźnik zapytań i opóźnienia
Wskaźnik zapytań mówi, ile zapytań Elasticsearch jest w stanie wykonać. Opóźnienia mogą być spowodowane kolejkowaniem, słabą konfiguracją itp. Wysoki wskaźnik zapytań i niskie opóźnienia to dobrze.
Czas odświeżania
Mówi o tym, ile czasu zajmuje odświeżenie. Im niższy czas odświeżania, tym lepiej. Skoki i wysokie wartości są powodem do niepokoju.
Użycie CPU i przestrzeń dyskowa
Z czasem dane rosną i wykorzystywana jest większa przestrzeń dyskowa. Monitoruj zarówno użycie CPU, jak i przestrzeń dyskową.
Przewodnik po instalacji i konfiguracji
Instalacja Elasticsearch
Elasticsearch jest kompatybilny z wieloma systemami operacyjnymi, w tym Windows, Linux i macOS.
- Pobierz dystrybucję Elasticsearch z oficjalnej strony internetowej.
- Rozpakuj pliki w wybranej lokalizacji.
- Uruchom
./elasticsearch(Linux/Mac) lubelasticsearch.bat(Windows). - Serwer powinien wystartować na domyślnym porcie 9200.
Konfiguracja Elasticsearch
Główny plik konfiguracyjny to elasticsearch.yml znajdujący się w katalogu config. Kluczowe ustawienia:
cluster.name— nazwa klastra Elasticsearch.node.name— nazwa bieżącego węzła.network.host— interfejs sieciowy, do którego Elasticsearch się podłącza.http.port— port HTTP (domyślnie 9200).
Tworzenie indeksu
Aby utworzyć indeks o nazwie „my_index”, wyślij żądanie PUT:
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}'Dodawanie dokumentów
Przykład dodania dokumentu do indeksu:
curl -X POST "localhost:9200/my_index/_doc" -H 'Content-Type: application/json' -d'
{
"title": "Podstawy Elasticsearch",
"description": "Wprowadzenie do Elasticsearch",
"date": "2024-01-01"
}'Zapytania w Elasticsearch
Query DSL
Query DSL to bogaty, elastyczny język zapytań używający JSON. Obsługuje szeroką gamę opcji wyszukiwania.
Przykład prostego wyszukiwania:
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"description": "Elasticsearch"
}
}
}'Złożone zapytania boolean
Przykład złożonego zapytania łączącego wiele kryteriów:
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "description": "Wprowadzenie" } }
],
"filter": [
{ "range": { "date": { "gte": "2024-01-01" } } }
]
}
}
}'Skalowanie Elasticsearch
Skalowanie Elasticsearch to nie tylko dodawanie większej ilości sprzętu. Oto kilka wskazówek:
- Zrozum swój biznes i jego wzrost, aby uniknąć częstych aktualizacji.
- Analizuj, czy indeks jest write-heavy czy read-heavy.
- Wyłącz repliki dla początkowych ładowań.
- Skonfiguruj Elasticsearch dla replikacji między klastrami.
- Regularnie reindeksuj i łącz indeksy.
- Przydziel dodatkowe shardy na przyszłość.
Najlepsze praktyki bezpieczeństwa
Elasticsearch oferuje funkcje bezpieczeństwa na poziomie enterprise:
- Szyfrowanie danych w tranzycie i w spoczynku.
- Kontrola dostępu oparta na rolach.
- Rejestrowanie audytu.
- Zgodność z RODO/GDPR.
Ważne: w środowisku produkcyjnym zawsze włącz funkcje bezpieczeństwa i skonfiguruj odpowiednie uwierzytelnianie.
Podsumowanie
Elasticsearch to potężne, elastyczne narzędzie wyszukiwania, które może obsłużyć szeroki zakres przypadków użycia. Jego rozproszona architektura w połączeniu z funkcjami takimi jak odwrócone indeksy i scoring relevancji czyni go idealnym wyborem dla aplikacji wymagających szybkich i dokładnych możliwości wyszukiwania.
Kluczowe wnioski:
- Elasticsearch opiera się na Apache Lucene i oferuje możliwości rozproszonego wyszukiwania.
- Shardy i repliki zapewniają dystrybucję danych i redundancję.
- Właściwa konfiguracja sprzętu i optymalizacja są kluczowe dla wydajności.
- Monitorowanie metryk jest niezbędne dla utrzymania zdrowego klastra.
- Skalowanie wymaga zrozumienia wzorców danych i obciążenia.