Auf einen Blick: ElasticSearch ist eine noSQL-JSON-Datenbank, die sich ideal zum Speichern von Anwendungsprotokollen und anderen JSON-Dokumenten eignet. Dieser Leitfaden behandelt wesentliche Themen, darunter die Cluster-Konfiguration für die Versionen 6.x und 7.x, die Nutzung von Kibana sowie JSON-vs. SQL-Datenbanken.
- Erklärt die Verwendung von Logstash und Filebeat zum Log Parsing.
- Details zu ElasticSearch-Indizes und verschachtelten Dokumenten.
ElasticSearch (ES) ist eine noSQL-JSON-Datenbank (nicht nur SQL JavaScript Object Notation). Ihre Hauptanwendung ist die Speicherung von Logs von Anwendungen, Netzwerkgeräten, Betriebssystemen usw. Aber sie eignet sich für die Speicherung jeglicher Art von JSON-Dokumenten. Sie könnten sie also anstelle von beispielsweise MongoDB verwenden. Dennoch hat MongoDB eine native Unterstützung für JavaScript, wie wir hier erklärt haben, was Sie nützlich finden werden. ES verfügt jedoch nicht über eine solche REPL-Kommandozeile (read-eval-print loop), außer Curator, das für Admin-Funktionen verwendet werden kann.
Was in diesem Leitfaden enthalten ist
In diesem Leitfaden behandeln wir die wichtigsten ElasticSearch-Themen.
Dazu gehören:
- Wie man einen ElasticSearch-Cluster einrichtet, der sowohl die Versionen 6.x als auch 7.x anzeigt, da Version 7 sich wesentlich unterscheidet.
- Wie man Kibana verwendet (also das ES-Dashboard)
- Die Lucent-Abfragesprache
- Wie unterscheiden sich JSON-Datenbanken von traditionellen SQL-Datenbanken wie Oracle
- Verwendung von Apache PIG mit ES
- Verwendung von Apache Spark und Apache Spark Machine Learning mit ES
- ElasticSearch-Indizes
- Verwendung von Filebeat und Logstash, um Webserver-, Router- sowie benutzerdefinierte und handelsübliche Anwendungsprotokolle zu analysieren.
- Verschachtelte Dokumente innerhalb von Dokumenten
- Systemadministration
- Hinzufügen von Clustern und Re-Indexierung von Dokumenten
JSON-Dokumente und noSQL
Zuerst ist es notwendig zu verstehen, was eine JSON-Datenbank ist und tut. Traditionell speichern Datenbanken Datensätze in Tabellen in Spalten. Das nennt man eine relationale Datenbank (RDBMS). Das bekannteste Beispiel dafür ist Oracle, das in den 1970er Jahren aus einem von IBM verfassten Artikel erfunden wurde, einem Produkt, das Larry Ellison zu einem ziemlich reichen Mann gemacht hat und ihm viele Jahre lang ein Monopol verschaffte. (Es gibt Open-Source-Alternativen wie MySQL. Aber was machen Monopole? Sie kaufen die Konkurrenz auf. Oracle hat MySQL gekauft.)
Die in einem RDBMS gespeicherten Daten werden in einer Join-Operation zusammengefügt und in den meisten Fällen normalisiert. Als Beispiel hierfür betrachten Sie ein Lagersystem. Sie haben Produkte und dann eine Tabelle mit Lagerbeständen (Verkauf, Lager, Verlust usw.). Sie würden diese wahrscheinlich in zwei separaten Tabellen speichern, wie diese:
LogStash
Die gemeinsamen Elemente, auf denen man die beiden verbindet, sind die UPC/EAN-Nummern (Universal Product Code und European Article Number). Das sind die im Supermarkt gescannten Barcodes. Das Produkt führt die Inventarzählung. Die Lagerhaltungstabelle speichert Verkauf, Erhalt, Verlust und andere Transaktionen.
JSON-Datenbanken unterstützen keine Join-Operationen oder fördern sie eher, obwohl diese Operation erzwungen werden kann. Warum? Weil das Kombinieren zweier Tabellen eine kostspielige Operation ist, da sie alle Datensätze einer Tabelle scannen muss, um Übereinstimmungsdatensätze in einer anderen zu finden. Natürlich kann diese Operation mit Indizes beschleunigt werden.
Anstatt Joins durchzuführen, bettet die JSON-Datenbank Dokumente ineinander ein, wie unten gezeigt, wobei die Transaktionen im Produktdokument liegen.
{
"product": "led lightbulbs 10w 6 pack",
"EAN": 978020137962,
"transactions": [{
"trans": "sale",
"quantity": -100
},
{
"trans": "receive",
"quantity": 6100
}
],
"stock": 8000
}
Es wäre wenig hilfreich, Logs im nativen Format in ElasticSearch zu dumpen, da man sie nicht standardmäßig abfragen könnte.
Wenn man zum Beispiel einen Webserver betreibt und die Logs direkt in ElasticSearch überträgt, wären sie nicht leicht lesbar, da sie nicht in einzelne Felder geparst werden. Was ElasticSearch macht (mit Logstash oder Filebeat oder beiden), ist, jede Zeile in JSON-Format zu parsen. Zum Beispiel sieht ein nginx-Webserver-Log so aus:
191.100.8.229 - - [14/May/2019:06:46:08 +0000] "GET / HTTP/1.1" 200 3100 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
103.206.128.70 - - [14/May/2019:07:20:27 +0000] "GET / HTTP/1.1" 200 3100 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
Das wandelst du mit den ElasticSearch-Tools Logstash, Grok und Filebeat in JSON um.
Die Curl-Schnittstelle
Wenn Sie mit einer JSON-Datenbank arbeiten, ist es wichtig, deren APIs (Application Programming Interface) zu kennen. Da sie APIs verwendet, können Sie mit jeder beliebigen Programmiersprache kommunizieren. Und da es auch SDKs (Software Developer Kit) gibt, können Sie mit bestimmten Programmiersprachen kommunizieren. Der Unterschied ist, dass APIs über HTTP und HTTPS funktionieren, was bedeutet, dass keine direkte Verbindung zum System über einen Port erforderlich ist, der vielleicht nicht offen ist. Außerdem sind APIs auf die Operationen GET, PUT, POST und DELETE beschränkt.
Zum Beispiel können Sie Indizes wie folgt auflisten:
curl -XGET http://172.31.46.15:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_task_manager k00ncRwwTJKTA41OF7QTfg 1 1 2 0 62.4kb 31.2kb
green open .monitoring-kibana-6-2019.05.14 eaNOm7yXT8m62DEqv1Zkow 1 1 251 0 420.7kb 210.3kb
green open .kibana_2 cTq9L_2zT0yfDhmChb0njQ 1 1 616 77 716.6kb 358.3kb
green open .monitoring-es-6-2019.05.15 ZgNBg16SS4qDkzuMctzchg 1 1
Und du kannst ES so schreiben:
curl -XPUT --header 'Content-Type: application/json' http://localhost:9200/samples/_doc/1 -d '{
"school" : "Harvard"
}'
Und dann diese Abfrage mit:
curl -XGET --header 'Content-Type: application/json' http://localhost:9200/samples/_search -d '{
"query" : {
"match" : { "school": "Harvard" }
}
}'
Und all das kannst du auch mit der Kibana-Grafikoberfläche machen.
Hinweis: Von dem letzten Beispiel würden Puristen sagen, dass es nicht logisch ist, da die GET-Operation keine Körper- (also -d-)Parameter annimmt. ElasticSearch sagt jedoch, dass sie dies tut, da die RFC-Spezifikation für Weboperationen dies so angibt.
Also, schnall dich an, während wir dich durch ElasticSearch führen. Es wird eine wilde Fahrt.
ElasticSearch-Leitfaden
- ElasticSearch Tutorial für Anfänger: ElasticSearch Grundlagen
- Verwendung von Apache Hive mit ElasticSearch
- Verwendung von ElasticSearch mit Apache Spark
- Curl ElasticSearch Befehle Spickzettel
- Spark ElasticSearch Hadoop-Update und Upsert Beispiel und Erklärung
- Wie man Apache Spark-Daten mit Python in ElasticSearch schreibt
- ElasticSearch-Suchsyntax sowie boolesche und Aggregationssuchen
- ElasticSearch verschachtelte Abfragen: Wie man nach eingebetteten Dokumenten sucht
- ElasticSearch Joins: Has_Child, Has_parent Abfrage
- Wie man einen elastischen Cluster der Version 7 einrichtet
- Wie man Filebeat für nginx und ElasticSearch konfiguriert
- Beats und Logstash verwenden, um Logs an ElasticSearch zu senden
- Wie man eine CSV-Datei mit Logstash in ElasticSearch lädt
- ElasticSearch-Aggregationen erklärt
- Was ist der ELK-Stack?
- Logstash 101: Verwendung von Logstash in einer Datenverarbeitungspipeline
- Verwendung von Kibana zur Ausführung von Abfragen in ElasticSearch mit Lucene und Kibana Query Language
- ElasticSearch Maschinelles Lernen
- Wie man Elastic Enterprise Search installiert
- Wie man Elastic Enterprise Search mit GitHub verwendet
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.