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


9

次のような状況です。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を実行しています)のレプリケーションでこれを実行するように説得できますか。最後の手段として、テーブルを定期的に同期するコードを書くことができます(多少の遅延は許容できます)が、それはできません。

前もって感謝します。


1
ロギングマシンでFDWを使用してCにアクセスするのはどうでしょうか。ただし、Cではマテリアライズドビューのパフォーマンスが低下する可能性がありますが、PostgreSQLが外部テーブルの更新をどのように検出するかはよくわかりません。それが自動的に行われる場合(マテリアライズドビューのドキュメントの末尾に示されているようです)、問題が完全に解決される可能性があります。ただし、これらは9.3の機能です。非常に活発なメーリングリストも役に立ちます。
jpmc26 2014年

回答:


4

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

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

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

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


3

これを行うには、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で再作成されます。これは、明らかな理由でパフォーマンスが非常に低下する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.