web-dev-qa-db-ja.com

PostgreSqlデータをElasticSearchと同期する

最終的には、PostgreSqlのデータ用のスケーラブルな検索ソリューションが必要です。私の発見は、Logstashを使用してPostgresからElasticSearchに書き込みイベントを送信することを示していますが、使用可能な解決策は見つかりませんでした。私が見つけた解決策は、jdbc-inputを使用して、ある間隔でPostgresからallデータをクエリすることを含み、削除イベントはキャプチャされません。

これは一般的なユースケースだと思うので、皆さんに私とあなたの経験を共有したり、先に進むためのヒントを提供したりしてください。

23
Khanetor

DELETEの通知も受け取り、Elasticsearchでそれぞれのレコードを削除する必要がある場合、Logstash jdbc入力が役に立たないことは事実です。あなたはbinlogを回避するソリューションを使用する必要があります ここで推奨

ただし、Logstash jdbc入力を引き続き使用する場合は、PostgreSQLでレコードをソフト削除するだけです。つまり、レコードをdeletedとしてマークするために新しいBOOLEAN列を作成します。その場合、同じフラグがElasticsearchに存在し、termフィールドで単純なdeletedクエリを使用して検索から除外できます。

クリーンアップを実行する必要があるときはいつでも、PostgreSQLとElasticsearchの両方でdeletedのフラグが付いたすべてのレコードを削除できます。

14
Val

Debezium をご覧ください。変更データキャプチャ(CDC)プラットフォームであり、データをスチームできます

簡単な githubリポジトリ を作成しました。

enter image description here

3
Yegor Zaremba

PGSync もご覧ください。

Debeziumに似ていますが、起動して実行するのがはるかに簡単です。

PGSyncは、データをPostgresからElasticsearchに移動するための変更データキャプチャツールです。 Postgresを真の情報源として維持し、構造化された非正規化ドキュメントをElasticsearchで公開できます。

Elasticsearchでデータの構造を記述するJSONスキーマを定義するだけです。

スキーマの例を次に示します(オブジェクトをネストすることもできます)。

例えば

{
    "nodes": [
        {
            "table": "book",
            "columns": [
                "isbn",
                "title",
                "description"
            ]
        }
    ]
}

PGsyncは、オンザフライでドキュメントのクエリを生成します。 Logstashのようなクエリを記述する必要はありません。また、削除操作をサポートおよび追跡します。

ポーリングモデルとイベント駆動モデルの両方を操作して、日付に加えられた変更と、ある時点で発生した変更の通知を取得します。最初の同期では、前回デーモンが実行されてからの変更についてデータベースをポーリングし、その後、データベースへの変更について(トリガーに基づいてpg-notifyで処理される)イベント通知を行います。

開発のオーバーヘッドはほとんどありません。

  • 上記のようにスキーマを作成します
  • postgresデータベースとElasticsearchクラスターでpgsyncをポイントする
  • デーモンを起動します。

ネストされたオブジェクトとして複数の関係を含むドキュメントを簡単に作成できます。 PGSyncは変更を追跡します。

詳細は github リポジトリをご覧ください。

PyPI からパッケージをpipインストールできます

2
taina