MySQLからElasticsearchにデータを同期する方法の詳細な説明

MySQLからElasticsearchにデータを同期する方法の詳細な説明

1. 同期の原理

MySQL ベースの Binlog ログサブスクリプション: Binlog ログは、MySQL によってデータのリアルタイムの変更を記録するために使用されます。

ESへのMySQLデータ同期には、完全同期と増分同期の2種類があります。

完全同期とは、ES インデックスが初めて確立された後、MySQL 内のすべてのデータが一度に ES にインポートされることを意味します。

増分同期とは、MySQL に新しいデータが生成されることを意味します。これらの新しいデータには、MySQL に新しく挿入されたデータ、更新された古いデータ、削除されたデータの 3 つの状況が含まれます。これらのデータの変更と追加は、ES に同期する必要があります。

2. ログスタッシュ入力JDBC

公式の logstash プラグインは logstash に統合されています。logstash をダウンロードし、構成ファイルを通じて mysql と elasticsearch のデータを同期するだけです。

アドバンテージ

  • MySQLデータの完全同期と増分同期を実現し、スケジュール同期も実現できます。
  • バージョンはすぐに更新され、比較的安定しています
  • ES固有のプラグインlogstashの一部として、使いやすい

欠点

  • 同期削除はできません。MySQLデータが削除された後も、データはElasticsearchに残ります。
  • 最短同期時間差は1分で、1分ごとにデータを同期します。リアルタイム同期はできません。

3. go-mysql-elasticsearch

go-mysql-elasticsearchは国内の作者によって開発されたプラグインです

アドバンテージ

  • MySQLデータの完全および増分データ同期を実現できます

欠点

  • すべてのデータをElasticsearchと同期できません
  • まだ発展途上であり、比較的不安定な段階

4. エラスティックサーチJDBC

elasticsearch-jdbc の最新バージョンは 2.3.4 ですが、サポートされている ElasticSearch バージョンは 2.3.4 ですが、まだ実装されていません。

アドバンテージ

  • MySQLデータの完全および増分データ同期を実現できます

欠点

  • 最新バージョンは2.3.4で、サポートされているElasticSearchバージョンは2.3.4です。
  • 同期削除はできません。MySQLデータが削除された後も、データはElasticsearchに残ります。

5. Logstash-input-jdbc 同期

最初のステップはインストールです。

logstash5.x 以降では、logstash-input-jdbc プラグインが統合されています。 logstashをインストールした後、コマンドでlogstash-input-jdbcプラグインをインストールします。

cd /logstash-6.4.2/bin
./logstash-plugin をインストールしてlogstash-input-jdbc

2 番目のステップの構成:

logstash-6.4.2/config フォルダに新しい jdbc.conf を作成し、次のように設定します。

logstash-6.4.2/configディレクトリに新しいjdbc.sqlファイルを作成します。

t_employee から * を選択

ステップ3: 実行

ログスタッシュ-6.4.2
# 設定ファイルの構文が正しいかどうかを確認します bin/logstash -f config/jdbc.conf --config.test_and_exit
# bin/logstash を起動 -f config/jdbc.conf --config.reload.automatic

--config.reload.automatic: 設定ファイルの内容を自動的にリロードします

Kibanaでインデックスを作成した後、同期されたデータを表示します。

タコを入れる
タコ/_searchを取得する

6. go-mysql-elasticsearch 同期

ステップ1: mysql binlog ログ

go-mysql-elasticsearch は、mysql の binlog ログを通じて elasticsearch と同期してデータを追加、削除、変更します。

MySQL の binlog ログは、主にデータベースのマスター スレーブ レプリケーションとデータ復旧に使用されます。バイナリログには、データの追加、削除、変更、クエリなどの操作が記録されます。マスター スレーブ レプリケーション プロセス中に、マスター データベースはバイナリログ ログをスレーブ データベースに同期し、スレーブ データベースはバイナリログ ログ内のイベントを再生して、マスター スレーブ同期を実現します。

MySQL binlog には 3 つのモードがあります。

ROW: 変更されたデータの各行を記録しますが、ログのボリュームが大きすぎます。STATEMENT: データを変更する各 SQL ステートメントを記録します。これにより、ログのボリュームが削減されますが、関数またはトリガーを使用すると、SQL ステートメントでマスターとスレーブの不整合が発生しやすくなります。MIXED: ROW と STATEMENT の利点を組み合わせ、データ操作を実行する特定の SQL ステートメントに応じて、ROW または STATEMENT を使用してログを記録することを選択します。

MySQL binlog を介して ES クラスターにデータを同期するには、ROW モードのみを使用できます。これは、ROW モードのみが MySQL 内のデータの変更された内容を知ることができるためです。

UPDATE 操作を例にとると、ROW モードでの binlog ログの内容は次のようになります。

タイムスタンプを 1527917394/*!*/ に設定します。
    始める
    //*!*/;
    # 3751 で
    #180602 13:29:54 サーバー ID 1 end_log_pos 3819 CRC32 0x8dabdf01 Table_map: `webservice`.`building` が番号 74 にマップされました
    # 3819 で
    #180602 13:29:54 サーバー ID 1 end_log_pos 3949 CRC32 0x59a8ed85 Update_rows: テーブル ID 74 フラグ: STMT_END_F
    
    バイナリログ'
    翻訳:
    wACAAQAAAAHfq40=
    UisSWx8BAAAAggAAAG0PAAAAAEoAAAAAAAEAAgAG///A1gcAAAAAAAAALYnVpbGRpbmctMTAADwB3
    ウクRNbjNLYlV5d1k3ajVbD64WWw+uFsDWBwAAAAAAAAAtidWlsZGluZy0xMAEPAHdSRE1uM0tiVXl3
    WTdqNVsPrhZbD64Whe2oWQ==
    '/*!*/;
    ### `webservice`.`building` を更新します
    ###どこ
    ### @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 メタ=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 */
    ### セット
    ### @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 メタ=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 */
    # 3949 で
    #180602 13:29:54 サーバー ID 1 end_log_pos 3980 CRC32 0x58226b8f Xid = 182
    専念 /*!*/;

STATEMENT モードでの binlog コンテンツの例は次のとおりです。

タイムスタンプを 1527919329/*!*/ に設定します。
    ビルディングセットを更新 Status=1、Id=2000
    //*!*/;
    # 688 で
    #180602 14:02:09 サーバー ID 1 end_log_pos 719 CRC32 0x4c550a7d Xid = 200
    専念 /*!*/;

ROW モードと STATEMENT モードでの UPDATE 操作のログの内容から、ROW モードでは更新前の変更対象データの行のすべてのフィールドの値と変更後のすべてのフィールドの値が完全に記録されるのに対し、STATEMENT モードでは UPDATE 操作の SQL 文のみが記録されることがわかります。 MySQL データを ES にリアルタイムで同期したい場合は、ROW モードで binlog を選択し、binlog ログのデータ内容を取得して解析し、ES ドキュメント API を実行して、データを ES クラスターに同期するしかありません。

binlog モードの表示と変更

# binlog を表示 modemysql> show variables like "%binlog_format%";
 
# binlog mode を変更します。mysql> set global binlog_format='ROW';
 
# binlog が有効になっているかどうかを確認します。mysql> show variables like 'log_bin';
 
# バイナリログを有効にする
my.cnfファイルlog-bin = mysql-binを変更します。

ステップ2 インストール

# goをインストールする
sudo apt-get をインストールして実行します
 
# godepをインストールする
github.com/tools/godep にアクセスしてください
 
# go-mysql-elasticsearch プラグインを取得する go get github.com/siddontang/go-mysql-elasticsearch
 
# go-mysql-elasticsearch プラグインをインストールします cd go/src/github.com/siddontang/go-mysql-elasticsearch
作る

ステップ3 構成

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

# MySQL アドレス、ユーザー名、パスワード
# ユーザーは MySQL でレプリケーション権限を持っている必要があります。
my_addr = "127.0.0.1:3306" # 同期する必要がある基本的なmysql設定 my_user = "root"
my_pass = "ルート"
 
# Elasticsearch アドレス
es_addr = "127.0.0.1:9200" # ローカル elasticsearch 設定 # master.info などのデータを保存し、MySQL データをダンプするパス 
data_dir = "./var" # データ保存URL
# 以下の設定はデフォルトとして保存されます# 内部 HTTP ステータス アドレス
stat_addr = "127.0.0.1:12800"
 
# スレーブのような疑似サーバー ID 
サーバーID = 1001
 
#mysql または mariadb
フレーバー = "mysql"
#mysqldump 実行パス
mysqldump = "mysqldump"
 
#MySQL データソース
[[ソース]]
schema = "test" //elasticsearch が mysql と同期される場合の対応するデータベース名 # 以下のテーブルのみが Elasticsearch に同期されます。
# テスト データベース内の複数のテーブルを同期します。テーブル パーティション メカニズムを使用する一部のプロジェクトでは、ワイルドカードを使用して一致させることができます。たとえば、t_[0-9]{4} はテーブル t_0000 から t_9999 まで一致させることができます。
テーブル = ["t", "t_[0-9]{4}", "tfield", "tfilter"]  
 
# 以下は特別なルールマッピングです
# テーブルの場合、そのデータを同期する ES インデックスのタイプを指定する必要があります。指定されていない場合は、デフォルトでスキーマ#名をESインデックスとタイプとして使用します。
[[ルール]]
schema = "test" //データベース名table = "t" //テーブル名index = "test" //対応するインデックス名type = "t" //対応するタイプ名# t_[0-9]{4}の形式を満たすすべてのテーブルを、インデックスtestとタイプtのESに同期します。もちろん、これらのテーブルでは、# スキーマが一貫していることを確認する必要があります [[rule]]
スキーマ = "テスト"
テーブル = "t_[0-9]{4}"
インデックス = "テスト"
タイプ = "t"
 
# テーブル tfilter では、id 列と name 列のみを同期し、他の列は同期しません。filter = ["id", "name"]
# テーブル tfield の列 id は es_id にマップされ、タグは es_tags にマップされます
# list このフィールドは、対応する列データを ES 配列型に変換する必要があることを明示的に示します。これは現在、MySQL の varchar # やその他の型でよく使用されています。「a, b, c」のようなデータを保存し、ES に同期するときに [a, b, c] のようなリスト形式に変換したい場合があります。
 
[ルールフィールド]
# 列 `id` を ES フィールド `es_id` にマップします
id="es_id"
# 列 `tags` を配列型の ES フィールド `es_tags` にマップします 
tags="es_tags,リスト"
# 列 `keywords` を配列型で ES にマップする
キーワード=",リスト"

ステップ4: 実行

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

7. Elasticsearch-jdbc 同期

ツールをダウンロードする

解凍: elasticsearch-jdbc-2.3.2.0-dist.zip を解凍します

環境変数の設定

[root@autofelix /]# vi /etc/profile
エクスポート JDBC_IMPORTER_HOME=/elasticsearch-jdbc-2.3.2.0

環境変数を有効にする

[root@autofelix /]# ソース /etc/profile

構成リファレンス

ステップ1: 次のようにルートディレクトリに新しいフォルダodbc_esを作成します。

[root@autofelix /]# ll /odbc_es/
drwxr-xr-x 2 ルート ルート 4096 6月16日 03:11 ログ
-rwxrwxrwx 1 ルート ルート 542 6月16日 04:03 mysql_import_es.sh

ステップ2: 次の内容で新しいスクリプトmysql_import_es.shを作成します。

[root@autofelix odbc_es]# cat mysql_import_es.sh
'#!/bin/sh
bin=$JDBC_IMPORTER_HOME/bin
lib=$JDBC_IMPORTER_HOME/lib
エコー '{
「タイプ」:「jdbc」、
"jdbc": {
"elasticsearch.autodiscover":true、
"elasticsearch.cluster":"my-application", #クラスター名、参照: /usr/local/elasticsearch/config/elasticsearch.yml
"url":"jdbc:mysql://10.8.5.101:3306/test", #mysql データベース アドレス "user":"root", #mysql ユーザー名 "password":"123456", #mysql パスワード "sql":"select * from cc",
「エラスティックサーチ」: {
  「ホスト」:「10.8.5.101」、
  「ポート」: 9300
},
"index" : "myindex", #新しいインデックス
"type" : "mytype" #新しいタイプ
}
}'| java \
  -cp "${lib}/*" \
  -Dlog4j.configurationFile=${bin}/log4j2.xml \
  org.xbib.tools.ランナー \
  org.xbib.tools.JDBCインポーター

ステップ 3: mysql_import_es.sh に実行権限を追加します。

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

ステップ4: スクリプトmysql_import_es.shを実行する

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

これで、Mysql データを Elasticsearch に同期する方法に関するこの記事は終了です。Mysql データを Elasticsearch に同期する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Python を使用して MySQL データを ElasticSearch に同期する方法のチュートリアル
  • MySQLとElasticsearch間のデータ非対称性問題の解決策

<<:  Vue のプラグインとコンポーネントの違いと使い方のまとめ

>>:  ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

推薦する

jQuery の CSS スタイル属性 css() と width() の完全ガイド

目次1. css() の基本的な使用法: 1.1 CSSプロパティを取得する1.2 CSSプロパティ...

CSS3はNESゲームコンソールのサンプルコードを実装します

成果を達成する実装コードhtml <input type="radio" ...

JavaScript でオブジェクトをエレガントに扱う 6 つの方法

目次序文1. オブジェクト.freeze() 2. オブジェクト.seal() 3. オブジェクト....

Linuxはデュアルネットワークカードボンドとドライバーインターフェースを使用する

債券とは何かNIC ボンドは、実稼働シナリオでよく使用されるテクノロジーです。複数の NIC を 1...

Vueベースのカスタムコンポーネントを実装してアイコンを導入する

序文プロジェクト開発では、アイコンを使用する方法はたくさんあります。iconfont で適切なアイコ...

vue3 でブロック崩しゲームを開発する方法をステップバイステップで教えます

序文vue3 を使った例をいくつか書いてみましたが、Vue3 のコンポジション API はよく設計さ...

Linux インストール Redis 実装プロセスとエラー解決

今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...

Vue でキープアライブを使用した後にキャッシュをクリアする方法

キープアライブとは何ですか?通常の開発では、コンポーネントによっては複数回初期化する必要のないものも...

LambdaProbe を使用して Tomcat を監視する方法

導入: Lambda Probe (旧称 Tomcat Probe) は、Apache Tomcat...

Win10 の組み込み Linux システムを使用して Spring Boot プロジェクトを開始する方法

1. Windows10の組み込みLinuxサブシステムをインストールする1.1. Linuxサブシ...

Linux で gdb を使用してコア ファイルをデバッグする方法

1.コアファイルプログラム実行中にセグメンテーション エラー (コア ダンプ) が発生すると、プログ...

dockerでrabbitmqをインストールすると管理ページに入れなくなる問題

1. 環境整備Tencent Cloud Server CENTOS 7 バージョンDockerコン...

DockerプライベートライブラリHarborのアーキテクチャとコンポーネントの説明

この記事では、Harbor アーキテクチャの構成と、実行時に各コンポーネントを使用する方法について説...

Spring Boot Docker パッケージング ツールの概要

目次スプリングブートDocker spring-boot-maven-プラグインSpotify Ma...

Docker で MySQL マスターとスレーブをデプロイする方法

画像をダウンロードMySQLイメージの選択 docker 検索 mysql MySQL 5.7 イメ...