Ein kleines Docker Beispiel, wie wir Daten aus einer MySQL Datenbank in elasticsearch importieren. Dabei werden wir die Daten aus unterschiedlichen Tabellen zusammen führen und zu einem Objekt umwandeln. Darum setzen wir Logstash für dieses Beispiel ein.
2. AGENDA
• ÜBERBLICK
• VORBEREITUNG DER CONTAINER
• A. START VON MYSQL & PHPMYADMIN
• B. VORBEREITUNG DER MYSQL DATENBANK
• C. START VON ELASTICSEARCH & KIBANA
• IMPLEMENTIERUNG DER KONFIGURATIONSDATEI
• A. INPUT (JDBC)
• C. FILTER (JDBC_STREAMING, RUBY)
• B. OUTPUT (ELASTICSEARCH)
• DURCHFÜHRUNG DES IMPORT
• START LOGSTASH
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 2
3. ÜBERBLICK
• WER BIST DU?
• WAS IST DAS ZIEL?
• WAS BENÖTIGE ICH?
• WIE MACHE ICH DAS?
ICH BIN DIETER, EIN ANWENDUNGSENTWICKLER
DATEN AUS MYSQL MIT LOGSTASH IN ELASTICSEARCH IMPORTIEREN
WIR BRAUCHEN DAFÜR NUR DOCKER + MYSQL-TREIBER
WIR STARTEN DOCKER CONTAINER UND ERSTELLEN EIN
KONFIGURATIONSDATEI
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 3
4. ÜBERBLICK
WAS IST DER PLAN?
• WIR LESEN DATEN AUS EINER MYSQL
DATENBANK AUS
• MANIPULIEREN DIE DATEN
• INFORMATION AUS UNTERSCHIEDLICHEN TABELLEN
ZU EINEM OBJEKT
• IMPORT DER DATEN NACH ELASTICSEARCH
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 4
5. ÜBERBLICK
WOZU LOGSTASH?
• LOGSTASH IST EINE SERVERSEITIGE OPEN-
SOURCE-SOFTWARE
• SIMULTANE VERARBEITUNG
• DATEN AUS UNTERSCHIEDLICHEN QUELLEN
• MANIPULIERUNG UND WEITERLEITUNG DER DATEN
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 5
Quelle: https://www.elastic.co/
6. VORBEREITUNG
WIR BENÖTIGEN FÜR DIESEN TASK NUR DOCKER
CONTAINER
• MYSQL & PHPMYADMIN
• ELASTICSEARCH
• KIBANA
• LOGSTASH
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 6
7. VORBEREITUNG
STARTE DIE MOTOREN!
• STARTE DIE CONTAINER FÜR MYSQL
• & PHPMYADMIN
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 7
DOCKER RUN --NAME MYSQL-SERVER
-P 3306:3306
-E MYSQL_ROOT_PASSWORD=CODINGSOLO
-D MYSQL:LATEST
DOCKER RUN –NAME MYADMIN
-D --LINK MYSQL-SERVER:DB
-P 8080:80 PHPMYADMIN/PHPMYADMIN
8. VORBEREITUNG
JETZT SUCHEN WIR UNSEREN MYSQL-TREIBER AUF
MAVEN
• GEH AUF FOLGENDE URL
HTTPS://MVNREPOSITORY.COM/
26.04.2020Autor: Dieter Schanz 8
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
9. VORBEREITUNG
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 9
• SUCHE NACH MYSQL-CONNECTOR
• WÄHLE DIE DIE PASSENDE VERSION AUS, DIE ZU
DEINEM MYSQL CONTAINER PASST
• DANN LÄDST DU DIR DIE JAR HERUNTER
10. VORBEREITUNG
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 10
LETZTER SCHRITT
• LADE DIR MEINE BEISPIEL DATEN FÜR DIE MYSQL
DATENBANK HERUNTER
• DAMIT WIRD EINE NEUE DATENBANK ANGELEGT,
DIE DATENBANK-STRUKTUR UND TESTDATEN
• AUßERDEM WIRD EIN NEUER BENUTZER FÜR
LOGSTASH ERSTELLT
HTTPS://GITHUB.COM/SCHADIET/ELASTICSEARCH-DOCKER-
WITH-LOGSTASH-JDBC-AND-
MAGIC/BLOB/MASTER/TUTORIAL%20CODINGSOLO.SQL
11. VORBEREITUNG
LASS UNS DIE DATENBANK VORBEREITEN!
• GEH AUF HTTP://LOCALHOST:8080/
• LOG IN ALS ROOT
• PASSWORT WURDE BEIM START DES MYSQL-CONTAINERS
GESETZT
• IMPORT VON TUTORIAL CODINGSOLO.SQL
26.04.2020Autor: Dieter Schanz 11
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
12. VORBEREITUNG
WIR ERSTELLEN JETZT EINE ORDNERSTRUKTUR
• HAUPTORDNER ELASTICSEARCH_IMPORT
• UNTERORDNER
• DRIVER
• PIPELINE
• IN DRIVER KOMMT DER MYSQL-CONNECTOR
• IN PIPELINE ERSTELLEN WIR DIE KONFIGURATIONSDATEI
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 12
13. VORBEREITUNG
WIR ERSTELLEN JETZT EIN DOCKER NETZWERK
• FÜR ELASTICSEARCH & KIBANA
• NAME IST FREI WÄHLBAR -> SKYNET
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 13
DOCKER NETWORK CREATE SKYNET
14. VORBEREITUNG
STARTEN WIR NUN AUCH ELASTICSEARCH & KIBANA
DOCKER RUN -D --NAME ELASTICSEARCH
--NET SKYNET
-P 9200:9200 -P 9300:9300
-E "DISCOVERY.TYPE=SINGLE-NODE"
ELASTICSEARCH:7.6.2
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 14
DOCKER RUN -D --NAME KIBANA
--NET SKYNET
-P 5601:5601 KIBANA:7.6.2
15. VORBEREITUNG
WIR PRÜFEN NUN BEIDE SYSTEME:
• ELASTICSEARCH ERREICHST DU UNTER
HTTP://LOCALHOST:9200/
26.04.2020Autor: Dieter Schanz 15
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
16. VORBEREITUNG
• KIBANA ERREICHST DU UNTER
HTTP://LOCALHOST:5601/
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 16
17. IMPLEMENTIERUNG
JETZT LEGEN WIR LOS!
LASS UNS NUN DIE KONFIGURATIONSDATEI BEARBEITEN:
• EINE TYPISCHE KONFIGURATION HAT DREI BEREICHE
• INPUT
• FILTER
• OUTPUT
• BEI MULTIPLEN DATENOBJEKTEN SOLLTEST DU DEN OBJECT-TYPE ABFRAGEN
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 17
input {
}
filter {
##Check you are working with the correct type
if[type] == "XY" {
}
}
output {
if[type] == "XY" {
}
stdout { codec => rubydebug }
}
18. IMPLEMENTIERUNG
INPUT
• JDBC
• WIR VERGEBEN EINEN OBJECT-TYPE
• BEI MULTIPLEN INPUT-OBJEKTEN NOTWENDIG
• SCHEDULE
• CRON SYNTAX
26.04.2020Autor: Dieter Schanz 18
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
input {
##JDBC Plugin to Query Data from MySQL
jdbc {
type => "kundendaten"
schedule => "* * * * *"
jdbc_driver_library => "/driver/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/codingsolo"
jdbc_user => "elastic"
jdbc_password => "elastic"
statement => "SELECT * FROM codingsolo.kunde;"
}
}
19. IMPLEMENTIERUNG
INPUT
• JDBC
• DRIVER
• PFAD ZUM TREIBER (AUF SEITE DES CONTAINERS)
• DRIVER CLASS
• CONNECTION STRING
• ADRESSE DER MYSQL DB & DATENBANKNAME
• USER & PASSWORD KAM MIT DEN TESTDATEN
• STATEMENT DEIN DATENBANK QUERY
26.04.2020Autor: Dieter Schanz 19
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
input {
##JDBC Plugin to Query Data from MySQL
jdbc {
type => "kundendaten"
schedule => "* * * * *"
jdbc_driver_library => "/driver/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/codingsolo"
jdbc_user => "elastic"
jdbc_password => "elastic"
statement => "SELECT * FROM codingsolo.kunde;"
}
}
20. IMPLEMENTIERUNG
FILTER
• JDBC_STREAMING FÜR BESTELLUNGEN
• DIE JDBC KONFIGURATIONEN AUS DEM JDBC
INPUT
• STATEMENT
• QUERY FÜR WEITERE DATEN
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 20
## jdbc_streaming Plugin add MORE Data
## from different Tables / Databases
jdbc_streaming {
jdbc_driver_library => "/driver/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/codingsolo"
jdbc_user => "elastic"
jdbc_password => "elastic"
statement => "SELECT id as bestellung_id,
bestellung_datum,
bestellung_status
from codingsolo.bestellung
WHERE codingsolo.bestellung.kunde_id = :idparam;"
parameters => { "idparam" => "id" }
target => "kunde_bestellung"
}
21. IMPLEMENTIERUNG
FILTER
• JDBC_STREAMING FÜR BESTELLUNGEN
• PARAMETERS
• WIR VERKNÜPFEN IDPARAM AUF DIE ID DER
DATEN AUS DEM OBJECT-TYPE KUNDENDATEN
• TARGET
• WIR SPEICHERN DIE DATEN IN DAS NEUE FELD
KUNDE_BESTELLUNG
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 21
## jdbc_streaming Plugin add MORE Data
## from different Tables / Databases
jdbc_streaming {
jdbc_driver_library => "/driver/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/codingsolo"
jdbc_user => "elastic"
jdbc_password => "elastic"
statement => "SELECT id as bestellung_id,
bestellung_datum,
bestellung_status
from codingsolo.bestellung
WHERE codingsolo.bestellung.kunde_id = :idparam;"
parameters => { "idparam" => "id" }
target => "kunde_bestellung"
}
22. IMPLEMENTIERUNG
FILTER
• JDBC_STREAMING FÜR ANSCHRIFT
• PARAMETERS
• WIR VERKNÜPFEN IDPARAM AUF DIE ID DER
DATEN AUS DEM OBJECT-TYPE KUNDENDATEN
• TARGET
• WIR SPEICHERN DIE DATEN IN DAS NEUE FELD
KUNDE_ANSCHRIFT
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 22
##jdbc_streaming Plugin to add Data from different Tables / Databases
jdbc_streaming {
jdbc_driver_library => "/driver/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/codingsolo"
jdbc_user => "elastic"
jdbc_password => "elastic"
statement => "SELECT codingsolo.kunde_anschrift.kunde_id,
anschrift.id,
anschrift.anschrift_Strasse,
anschrift.anschrift_hausnummer,
anschrift.anschrift_postleitzahl,
anschrift.anschrift_ort,
anschrift.anschrift_erstellung,
land_name as Anschrift_land,
land_kuerzel FROM codingsolo.kunde_anschrift
LEFT JOIN codingsolo.anschrift as anschrift
ON codingsolo.kunde_anschrift.anschrift_id = anschrift.id
LEFT JOIN codingsolo.land as land
ON anschrift.anschrift_land = land.id
WHERE codingsolo.kunde_anschrift.kunde_id = :idparam;"
parameters => {"idparam" => "id" }
target => "kunde_anschrift"
}
23. IMPLEMENTIERUNG
FILTER
• JDBC_STREAMING FÜR BESTELLPOSTEN
• PARAMETERS
• WIR VERKNÜPFEN IDPARAM AUF DIE ID DER DATEN
AUS DEM OBJECT-TYPE KUNDENDATEN
• TARGET
• WIR SPEICHERN DIE DATEN IN DAS NEUE FELD
BESTELLUNG_POSTEN
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 23
##jdbc_streaming Plugin add MORE Data from different Tables / Databases
jdbc_streaming {
jdbc_driver_library => "/driver/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/codingsolo"
jdbc_user => "elastic"
jdbc_password => "elastic"
statement => "SELECT
codingsolo.bestellung_artikel.id as bestellung_id,
codingsolo.bestellung_artikel.anzahl,
artikel.id,
artikel.artikel_name,
artikel.artikel_preis,
artikel.artikel_status
FROM codingsolo.bestellung_artikel
LEFT JOIN codingsolo.artikel as artikel
ON codingsolo.bestellung_artikel.artikel_id = artikel.id
WHERE codingsolo.bestellung_artikel.id in :idparam;"
parameters => { "idparam" => "bestellung_temp"}
target => "bestellung_posten"
}
24. IMPLEMENTIERUNG
FILTER
RUBY CODE
• WIR KÖNNEN EIGENE LOGIK IMPLEMENTIEREN
• BEISPIEL: ITERATION ÜBER DIE BESTELLUNGEN
• AUSLESEN DER BESTELL-ID
• SPEICHERN DER BESTELL-ID IN EINER LISTE
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 24
## Extracting all bestellung_id from Field:kunde_bestellung
## into a List of Strings
ruby {
code => '
event.get("kunde_bestellung").each do |item|
if not event.get("bestellung_temp")
event.set("bestellung_temp", [item["bestellung_id"]])
else
event.set("bestellung_temp", event.get("bestellung_temp")
+ [item["bestellung_id"]])
end
end
'
}
25. IMPLEMENTIERUNG
FILTER
RUBY CODE
• WIR KÖNNEN EIGENE LOGIK IMPLEMENTIEREN
• BEISPIEL: ITERATION ÜBER DIE BESTELLPOSTEN
UND ÜBER DIE BESTELLUNGEN
• ABGLEICH BESTELLUNGEN UND BESTELLPOSTEN
• ZUWEISUNG BESTELLPOSTEN ZUR BESTELLUNG
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 25
## Adding order-line to orders MY GOAL is to include all entries
## from one bestellung_posten into the single kunde_bestellung
ruby {
code => '
event.get("bestellung_posten").each_with_index do |item, index_item|
event.get("kunde_bestellung").each_with_index do |order, index|
if order["bestellung_id"] == item["bestellung_id"]
if not event.get("[kunde_bestellung][#{index}][bestellung_posten]")
event.set("[kunde_bestellung][#{index}][bestellung_posten]", [item])
else
event.set("[kunde_bestellung][#{index}][bestellung_posten]",
order["bestellung_posten"] + [item])
end
end
end
end
'
}
26. IMPLEMENTIERUNG
FILTER
MUTATE
• WIR RÄUMEN DIE DATEN AUF
• REMOVE_FIELD ENTFERNT EINE FELD IM
DOKUMENT
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 26
##clean up
mutate {
remove_field => [ "bestellung_posten"]
remove_field => [ "bestellung_temp"]
}
27. IMPLEMENTIERUNG
OUTPUT
• ELASTICSEARCH
• ABFRAGE DES TYPES
• (UNTERSCHIEDLICHE IPUTS -> UNTERSCHIEDLICHE TYPEN)
• HOST AUF DEM ELASTICSEARCH LÄUFT
• INDEX
• AUF WELCHEM INDEX WERDEN DIE DATEN GESPEICHERT
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 27
output {
if[type] == "kundendaten" {
elasticsearch {
hosts => "localhost:9200"
index => "kundendaten"
document_type => "_doc"
document_id => "%{id}"
doc_as_upsert => true
action => "update"
}
}
stdout { codec => rubydebug }
}
28. IMPLEMENTIERUNG
OUTPUT
• ELASTICSEARCH
• DOCUMENT_ID
• DU KANNST EINE ID VERGEBEN
• DOC_AS_UPSERT
• DAMIT DATEN BEI AKTUALISIERUNG ÜBERSCHRIEBEN WERDEN
• WICHTIG! IMMER EIN STANDARD OUTPUT EINBAUEN
• DEBUG REASON
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 28
output {
if[type] == "kundendaten" {
elasticsearch {
hosts => "localhost:9200"
index => "kundendaten"
document_type => "_doc"
document_id => "%{id}"
doc_as_upsert => true
action => "update"
}
}
stdout { codec => rubydebug }
}
29. DURCHFÜHRUNG
BEVOR WIR LOGSTASH STARTEN:
• FÜR DIESES BEISPIEL GEBEN WIR DEN HOST ALS NETWORK AN:
• --NET="HOST"
• -V = ORDNER FREIGABE HOST:CONTRAINER
-V D:ELASTICSEARCH_IMPORTPIPELINE:/USR/SHARE/LOGSTASH/PIPELINE/
• WIR VERKNÜPFEN UNSEREN ORDNER PIPELINE MIT DEM AUS DEM CONTAINER
• CONTAINER-SEITIG ÜBERPRÜFT LOGSTASH OB IN PIPELINE KONFIGURATIONSDATEIEN BEREITLIEGEN
• ACHTE DABEI AUF DEN PFAD ZUM ORDNER. DEIN PFAD KANN ABWEICHEN
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 29
30. DURCHFÜHRUNG
STARTE WIR ENDLICH LOGSTASH!
• FREIGABE UNSERES ORDNER DRIVER
• LOGSTASH BENÖTIGT NOCH UNSEREN MYSQL-TREIBER
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 30
DOCKER RUN -IT --RM --NAME LOGSTASH
--NET="HOST"
-V D:ELASTICSEARCH_IMPORTPIPELINE:
/USR/SHARE/LOGSTASH/PIPELINE/
-V D:ELASTICSEARCH_IMPORTDRIVER
:/DRIVER/
DOCKER.ELASTIC.CO/LOGSTASH/LOGSTASH:7.6.2
31. DURCHFÜHRUNG
ÜBERPRÜFE DEIN ERGEBNIS:
• GEH AUF FOLGENDE ADRESSE:
HTTP://LOCALHOST:9200/KUNDENDATEN/_DOC/2
• ES SOLLTEN NUN DATEN DES KUNDEN MIT ANSCHRIFT
UND BESTELLUNGEN ANGEZEIGT WERDEN
• ALTERNATIV KÖNNEN WIR AUCH KIBANA NUTZEN
FIREFOX HAT EINE JSON-VIEWER
ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 31
{
"_index": "kundendaten",
"_type": "_doc",
"_id": "2",
"_source": {
"kunde_name": "Willson",
"kunde_sperrung": false,
"@version": "1",
"kunde_vorname": "Sam",
"type": "kundendaten",
"kunde_bestellung": [
{
"bestellung_datum": "2020-04-13T17:34:21.000Z",
"bestellung_status": "In Bearbeitung",
"bestellung_posten": [
{
"anzahl": 5,
"artikel_preis": 80.99,
"bestellung_id": 8003,
"artikel_name": "Gaming Maus (Pro Gramer)",
"id": 7,
"artikel_status": "gering"
}
],
"bestellung_id": 8003
}
],
"kunde_erstellung": "2020-04-18T15:02:25.000Z",
"id": 2,
"kunde_geburtsdatum": "1992-11-01T00:00:00.000Z",
"@timestamp": "2020-04-25T17:58:00.547Z",
"kunde_kundennummer": "K1021212",
"kunde_anschrift": [
{
"anschrift_erstellung": "2020-04-18T15:15:05.000Z",
"Anschrift_land": "England",
"anschrift_Strasse": "River Street",
"land_kuerzel": "en",
"anschrift_postleitzahl": "SW1E 6LB",
"anschrift_ort": "London",
"kunde_id": 2,
"id": 5,
"anschrift_hausnummer": "13"
}
]
}
}
32. ELASTICSEARCH & DOCKER mit
LOGSTASH, JDBC und Ruby
26.04.2020Autor: Dieter Schanz 32
DAS GANZES TUTORIAL FINDEST DU HIER:
WEITERE TUTORIALS FINDEST DU HIER:
UND DEN QUELLCODE HIER:
HTTPS://YOUTU.BE/6CVRM27D5DY
HTTPS://WWW.CODINGSOLO.DE/
HTTPS://GITHUB.COM/SCHADIET/ELASTICSEARCH-
DOCKER-WITH-LOGSTASH-JDBC-AND-MAGIC