Detaillierte Erklärung zur Synchronisierung von Daten von MySQL mit Elasticsearch

Detaillierte Erklärung zur Synchronisierung von Daten von MySQL mit Elasticsearch

1. Synchronisationsprinzip

Binlog-Protokollabonnement basierend auf MySQL: Das Binlog-Protokoll wird von MySQL verwendet, um Datenänderungen in Echtzeit aufzuzeichnen

Es gibt zwei Arten der MySQL-Datensynchronisierung mit ES: vollständige Synchronisierung und inkrementelle Synchronisierung

Vollständige Synchronisierung bedeutet, dass nach der ersten Erstellung des ES-Index alle Daten in MySQL auf einmal in ES importiert werden.

Inkrementelle Synchronisierung bedeutet, dass neue Daten in MySQL generiert werden. Diese neuen Daten umfassen drei Situationen: neu eingefügte Daten in MySQL, aktualisierte alte Daten und gelöschte Daten. Die Änderungen und Ergänzungen dieser Daten müssen mit ES synchronisiert werden.

2. logstash-eingabe-jdbc

Das offizielle Logstash-Plugin ist in Logstash integriert. Laden Sie einfach Logstash herunter und synchronisieren Sie MySQL- und Elasticsearch-Daten über die Konfigurationsdatei.

Vorteil

  • Es kann die vollständige und inkrementelle Datensynchronisierung von MySQL-Daten sowie die geplante Synchronisierung realisieren
  • Die Version wird schnell aktualisiert und ist relativ stabil
  • Als Teil des ES-eigenen Plug-Ins Logstash, einfach zu bedienen

Mangel

  • Synchrones Löschen ist nicht möglich. Nachdem MySQL-Daten gelöscht wurden, sind sie noch in Elasticsearch vorhanden.
  • Der kürzeste Synchronisierungszeitunterschied beträgt eine Minute, und die Daten werden einmal pro Minute synchronisiert. Eine Echtzeitsynchronisierung ist nicht möglich.

3. go-mysql-elasticsearch

go-mysql-elasticsearch ist ein Plug-in, das von einem einheimischen Autor entwickelt wurde

Vorteil

  • Kann eine vollständige und inkrementelle Datensynchronisierung von MySQL-Daten erreichen

Mangel

  • Nicht möglich, alle Daten mit Elasticsearch zu synchronisieren
  • Noch in der Entwicklung, relativ instabiles Stadium

4. elasticsearch-jdbc

Die neueste Version von elasticsearch-jdbc ist 2.3.4, und die unterstützte ElasticSearch-Version ist 2.3.4, die noch nicht implementiert ist.

Vorteil

  • Kann eine vollständige und inkrementelle Datensynchronisierung von MySQL-Daten erreichen

Mangel

  • Die neueste Version ist 2.3.4 und die unterstützte ElasticSearch-Version ist 2.3.4
  • Synchrones Löschen ist nicht möglich. Nachdem MySQL-Daten gelöscht wurden, sind sie noch in Elasticsearch vorhanden.

5. Logstash-Input-JDBC-Synchronisierung

Der erste Schritt ist die Installation:

Nach logstash5.x ist das Plug-In logstash-input-jdbc integriert. Installieren Sie nach der Installation von logstash das Plugin logstash-input-jdbc über den Befehl

cd /logstash-6.4.2/bin
./logstash-plugin installiere logstash-input-jdbc

Der zweite Konfigurationsschritt:

Erstellen Sie eine neue jdbc.conf im Ordner logstash-6.4.2/config und konfigurieren Sie sie wie folgt

Erstellen Sie eine neue jdbc.sql-Datei im Verzeichnis logstash-6.4.2/config

Wählen Sie * aus t_Mitarbeiter

Schritt 3: Ausführen

cd logstash-6.4.2
# Überprüfen Sie, ob die Syntax der Konfigurationsdatei korrekt ist. bin/logstash -f config/jdbc.conf --config.test_and_exit
# Starten Sie bin/logstash -f config/jdbc.conf --config.reload.automatic

--config.reload.automatic: Inhalt der Konfigurationsdatei automatisch neu laden

Zeigen Sie die synchronisierten Daten an, nachdem Sie den Index in Kibana erstellt haben

PUT Oktopus
GET octopus/_search

6. go-mysql-elasticsearch-Synchronisierung

Schritt 1: MySQL-Binlog-Protokoll

go-mysql-elasticsearch fügt Daten hinzu, löscht und ändert sie synchron mit elasticsearch über Binlog-Protokolle in MySQL

Das Binlog-Protokoll von MySQL wird hauptsächlich für die Master-Slave-Replikation und Datenwiederherstellung der Datenbank verwendet. Das Binlog zeichnet die Vorgänge zum Hinzufügen, Löschen, Ändern und Abfragen von Daten auf. Während des Master-Slave-Replikationsprozesses synchronisiert die Master-Datenbank das Binlog-Protokoll mit der Slave-Datenbank, und die Slave-Datenbank spielt die Ereignisse im Binlog-Protokoll erneut ab, um eine Master-Slave-Synchronisierung zu erreichen.

MySQL Binlog hat drei Modi:

ROW: Zeichnet jede Datenzeile auf, die geändert wurde, aber das Protokollvolumen ist zu groß. STATEMENT: Zeichnet jede SQL-Anweisung auf, die die Daten ändert, wodurch das Protokollvolumen reduziert wird. Allerdings ist die SQL-Anweisung bei Verwendung von Funktionen oder Triggern anfällig für Master-Slave-Inkonsistenzen. MIXED: Kombiniert die Vorteile von ROW und STATEMENT und wählt die Verwendung von ROW oder STATEMENT zum Aufzeichnen von Protokollen entsprechend der spezifischen SQL-Anweisung, die Datenoperationen ausführt.

Um Daten über MySQL-Binlog mit dem ES-Cluster zu synchronisieren, können Sie nur den ROW-Modus verwenden, da nur der ROW-Modus den geänderten Inhalt der Daten in MySQL kennen kann.

Am Beispiel der UPDATE-Operation lautet der Inhalt des Binlog-Protokolls im ROW-Modus wie folgt:

ZEITSTEMPEL EINSTELLEN=1527917394/*!*/;
    BEGINNEN
    /*!*/;
    # bei 3751
    #180602 13:29:54 Server-ID 1 end_log_pos 3819 CRC32 0x8dabdf01 Table_map: `webservice`.`building` zugeordnet zu Nummer 74
    # bei 3819
    #180602 13:29:54 Server-ID 1 end_log_pos 3949 CRC32 0x59a8ed85 Update_rows: Tabellen-ID 74 Flags: STMT_END_F
    
    BINLOG '
    UisSWxMBAAAARAAAAOsOAAAAAEoAAAAAAAAEACndlYnNlcnZpY2UACGJ1aWxkaW5nAAYIDwEPEREG
    wACAAQAAAAHfq40=
    UisSWx8BAAAAggAAAG0PAAAAAEoAAAAAAAEAAgAG///A1gcAAAAAAAALYnVpbGRpbmctMTAADwB3
    UkRNbjNLYlV5d1k3ajVbD64WWw+uFsDWBwAAAAAAAAtidWlsZGluZy0xMAEPAHdSRE1uM0tiVXl3
    WTdqNVsPrhZbD64Whe2oWQ==
    '/*!*/;
    ### UPDATE `webservice`.`building`
    ###WO
    ### @1=2006 /* LONGINT meta=0 nullable=0 is_null=0 */
    ### @2='building-10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
    ### @3=0 /* TINYINT meta=0 nullable=0 is_null=0 */
    ### @4='wRDMn3KbUywY7j5' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
    ### @5=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
    ### @6=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
    ### SATZ
    ### @1=2006 /* LONGINT meta=0 nullable=0 is_null=0 */
    ### @2='building-10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
    ### @3=1 /* TINYINT meta=0 nullable=0 is_null=0 */
    ### @4='wRDMn3KbUywY7j5' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
    ### @5=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
    ### @6=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
    # bei 3949
    #180602 13:29:54 Server-ID 1 end_log_pos 3980 CRC32 0x58226b8f Xid = 182
    BEGEHEN /*!*/;

Ein Beispiel für Binlog-Inhalte im STATEMENT-Modus ist wie folgt:

ZEITSTEMPEL FESTLEGEN=1527919329/*!*/;
    Aktualisieren Sie den Gebäudesatz Status = 1, wobei Id = 2000
    /*!*/;
    # bei 688
    #180602 14:02:09 Server-ID 1 end_log_pos 719 CRC32 0x4c550a7d Xid = 200
    BEGEHEN /*!*/;

Aus den Protokollinhalten von UPDATE-Operationen im ROW-Modus und im STATEMENT-Modus können wir ersehen, dass der ROW-Modus die Werte aller Felder einer zu ändernden Datenzeile vor der Aktualisierung vollständig aufzeichnet und die Werte aller Felder nach der Änderung, während der STATEMENT-Modus nur die SQL-Anweisung der UPDATE-Operation aufzeichnet. Wenn wir MySQL-Daten in Echtzeit mit ES synchronisieren möchten, können wir Binlog nur im ROW-Modus auswählen, den Dateninhalt des Binlog-Protokolls abrufen und analysieren, die ES-Dokument-API ausführen und die Daten mit dem ES-Cluster synchronisieren.

Anzeigen und Ändern des Binlog-Modus

# Binlog anzeigen modemysql> Variablen wie „%binlog_format%“ anzeigen;
 
# Binlog ändern modemysql> set global binlog_format='ROW';
 
# Prüfen Sie, ob Binlog aktiviert ist mysql> Variablen wie „log_bin“ anzeigen;
 
# Binlog aktivieren
Ändern Sie die Datei my.cnf log-bin = mysql-bin

Schritt 2 Installation

# Installieren Sie go
sudo apt-get installiere go
 
# Installieren Sie godep
Gehen Sie zu github.com/tools/godep
 
# Holen Sie sich das Plugin go-mysql-elasticsearch unter github.com/siddontang/go-mysql-elasticsearch
 
# Installieren Sie das Plugin go-mysql-elasticsearch cd go/src/github.com/siddontang/go-mysql-elasticsearch
machen

Schritt 3 Konfiguration

go/src/github.com/siddontang/go-mysql-elasticsearch/etc/river.toml

# MySQL-Adresse, Benutzer und Passwort
# Der Benutzer muss über Replikationsberechtigungen in MySQL verfügen.
my_addr = "127.0.0.1:3306" # Grundlegende MySQL-Einstellungen, die synchronisiert werden müssen my_user = "root"
mein_Passwort = "root"
 
# Elasticsearch-Adresse
es_addr = "127.0.0.1:9200" # Lokale Elasticsearch-Konfiguration # Pfad zum Speichern von Daten, wie master.info, und zum Dumpen von MySQL-Daten 
data_dir = "./var" # Datenspeicher-URL
# Die folgende Konfiguration wird als Standard gespeichert# Innere HTTP-Statusadresse
stat_addr = "127.0.0.1:12800"
 
# Pseudo-Server-ID wie ein Slave 
server_id = 1001
 
#mysql oder mariadb
Geschmack = "mysql"
#mysqldump Ausführungspfad
mysqldump = "mysqldump"
 
#MySQL-Datenquelle
[[Quelle]]
schema = "test" //Der entsprechende Datenbankname, wenn Elasticsearch mit MySQL synchronisiert wird. # Nur die folgenden Tabellen werden mit Elasticsearch synchronisiert.
# Um mehrere Tabellen in der Testdatenbank zu synchronisieren. Bei einigen Projekten, die den Mechanismus zur Tabellenpartitionierung verwenden, können wir zum Abgleichen Platzhalter verwenden. Beispielsweise kann t_[0-9]{4} den Tabellen t_0000 bis t_9999 entsprechen.
Tabellen = ["t", "t_[0-9]{4}", "tfield", "tfilter"]  
 
# Nachfolgend finden Sie die Zuordnung von Sonderregeln
# Für eine Tabelle müssen wir den Typ des ES-Index angeben, mit dem ihre Daten synchronisiert werden sollen. Wenn nicht angegeben, verwenden wir standardmäßig den Schemanamen als ES-Index und -Typ
[[Regel]]
schema = "test" //Datenbanknametable = "t" //Tabellennameindex = "test" //Entsprechender Indexnametype = "t" //Entsprechender Typname# Synchronisiere alle Tabellen, die dem Format t_[0-9]{4} entsprechen, mit dem ES mit Indextest und Typ t. Natürlich müssen diese Tabellen sicherstellen, dass das # Schema konsistent ist [[Regel]]
schema = "test"
Tabelle = "t_[0-9]{4}"
Index = "Test"
Typ = "t"
 
# Für die Tabelle tfilter synchronisieren wir nur die ID- und Name-Spalten, die anderen werden nicht synchronisiert filter = ["id", "name"]
# Die Spalten-ID der Tabelle tfield wird auf es_id abgebildet, und Tags werden auf es_tags abgebildet.
# Liste Dieses Feld teilt Ihnen explizit mit, dass die entsprechenden Spaltendaten in den ES-Array-Typ konvertiert werden müssen. Dies wird jetzt häufig für MySQLs varchar # und andere Typen verwendet. Wir können Daten wie „a, b, c“ speichern und dann hoffen, sie beim Synchronisieren mit ES in ein Listenformat wie [a, b, c] konvertieren zu können.
 
[Regel.Feld]
# Spalte „id“ dem ES-Feld „es_id“ zuordnen
id="es_id"
# Ordnen Sie die Spalte „tags“ dem ES-Feld „es_tags“ mit dem Array-Typ zu 
tags="es_tags,list"
# Spalte „Schlüsselwörter“ mit Array-Typ zu ES zuordnen
Schlüsselwörter=",Liste"

Schritt 4: Ausführen

cd go/src/github.com/siddontang/go-mysql-elasticsearch
bin/go-mysql-elasticsearch -config=./etc/river.toml

7. Elasticsearch-JDBC-Synchronisierung

Laden Sie das Tool herunter

Entpacken: unzip elasticsearch-jdbc-2.3.2.0-dist.zip

Festlegen von Umgebungsvariablen

[root@autofelix /]# vi /etc/profile
exportiere JDBC_IMPORTER_HOME=/elasticsearch-jdbc-2.3.2.0

Umgebungsvariablen wirksam machen

[root@autofelix /]# Quelle /etc/Profil

Konfigurationsreferenz

Schritt 1: Erstellen Sie einen neuen Ordner odbc_es im Stammverzeichnis wie folgt

[root@autofelix /]# ll /odbc_es/
drwxr-xr-x 2 root root 4096 16. Juni 03:11 Protokolle
-rwxrwxrwx 1 root root 542 16. Juni 04:03 mysql_import_es.sh

Schritt 2: Erstellen Sie ein neues Skript mysql_import_es.sh mit folgendem Inhalt

[root@autofelix odbc_es]# cat mysql_import_es.sh
'#!/bin/sh
bin=$JDBC_IMPORTER_HOME/bin
lib=$JDBC_IMPORTER_HOME/lib
echo '{
"Typ": "jdbc",
"jdbc": {
"elasticsearch.autodiscover":true,
"elasticsearch.cluster":"my-application", #Clustername, siehe: /usr/local/elasticsearch/config/elasticsearch.yml
"url":"jdbc:mysql://10.8.5.101:3306/test", #MySQL-Datenbankadresse "Benutzer":"root", #MySQL-Benutzername "Passwort":"123456", #MySQL-Passwort "sql":"select * from cc",
"elastische Suche" : {
  "Host": "10.8.5.101",
  "Hafen" : 9300
},
"index" : "meinindex", #neuer Index
"Typ" : "meinTyp" #neuer Typ
}
}'| java \
  -cp "${lib}/*" \
  -Dlog4j.configurationFile=${bin}/log4j2.xml \
  org.xbib.tools.Runner \
  org.xbib.tools.JDBCImporter

Schritt 3: Fügen Sie mysql_import_es.sh ausführbare Berechtigungen hinzu.

[root@autofelix odbc_es]# chmod a+x mysql_import_es.sh

Schritt 4: Führen Sie das Skript mysql_import_es.sh aus

[root@autofelix odbc_es]# ./mysql_import_es.sh

Dies ist das Ende dieses Artikels zum Synchronisieren von MySQL-Daten mit Elasticsearch. Weitere Informationen zum Synchronisieren von MySQL-Daten mit Elasticsearch finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Tutorial zum Synchronisieren von MySQL-Daten mit ElasticSearch mithilfe von Python
  • Lösung für das Datenasymmetrieproblem zwischen MySQL und Elasticsearch

<<:  Unterschiede zwischen Windows Server 2008R2, 2012, 2016 und 2019

>>:  Lösung für die Ineffektivität der flexiblen Layoutbreite in CSS3

Artikel empfehlen

Zusammenfassung der HOC-Nutzung von React-High-Order-Komponenten

Ein Satz zur Einführung von HOC Was ist eine Komp...

Best Practices-Handbuch zum Speichern von Daten in MySQL

Inhaltsverzeichnis Vorwort Verwenden Sie keine Ze...

Beispiele für die Verwendung des Li-Tags in HTML

Ich möchte den Titel links und das Datum rechts a...

Optimierte Aufzeichnung der Verwendung von IN-Datenvolumen in Mysql

Die MySQL-Versionsnummer ist 5.7.28. Tabelle A ha...

Mit CSS3 wird ein Kegelschnitt-Gradienteneffekt erzielt

Grammatik: Hintergrundbild: Kegelschnitt-Farbverl...

Detaillierte Erklärung der Zählung ohne Filterbedingungen in MySQL

zählen(*) erreichen 1. MyISAM: Speichert die Gesa...

Implementierung der CSS-Transformation des Seitenumblätter-Animationsdatensatzes

Szenario mit dem Problem des Seitenumblätterns B ...

js und jquery, um einen Tab-Statusleisten-Umschalteffekt zu erzielen

Heute werden wir einen einfachen Fall durchgehen ...

mysql5.6.zip-Format komprimierte Version Installations-Grafik-Tutorial

Vorwort: MySQL ist ein relationales Datenbankverw...

JavaScript zum Erzielen eines Texterweiterungs- und -reduzierungseffekts

Die Implementierung des Erweiterns und Reduzieren...