web-dev-qa-db-ja.com

MSSQLをElasticsearchに同期する方法は?

私がこれをグーグルするたびに、廃止予定の「川」アプローチを見つけます。これが何らかの形で役立つ情報である場合、私はDapperを使用しています。

それで、最近このための解決策は何ですか?

12
Tadej

あなたの質問は広義にあります-したがって、これはいくつかのオプションへのポインタです。

Elastic search は、データベースのクエリとデータの分析に使用されます。

記事では Deprecating Rivers

クライアントライブラリ

1年以上にわたり、ほとんどのプログラミング言語でElasticsearchの公式クライアントライブラリを提供してきました。つまり、アプリケーションにフックして、既存のコードベースを介してデータを取得することは、比較的簡単なはずです。この手法では、Elasticsearchに到達する前にデータを簡単に変更することもできます。一般的な例は、すでにORMを使用してドメインモデルをデータベースにマッピングしているアプリケーションであり、ドメインモデルのフックとインデックス作成をElasticsearchに戻すのは、実装が簡単な傾向があります。

エラスティック検索を使用する方法については、次のドキュメントがあります。

Elasticsearch.Net

ドキュメントは次のことを扱います:

パッケージ をインストールします。

PM> Install-Package Elasticsearch.Net

接続

var node = new Uri("http://mynode.example.com:8082/apiKey");  
var config = new ConnectionConfiguration(node);  
var client = new ElasticsearchClient(config);`  

セキュリティ

プーリングとフェイルオーバー

構築リクエスト

これは、開発する必要があるものです。

応答処理

エラー処理

プラグイン

Logstash Riversの代わりに使用することもでき、そこからさまざまなプラグインが開発されています。

また、Logstashまたは同様のツールを使用して、Elasticsearchにデータを送信できます。たとえば、Elasticsearchに付属するいくつかの川は、Logstash 1.5のLogstashプラグイン(CouchDBプラグインなど)として実装されています。

追加読み

これは別の言語とフレームワークですが、ブログ レガシーアプリケーションの高度な検索David Pilato によるものであり、情報を参照すると役立つ場合があります。彼はアプリケーション層でそれを行うことを推奨します。

コメントから問題に対処する。

データの変更を追跡できます

SQL Serverは、データの変更を追跡する組み込みシステムを提供します。これは、変更を確認する手動の方法を実装する必要なく、データへの変更を自動的に追跡する効果的な手段です。

これを実現する方法は2つあります。

Change Data Capture の使用:

データの変更はタイムスタンプで追跡されます。データ変更の履歴を追跡できます。

変更データキャプチャは、DML変更が行われたという事実と変更された実際のデータの両方をキャプチャすることにより、ユーザーテーブルの変更履歴情報を提供します。変更は、トランザクションログを読み取る非同期プロセスを使用してキャプチャされ、システムへの影響はほとんどありません。

Change Tracking の使用:

これはオーバーヘッドが少なくなりますが、履歴の変更を追跡しません。最新の変更は保持されますが、それ以上戻ることはありません。

変更の追跡は、テーブルの行が変更されたという事実をキャプチャしますが、変更されたデータはキャプチャしません。これにより、アプリケーションは変更された行を判別でき、最新の行データはユーザー表から直接取得されます。したがって、変更の追跡は、変更データのキャプチャと比較して、回答できる履歴の質問でより制限されます。 .../...

12
Yvette Colomb

Logstashを使用してジョブを実行できます。 logstash JDBCプラグインを使用して、logstashパイプラインをセットアップするだけです。このリンクをたどる:- MySQLデータをElasticSearchに移行

また、GitHubでこのリポジトリをチェックアウトしてください ElasticSearchCRUD

2
Sharthak Ghosh

私はこの投稿に何度も出くわし、更新された回答が必要だと感じています。

MssqlインスタンスからElasticsearchにデータを送信するには、ELKスタックに固有のLogstashを使用します。 jdbc入力プラグインを使用して、個々のパイプラインと構成を定義します。

以下は設定ファイルの例です。これにより、2分ごとにストアドプロシージャが実行され、データが正しいインデックスに挿入されます。データの新しいレコードのみを同期する方法を提供することを忘れないでください。そうしないと、データが大きくなるときにスケーリングの問題が発生します。

input {  
    jdbc {
        jdbc_connection_string => "jdbc:sqlserver://${sql_server};database=api;user=<username>;password=<password>;applicationname=logstash"
        # The user we want to execute our statement as
        jdbc_user => nil
        id => "index_name"
        jdbc_driver_library => "/var/tmp/mssql-jdbc-6.2.2.jre8.jar"
        jdbc_driver_class => "com.Microsoft.sqlserver.jdbc.SQLServerDriver"
        schedule => "*/2 * * * *"
        statement => "exec stored_procedure"
        lowercase_column_names => false

    }

}


output {
    elasticsearch {
        "id" => "index_name"
        "hosts" => "elasticsearch:9200"
        "index" => "index_name"
        "document_id" => "%{primary_key}" 

    }

}

`

1
Jeff Beagley

質問はMSSQL-> ElasticSearchからの同期を求めていますが、異機種システム間で同期するための基本的な考え方はまったく同じだと思います。あなたがする必要があるかもしれません

  • 同期するデータのバッチを定義および作成する
  • どこから開始するか、基本的にはマーカーを決定するために同期された最後のバッチを追跡します
  • データを変換する
  • 最後にバッチを輸送する

この記事 異機種システム間での継続的なデータ同期-YoursAndMyIdeas は、これを実現するためのすべての詳細を詳しく説明しています。

1
Sunil Singhal

それで、これの実装に関する私の2¢だけです。これまでは、イベントログとして機能するバッファテーブルに書き込むトリガーを設定することでこれを実現しました。次に、タイマーにサーバーレス機能(AWS Lambda)があり、そのイベントログをクリアして、必要な変更をESにプッシュしました。このようにして、私はトリガーでクレイジーなことをしたり、実際に元のコードを変更したりする必要はありませんでした。

0
John Jones