An Elasticsearch Tutorial: Getting Started

#Note: Az Elastic nemrég bejelentette, hogy az Elasticsearch és a Kibana új verzióira a 7.9-es verzión túl zárt forráskódú licencelést vezet be. További részletekért olvassa el vezérigazgatónk, Tomer Levy megjegyzéseit a Truly Doubling Down on Open Source című cikkünkben.

Elasticsearch a ma legnépszerűbb naplóelemző platform – az ELK Stack (Elasticsearch, Logstash és Kibana) – élő szíve. Az Elasticsearch szerepe annyira központi, hogy magának a stacknek a nevével vált szinonimává. Az elsősorban keresésre és naplóelemzésre szolgáló Elasticsearch ma már az egyik legnépszerűbb adatbázis-rendszer. Ez az Elasticsearch bemutató az új felhasználók számára biztosítja az Elasticsearch használatának megkezdéséhez szükséges ismereteket és eszközöket. Tartalmaz telepítési utasításokat, valamint kezdeti indexelési és adatkezelési utasításokat.

Mi az Elasticsearch?

Az eredetileg 2010-ben megjelent Elasticsearch (néha ES-nek is nevezik) egy modern kereső- és elemzőmotor, amely az Apache Lucene-en alapul. Az Elasticsearch teljesen nyílt forráskódú és Java nyelven készült, az Elasticsearch egy NoSQL adatbázis. Ez azt jelenti, hogy az adatokat strukturálatlanul tárolja, és nem lehet SQL-t használni a lekérdezéshez.

Ez az Elasticsearch bemutató szintén NoSQL bemutatónak tekinthető. A legtöbb NoSQL-adatbázistól eltérően azonban az Elasticsearch nagy hangsúlyt fektet a keresési képességekre és funkciókra – olyannyira, hogy az ES-ből származó adatok megszerzésének legegyszerűbb módja a keresés a kiterjedt Elasticsearch API segítségével.

Az adatelemzés kontextusában az Elasticsearch az ELK Stack többi komponensével, a Logstash-sel és a Kibanával együtt használatos, és az adatok indexelésében és tárolásában játszik szerepet.

Az Elasticsearch telepítése

Az Elasticsearch követelményei egyszerűek: Java 8 (ajánlott konkrét verzió: Oracle JDK 1.8.0_131 verzió). Vessen egy pillantást erre a Logstash bemutatóra, hogy megbizonyosodjon arról, hogy készen áll. Emellett meg kell győződnie arról, hogy az operációs rendszere szerepel az Elastic támogatási mátrixában, különben furcsa és kiszámíthatatlan problémákba ütközhet. Ha ez megtörtént, akkor kezdheti az Elasticsearch telepítését.

Az Elasticsearch-et letöltheti önálló disztribúcióként, vagy telepítheti a apt és yum tárolók segítségével. Az Elasticsearch-et egy AWS EC2-n futó Ubuntu 16.04-es gépre fogjuk telepíteni az apt használatával.

Először is hozzá kell adnunk az Elastic aláíró kulcsát, hogy ellenőrizni tudjuk a letöltött csomagot (ezt a lépést kihagyhatjuk, ha már telepítettünk csomagokat az Elasticból):

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

Debian esetén ezután a apt-transport-https csomagot kell telepítenünk:

sudo apt-get install apt-transport-https

A következő lépés a repository definíció hozzáadása a rendszerünkhöz:

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

Már csak a tárolók frissítése és az Elasticsearch telepítése van hátra:

sudo apt-get updatesudo apt-get install elasticsearch

Az Elasticsearch konfigurálása

Az Elasticsearch konfigurálása egy konfigurációs fájl segítségével történik, amelynek helye az operációs rendszertől függ. Ebben a fájlban konfigurálhatja az általános beállításokat (pl. csomópont neve), valamint a hálózati beállításokat (pl. hoszt és port), az adatok tárolásának helyét, a memóriát, a naplófájlokat és még sok mást.

A fejlesztés és tesztelés céljaira az alapértelmezett beállítások elegendőek, mégis ajánlott némi kutatást végezni, hogy milyen beállításokat kell manuálisan megadni, mielőtt a termelésbe lépne.

Például, és különösen, ha az Elasticsearch-et a felhőbe telepítjük, jó gyakorlat, ha az Elasticsearch-et vagy egy privát IP-hez vagy localhosthoz kötjük:

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

Elasticsearch futtatása

Az Elasticsearch nem fog automatikusan futni a telepítés után, hanem kézzel kell elindítani. Az Elasticsearch futtatásának módja az adott rendszertől függ. A legtöbb Linux és Unix alapú rendszeren ezt a parancsot használhatja:

sudo service elasticsearch start

És ennyi! Annak megerősítéséhez, hogy minden rendben működik, egyszerűen irányítsd a curl-t vagy a böngésződet a http://localhost:9200 címre, és a következő kimenethez hasonlót kell látnod:

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

Az Elasticsearch futtatási folyamatának hibakereséséhez használd az Elasticsearch naplófájljait, amelyek (Deb-en) a /var/log/elasticsearch/ alatt találhatók.

Elasticsearch index létrehozása

Az indexelés az Elasticsearch adatainak hozzáadása. Ennek oka, hogy amikor adatokat táplálunk az Elasticsearch-be, az adatok az Apache Lucene indexekbe kerülnek. Ennek azért van értelme, mert az Elasticsearch a Lucene indexeket használja az adatok tárolására és visszakeresésére. Bár nem kell sokat tudnia a Lucene-ről, mégis hasznos tudni, hogyan működik, amikor elkezd komolyabban foglalkozni az Elasticsearch-rel.
Az Elasticsearch úgy viselkedik, mint egy REST API, így az adatok hozzáadásához használhatja a POST vagy a PUT módszert. A PUT-et akkor használjuk, ha tudjuk vagy meg akarjuk adni az adatelem id-jét, vagy a POST-et, ha azt szeretnénk, hogy az Elasticsearch generáljon egy id-t az adatelemhez:

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

A válasz pedig:

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

A dokumentum adatait JSON objektumként küldjük. Talán elgondolkodik azon, hogy hogyan indexelhetünk adatokat az adatok szerkezetének meghatározása nélkül. Nos, az Elasticsearch esetében, mint bármely más NoSQL adatbázis esetében, nincs szükség az adatok szerkezetének előzetes meghatározására. Az optimális teljesítmény biztosítása érdekében azonban definiálhatjuk az Elasticsearch leképezéseit az adattípusok szerint. Erről bővebben később.

Ha a Beats shipperek bármelyikét (pl. Filebeat vagy Metricbeat) vagy a Logstash-t használja, az ELK Stack ezen részei automatikusan létrehozzák az indexeket.

Az Elasticsearch indexek listájának megtekintéséhez használja:

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

A lista ebben az esetben tartalmazza a fent létrehozott indexeket, egy Kibana indexet és egy Logstash pipeline által létrehozott indexet.

Elasticsearch lekérdezés

Mihelyt indexelte az adatokat az Elasticsearch-be, elkezdheti a keresést és az elemzést. A legegyszerűbb lekérdezés, amit elvégezhet, egyetlen elem lekérdezése. Olvassa el a kizárólag az Elasticsearch-lekérdezésekre összpontosító cikkünket.

Még egyszer, az Elasticsearch REST API-n keresztül használjuk a GET:

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

A válasz:

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

Az aláhúzással kezdődő mezők az eredmény összes metamezője. A _source objektum az eredeti dokumentum, amelyet indexeltünk.
A GET segítségével is végezhetünk keresést, a _search végpont meghívásával:

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

A találat számos extra mezőt tartalmaz, amelyek mind a keresést, mind az eredményt leírják. Íme egy gyors áttekintés:

  • took: A keresés időtartama ezredmásodpercben
  • timed_out: If the search timed out
  • _shards: A keresett Lucene shards száma, valamint a siker és a sikertelenség aránya
  • hits: A tényleges eredmények, az eredmények meta információival együtt

A fenti keresést URI keresésnek nevezzük, és ez a legegyszerűbb módja az Elasticsearch lekérdezésének. Ha csak egy szót adunk meg, az ES az összes dokumentum összes mezőjében rákeres erre a szóra. A Lucene lekérdezésekkel specifikusabb kereséseket is létrehozhat:

  • username:johnb – Olyan dokumentumokat keres, ahol a felhasználónév mező egyenlő “johnb”
  • john* – Olyan dokumentumokat keres, amelyek olyan kifejezéseket tartalmaznak, amelyek john-val kezdődnek, és amelyeket nulla vagy több karakter követ, például “john,” “johnb,” és “johnson”
  • john? – Olyan dokumentumokat keres, amelyek olyan kifejezéseket tartalmaznak, amelyek john kezdetűek, és csak egy karakter követi őket. A “johnb”-t és a “johns”-t találja, de a “john”-t nem.”

A keresésnek számos más módja is van, beleértve a boolék logikáját, a kifejezések felerősítését, a fuzzy és proximity keresést, valamint a reguláris kifejezések használatát.

Elasticsearch Query DSL

AURI keresés csak a kezdet. Az Elasticsearch egy kéréstörzs keresést is biztosít egy Query DSL-lel a fejlettebb keresésekhez. Az ilyen típusú kereséseknél a lehetőségek széles skálája áll rendelkezésre, és a különböző opciókat kombinálhatjuk, hogy a kívánt eredményt kapjuk.

Kétféle záradékot tartalmaz:

Elasticsearch lekérdezési típusok

Az ilyen típusú keresésekben a lehetőségek széles skálája áll rendelkezésre, és különböző opciókat kombinálhat, hogy megkapja a kívánt eredményeket. A lekérdezés típusok közé tartoznak:

  1. Geo lekérdezések,
  2. “More like this” lekérdezések
  3. Scripted queries
  4. Full text queries
  5. Shape queries
  6. Span queries
  7. Term-level queries
  8. Specialized queries

Az Elasticsearch 6-tól.8 az ELK Stack összevonta az Elasticsearch lekérdezéseket és az Elasticsearch szűrőket, de az ES továbbra is megkülönbözteti őket kontextus szerint. A DSL különbséget tesz szűrő-kontextus és lekérdezési kontextus között a lekérdezési záradékok esetében. A szűrő-kontextusban lévő záradékok bólés módon tesztelik a dokumentumokat: A dokumentum megfelel a szűrőnek, “igen” vagy “nem”? A szűrők általában gyorsabbak is, mint a lekérdezések, de a lekérdezések is képesek relevanciapontszámot kiszámítani aszerint, hogy egy dokumentum mennyire felel meg a lekérdezésnek. A szűrők nem használnak relevancia pontszámot. Ez határozza meg a dokumentumok sorrendjét és felvételét:

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

És az eredményt:

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

Elasticsearch fürt létrehozása

Elasticsearch fürt fenntartása időigényes lehet, különösen, ha DIY ELK-t csinál. De az Elasticsearch erőteljes keresési és elemzési képességei miatt az ilyen fürtök nélkülözhetetlenek. Az Elasticsearch fürt bemutatóval mélyebbre merülünk a témában, így ezt használjuk ugródeszkaként ehhez az alaposabb bejáráshoz.

Mi is pontosan egy Elasticsearch fürt? Az Elasticsearch fürtök több Elasticsearch csomópontot és/vagy példányt csoportosítanak. Természetesen mindig dönthet úgy, hogy egyetlen Elasticsearch példányt vagy csomópontot tart fenn egy adott fürtön belül. Az ilyen csoportosítás lényege a feladatok, a keresés és az indexelés elosztásában rejlik a klaszter csomópontjai között. A csomóponti lehetőségek közé tartoznak az adatcsomópontok, a mestercsomópontok, az ügyfélcsomópontok és az ingest csomópontok.

A csomópontok telepítése számos konfigurációval járhat, amelyekkel a fent említett oktatóanyagunk foglalkozik. De íme az Elasticsearch fürt csomópontok alapvető telepítése:

Először is telepítsük a Javát:

sudo apt-get install default-jre

Ezután adjuk hozzá az Elasticsearch bejelentkezési kulcsát:

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

Majd telepítse az Elasticsearch új iterációját:

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

Minden Elasticsearch csomópont saját elasticsearch.yml config fájlját (sudo vim /etc/elasticsearch/elasticsearch.yml) kell létrehoznia és/vagy beállítania. Innen indítsa el az Elasticsearch-et, majd ellenőrizze az Elasticsearch fürt állapotát. A válaszok valahogy így fognak kinézni:

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

Az Elasticsearch fürt állapota lesz a következő a listán. Rendszeresen ellenőrizze a fürtje állapotát a következő API-hívással:

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

Ez a példa a local paramétert false-nak mutatja (ami valójában alapértelmezett). Ez megmutatja a fő csomópont állapotát. A helyi csomópont ellenőrzéséhez módosítsa true-re.

A level paraméter alapértelmezés szerint a fürt állapotát mutatja, de az ezen túli rangok közé tartozik a indices és a shards (mint a fenti példában).

Az időkorlátokhoz további opcionális paraméterek állnak rendelkezésre…

timeout
master_timeout

…vagy bizonyos események bekövetkeztére való várakozáshoz:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Elasticsearch adatok törlése

Az elemek törlése az Elasticsearchből ugyanolyan egyszerű, mint az adatok bevitele az Elasticsearchbe. A használandó HTTP módszer ezúttal – meglepetés, meglepetés –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}

Egy index törléséhez használjuk:

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

Az összes index törléséhez (rendkívül óvatosan használjuk) használjuk:

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

A válasz mindkét esetben:

{ "acknowledged" : true}

Egyetlen dokumentum törléséhez:

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

Mi következik?

Ez a bemutató a kezdőknek segít az Elasticsearch használatában, és mint ilyen, csak az Elasticsearchben végzett CRUD műveletek alapvető lépéseit ismerteti. Az Elasticsearch egy keresőmotor, és mint ilyen, hatalmas mélységű keresési funkciókkal rendelkezik.
A legutóbbi verziók hihetetlen új Elasticsearch funkciókat vezettek be, és az alapul szolgáló adatstruktúrában is jelentős változások történtek.

Az Elasticsearch hivatalos dokumentációját, valamint a Logstash bemutatót és a Kibana bemutatót mindig érdemes felfedezni.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.