ElasticSearchにドッカーを経由してLogstashのMySQLデータベースのデータの同期を展開する方法

開発プロセスの間に、私たちはしばしばように、製品だけでなく、キーワード検索のためのウェブサイトのコンテンツのコンテンツを見つけるために、このような電気の供給業者のウェブサイトとして、あいまい検索を必要とし、トラフィックデータが発生しました。明らかにこれらの高度な検索機能では、 データベース などは適切ではない、我々は通常、このツールを使用して、我々は簡単にキーワード検索機能を実現するために、上記のシナリオに対処することができ、データの検索および分析を完了するためにElasticSearchを採用します。

しかし、検索エンジンなどの増加ElasticSearchによる、その後の質問は主に二つの方法でElasticSearchにデータ・サービスを同期する方法を、次のとおりです。

  1. ビジネス二重書き込み(侵襲)
  2. データベース同期

ビジネスニーズはビジネスコードを書くことは、二重に変更したようなビジネスシステムへの侵入や小文字を区別しない強い一貫性の要件は、この方法を取ることができない限り、それは一般的に、このように推奨されていません。

  • 強い一貫性:同期書き込みHTTPリクエストElasticSearch
  • 結果整合性:
    • 書き込み動作をとることができるログ、ライトフィルタElasticSearch(推奨ELK標準モード)の後端ログ・データ・ストリーム
    • 別の解決策は、同期、非同期でMQ、MQバックエンド書かElasticSearch消費を書き込んで

この論文は、非コードデータベース同期侵襲的な方法を説明し、主にLogStashデータベーススキーマをスキャンすることによってタイミング同期データをインクリメントするために使用されます。

データベーススクリプト

データベーステーブルの構造、フィールドを更新する必要があり、増分更新識別フィールドデータの一部が更新される(例えばLastUpdateTime)、などの時間タイプフィールドの必要性。

CREATE TABLE user  (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  `createtime` datetime(0) NOT NULL,
  `lastupdatetime` datetime(0) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) 

INSERT INTO `user` VALUES(1,"jack",18,Now(),Now())
INSERT INTO `user` VALUES(2,"William",18,Now(),Now())

SELECT * from `user`

クエリ結果:

ID 名前 年齢 CREATETIME lastupdatetime
1 ジャック 18 2019年10月24日10時31分14秒 2019年10月24日10時31分14秒
2 ウィリアム 18 2019年10月24日午前10時31分49秒 2019年10月24日午前10時31分49秒

LogStash構成情報

logstashドッキングウィンドウのインストールスクリプト:
MKDIRは/ opt / logstashsync /
ます。mkdirは/ opt / logstashsync /パイプライン
のvi /opt/logstashsync/pipeline/logstash.conf

input {
  jdbc {
    jdbc_driver_library => "/app/mysql-connector-java-8.0.18.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.10.102:3306/synctest"
    jdbc_user => "root"
    jdbc_password => "123456"
    tracking_column => "unix_ts_in_secs"
    use_column_value => true
    schedule => "*/5 * * * * *" 
    statement => "SELECT *, UNIX_TIMESTAMP(lastupdatetime) AS unix_ts_in_secs FROM user WHERE (UNIX_TIMESTAMP(lastupdatetime) > :sql_last_value AND lastupdatetime < NOW()) ORDER BY lastupdatetime ASC"
  }
}

filter {
  mutate {
    copy => { "id" => "[@metadata][_id]"} 
    remove_field => ["id", "@version", "unix_ts_in_secs"]
  }
}
output {
   elasticsearch {
                 hosts => "192.168.10.102:9200"
                 index => "syncuser"
                 timeout => 300
                 document_id => "%{[@metadata][_id]}" 
                 }
}

上記構成手順:

  • jdbc_driver_library:logstashミラーリングは、公式ウェブサイトで、コンテナ船でマッピングを開始するには、ダウンロード後に必要なJDBCコネクタを、含まれていません。こちらからダウンロードして利用できます
     
  • tracking_column:MySQLのlastupdatetimeとデフォルトから読み取る最後Logstashデータの最後のトラックの値は、ファイル.logstash_jdbc_last_runにディスクに永続化。次の同期サイクル、同期開始値、SQL文に保存された増分同期の.logstash_jdbc_last_runを達成するためにはかもしれたときにこの値が使用されます。アクセスsql_last_value。
     
  • スケジュール:一度、cronの構文は、当社の現在の設定で指定されたどのくらいの周期の同期設定は5秒サイクルです。
     
  • 声明:SQL文の同期実行。あなたが書いた理由の条件は、あなたが記事https://www.elastic.co/blog/how-to-keep-elasticsearch-synchronized-with-a-relational-database-using-logstashを参照することができる場所であることは注目に値します説明が与えられました。
     
  • 重要:上記の構成[@metadata] [_ ID]、レコードの変更がデータベースに存在するときように、同期中に、あなたは、中のデータのID文書の_idのElasticSearchとしてデータベースを使用する必要があり、ElasticSearchドキュメントう同期の変更を、対応する、それ以外の場合は、データの同期エラーが発生、データに新しいElasticSearchを挿入します。

以上の構成により、我々は、ドッキングウィンドウコンテナの稼働をLogstath:

docker run -d \
-v /opt/logstashsync/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /opt/logstashsync/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /opt/logstashsync/mysql-connector-java-8.0.18.jar:/app/mysql-connector-java-8.0.18.jar \
--name=logstash \
logstash:6.7.1
注意:上記のスクリプトを見ることができ、我々は、MySQL-connector-をするローカルの/ opt / logstashsync /ディレクトリに javaの jdbc_driver_library logstash.confに対応して配置された-8.0.18.jar / appディレクトリコンテナにマッピングされ、値

Logstashコンテナの実行ログを見ることによって、我々は簡単に我々の期待に合わせて毎回データベース同期5Sをされていることを示す、ログの以下の内容を見ることができます:

[2019-10-25T06:27:59,056][INFO ][logstash.inputs.jdbc     ] (0.039651s) SELECT *, UNIX_TIMESTAMP(lastupdatetime) AS unix_ts_in_secs FROM user WHERE (UNIX_TIMESTAMP(lastupdatetime) > 0 AND lastupdatetime < NOW()) ORDER BY lastupdatetime ASC
[2019-10-25T06:28:05,154][INFO ][logstash.inputs.jdbc     ] (0.004232s) SELECT *, UNIX_TIMESTAMP(lastupdatetime) AS unix_ts_in_secs FROM user WHERE (UNIX_TIMESTAMP(lastupdatetime) > 1571913109 AND lastupdatetime < NOW()) ORDER BY lastupdatetime ASC
[2019-10-25T06:28:10,230][INFO ][logstash.inputs.jdbc     ] (0.002832s) SELECT *, UNIX_TIMESTAMP(lastupdatetime) AS unix_ts_in_secs FROM user WHERE (UNIX_TIMESTAMP(lastupdatetime) > 1571913109 AND lastupdatetime < NOW()) ORDER BY lastupdatetime ASC

Kibanaによって同期クエリ結果

あなたが同期されたデータを見ることができることを、Kibanaにsyncuserインデックスを作成します:
www.wityx.com

更新データベースのデータをしようと、ウィリアムという名前のユーザの年齢は、(lastupdatetimeフィールドを更新するために同じ時間を覚えている)100に修正します:

UPDATE `user` SET age=100, lastupdatetime=NOW() WHERE `name`='William';
SELECT * from `user`

ビューデータKibanaもう一度、あなたは、データが正常に同期されたことを確認できます。
www.wityx.com

エピローグ

以上の手順により、我々はElasticSearchタイミング同期手順に簡単な単一テーブルのデータを完了しているが、実際の使用では、必要性は次の問題に注意を払います:

  1. SQL文は、各同期の最大数を考慮する必要があります。ほとんどの場合、データベースは、大量のデータを有していてもよく、データの最後の同期が大きすぎると制御されない、Logstashにつながる可能性がちょうど開始した場合、例外が発生し、あなたは最大数は毎回SQL文を高め得ることができる方法を取ります制限。
  2. 増分更新識別フィールド、それによってあるので>数決意モード、プライマリキーは、このように、データベース内の索引を作成lastupdatetime低減、タイプint型主キーフィールドを使用することができるならば、IDがインクリメントされます。主キーでない場合でも、あなたは声明の中で与えられた設定手順上記のリンクのための具体的な理由を参照してください慎重に、注意して使用する必要があります。
  3. 増分同期メカニズムに起因するため、すべてのデータベース操作はソフト削除を削除するようにして行われるべきで、増加is_deleteフィールド、またはこれは、データのハード部分は状態ElasticSearchに、当然の、クエリElasticSearchの時に同期させることができない原因になりますならば、それはすべきこの条件を増やすと、削除されたデータを除外します。

おすすめ

転載: www.cnblogs.com/xyy2019/p/11738884.html