web-dev-qa-db-ja.com

いくつかのテーブルを1つのpostgresデータベースから別のデータベースに複製する

次のような状況です。3台のマシンでpostgresqlデータベースを実行しています。 1つのマシンはクライアントアカウント情報を保持し(このマシンをCと呼びます)、他の2つのマシンはクライアントロギング情報を保持します(これらのL1とL2を呼び出します)。分割の理由は、複数のマシンにまたがるロードを分離するためです(したがって、一部のクライアントはログ情報をL1に送信し、一部はL2に送信します...そしておそらくL3、L4などの時間を送信します)。

ロギング情報を取得するときは、原則として、LnのロギングテーブルとCのクライアントアカウントテーブルの間で結合できるようにしたいのですが、実際には、このような結合はできません(可能な場合でも、 Cの読み込みを回避するため)。

私の考えは、Cのテーブルを各L1、L2、...に複製して、結合を実行できるようにすることです。 Cのテーブルに関する限り、Cはマスターで、L1、L2、...はスレーブです。しかし、L1、L2などの他のテーブルでは、これらのマシンはマスターです。それは正確にはマスターマスターレプリケーションではなく、正確にはマスタースレーブではありません。

Postgres(私は9.1を実行しています)レプリケーションでこれを実行するように説得できますか、そうでない場合は、そのジョブを実行する他のパッケージがないかどうか。最後の手段として、定期的にテーブルを同期するコードを書くことができます(多少の遅延は許容できます)が、それはできません。

前もって感謝します。

9
Mike Richardson

PostgreSQL 9.3では、postgres_fdw他のマシンの外部テーブルを透過的にクエリします。

古いバージョンでは、Andrewが述べたように dblink をオプションにすることができます。

別のオプションは、LondisteやSlony-Iなどのツールを使用して、必要なテーブルを複製することです。これにはLondisteを使用することをお勧めします。これにより、はるかに簡単になります。テーブルにトリガーを作成して挿入/更新/削除を検出し、独自のクライアント/サーバーとキューイングシステムを使用してこれらを他のデータベースに複製し、対応する挿入/更新/削除を行います。私はいくつかのクライアントサイトの運用環境で使用しており、非常にうまく機能しています。

将来のオプション(できればPostgreSQL 9.5で)は​​、ログストリーミングの論理レプリケーション、論理チェンジセットの抽出、および双方向レプリケーションです。これにより、個々のデータベースまたはテーブルをSQLレベルでレプリケートできるようになります。この作業の一部はPostgreSQL 9.4にコミットされましたが、あなたがやりたいことに役立つようにするのに十分ではありません。

4
Craig Ringer

これを実現するには、dblinksとマテリアライズドビューを使用する必要があります。どちらの機能もPostgresの最新バージョンに組み込まれています。

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

基本的に、Cのテーブルから抽出されたデータを使用して各データベースL1、L2 ...にMviewを構築し、Mviewリフレッシュを使用して、必要に応じて定期的にMviewを定期的に更新します。データはローカルに保存されるため、アクセスは非常に高速です。これは、データが比較的静的で、ローカルデータベースの情報が少し古くなっていることを気にしない場合にのみ適しています。これを適切に管理するために更新頻度を設定する必要があります。それが受け入れられない場合は、データベースリンクを使用して、結果として生じる速度低下に対処する必要があります。

追加機能が必要な場合、スナップショットプロジェクトは高速リフレッシュやスナップショットログなどの高度な機能を提供します。

http://pgfoundry.org/projects/snapshot/

これにより、更新が必要な更新行のみを更新できるため、大規模で非弾性のデータセットに対して更新を非常に高速にして、アプリの中断を最小限に抑えることができます。デフォルトでは、Mviewは完全に削除され、Postgresで再作成されます。これは、明らかな理由でパフォーマンスが非常に低下する可能性があります。

3
Andrew Brennan