Blog
Search8 min czytania

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 _source do pobierania tylko wymaganych pól.
  • Wykorzystuj filtry do zawężenia wyszukiwania.
  • Używaj range, match, terms do 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.

  1. Pobierz dystrybucję Elasticsearch z oficjalnej strony internetowej.
  2. Rozpakuj pliki w wybranej lokalizacji.
  3. Uruchom ./elasticsearch (Linux/Mac) lub elasticsearch.bat (Windows).
  4. 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.