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

Wertschätzung des dezenten und eleganten Webdesigns in Schwarz, Weiß und Grau

Unter den klassischen Farbkombinationen kann wohl...

Was tun, wenn Sie das ursprüngliche Passwort für MySQL auf dem MAC vergessen?

Die Lösung zum Vergessen des ursprünglichen MySQL...

So zeigen Sie Linux-SSH-Dienstinformationen und den Ausführungsstatus an

Es gibt viele Artikel zur SSH-Serverkonfiguration...

Besprechen Sie die Anwendung von Mixin in Vue

Mixins bieten eine sehr flexible Möglichkeit, wie...

Verwenden von Textschatten- und Elementschatteneffekten in CSS

Einführung in Textschatten Verwenden Sie in CSS d...

Kurze Analyse der geplanten MySQL-Sicherungsaufgaben

Einführung Um Datenverlust in einer Produktionsum...

Detailanalyse der MySQL-Berechtigungskontrolle

Inhaltsverzeichnis 1. Globale Ebene 2. Datenbanke...

So verwenden Sie Docker Swarm zum Erstellen von WordPress

Ursache Ich habe WordPress einst auf Vultr einger...

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort vergessen?

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort ve...

So erstellen Sie ein CentOS-Basisimage

Vorwort Derzeit ist das von meiner Firma verwende...