Postgresで使用可能なマルチマスターレプリケーション?


16
  1. Postgres-XCを試しましたが、まだ完全なSQLを実装していません(SERIALなど)

  2. Postgres-Rはおもしろそうに見えますが、開発者によると「生産準備が整っていません」。

そこで、pgpool-II 3.0.1を使用しました。はい、うまく動作します。しかし、私が見る限り、2つのPGノードのみです。

実際に生産準備が整っており、複数のPGノードで動作できるものはありますか?


数年前、同じ問題に遭遇しました。最終的に、すべてのものをOracleに移動しました。最近、使用可能なマルチマスターレプリケーションを見つけられることを願っています。
grufftech

2
PostgreSQLのドキュメントでは、ミドルウェアアプリケーションを使用するように記述されています:) .. " 同期マルチマスターレプリケーション ..アプリケーションコードまたはミドルウェア」
ウォーレン

2つのノードに限定されません。
-foocorpluser

回答:


6

ブカルドを検討しましたか?非同期マルチマスターです。これは完全には理解されておらず、一般的な解決策ではありませんが、試してみる価値はあります。


1
私は明らかに十分に明確ではありませんでした:同期レプリケーションが必要です。また、FAQのこれの意味は何ですか?「Bucardoは3つ以上のマスター間で複製できますか?いいえ。現在、Bucardoはマスターからマスター(およびもちろん、多くのスレーブからマスター)のみをサポートしています。」それはマルチマスターですか?
-mrkafk

4
「マルチ」の定義が「2」の場合のみ!
-hmallett

ブカルド5以降、マスター2人の制限が解除されたことに注意してください。
ジョリル

3

Peterの評価に同意する必要があります。現在、Postgresには本当に良いマルチマスターレプリケーションはありません。(真のマルチマスター複製を行うことは非常に難しい問題であり、利用可能なソリューションに夢中になりません。)

調査する可能性のある潜在的なソリューションのウィキペディアのリストを作成:

PostgreSQLは、2フェーズコミットに基づくソリューションを含む、マルチマスターレプリケーション用の複数のソリューションを提供しています。Bucardo、rubyrep、PgPoolとPgPool-II、PgClusterとSequoia、および独自のソリューションがあります。熱心な(同期)レプリケーションを実装する別の有望なアプローチはPostgres-Rですが、まだ開発中です。同期レプリケーションを実装するさらに別のプロジェクトは、Postgres-XCです。Postgres-XCもまだ開発中です。


うわー、そのリストを読んだだけでショックと恐怖を引き起こします。:)
ピーターアイゼントラウト

私にとってそれはうつ病と嫌悪です:
voretaq7

おそらく、2フェーズコミット内で更新ステートメントを実行するなど、設定と通信にetcdに似たシステムを使用できると思います。 。このための
ほぼ自動の

3

これは重いJava指向ですが、ネイティブデータベースクライアントAPIをJDBCデータソースにブリッジできます。Tungsten Myosotisは、JDBCブリッジにネイティブなMySQLの例です。


  • Tungsten Enterprieseは、マルチマスター非同期に適しています。MySQL、PostgreSQL、およびOracleで動作すると思います。スタンドアロンで実行することも、Javaアプリケーションに組み込むこともできます。MySQLで動作するのを見てきましたが、彼らはPostgreSQLを主張しています。Replicatorコンポーネントはオープンソースですが、完全なソリューションにはより多くの部品が含まれており、ライセンスコストが必要です。Continuentはもともとマルチマスター同期用にSequoiaを使用していましたが、それを放棄し、代わりにマルチマスター非同期用にTungstenを作成しました。TungstenはJavaで記述されているため、Myosotisにネイティブデータベースクライアントをブリッジする理由が提供されています。

  • SymmetricDSはマルチマスター非同期に適しています。オープンソースです。binロギングの代わりに、トリガーをインストール/アンインストールして更新をキャプチャします。スタンドアロンで実行することも、Javaアプリケーションに組み込むこともできます。

  • HA-JDBCはマルチマスター同期に適しています。C-JDBCやSequoiaのような古い機能のないソフトウェアに取って代わります。オープンソースです。2フェーズコミットを使用し、PostgreSQL、MySQL、Oracle、SQL Server、Derby、Sybase、その他多くの方言で動作します。主に組み込み用であるため、Javaアプリケーションに埋め込み、PostgreSQLにブリッジします。分散ロック、シーケンス、時間、ランドなどは、Redhat / JBossのjGroupsによって処理されます。アプリのデッドロックが発生し、ロールバックがサポートされていない場合、優れた機能の1つは、トランザクションモードが「パラレル」ではなく「シリアル」であることです。この「シリアル」モードを使用して、DBクラスターに対応していないレガシーアプリを後付けすることに成功したため、トランザクションの再試行コードが欠落していました。シリアルモードは1日を節約し、厄介な書き換えを避けました。

  • H2はマルチマスター同期に適しています。オープンソースです。HA-JDBCアーキテクチャと同様に、2フェーズコミットを使用してスタンドアロンデータベースまたはクラスターをサポートしますが、2フェーズコミットに追加のコンポーネントを必要とするのではなく、1つにまとめられています。それ自体が分散ロックを行うのか、jGroupsやHazelcastのようなサードパーティに依存するのかはわかりません。

アプリケーションがすでにJavaで記述されていない限り、PostgreSQLおよびその他のデータベースのJDBCベースのレプリケーションにはJDBCブリッジへのネイティブが必要です。MySQLの場合、Tungsten EnterpriseはMyosotisと呼ばれるオプションのコンポーネントを提供します。これを使用して、PHP / Perl / C / mysqlclientをJDBCにブリッジしました。JDBCデータソースは、4ノードMySQL / InnoDBクラスターを指すHA-JDBCプロキシデータソースでした。

Tungstenは、ReplicatorおよびRouterコンポーネントでPostgreSQLをサポートしていますが、Myosotisコンポーネントについては不明です。多分。Tungsten Replicator / Routerコンポーネントはマルチマスター非同期用ですが、Myosotisは同期用にHA-JDBCやH2などの代替JDBCバックエンドにブリッジできます。

JDBCブリッジにネイティブなPostgreSQLがある場合、それについて聞きたいと思います。理論的には、JDBC Type 4ドライバーを備えた任意のデータベースをブリッジできます。タイプ4 JDBCは、そのデータベースのネイティブクライアントインターフェイスと同様にネイティブデータベースプロトコルを使用するため、ネイティブコールとJDBCコールの1対1のマッピングが必要です。



1

私は過去2年間、postgresqlのマルチマスターレプリケーションにlondisteを使用しています。

pg_queueを使用してテーブルをキューに配置し、各キューに必要な他の多くのデータベースをサブスクライブできます。レプリケーションはキューごとにアトミックであり、非常に復元力があります。

londisteについてはこちら(http://pgfoundry.org/projects/skytools/)で読むことができます。これは、Skypeのユーザーがクラスターに使用するものであり、作成したものです。


うーん、それは面白いのですが、私はここで見てきたものによると:wiki.postgresql.org/wiki/...、Londisteあるマスタ・スレーブおよび非同期?それでは、どうすればマルチマスターになれますか?さらに、同期レプリケーションが本当に必要です。(アクティブな)クラスターノードのいずれかで障害が発生した場合、トランザクションは失敗するはずです。
mrkafk

このレプリケーションはトランザクション後です。そうしないと、かなり遅くなります
-lynxman

私はお尻の痛みのように聞こえるわけではありません(ピッキング)。個々のトランザクションが遅くなる可能性があります。トランザクションの全体的なスループットが低くなる正当な理由はわかりません。とにかく、おそらくより重要なポイントは、Londisteマルチマスターがどのようになっているのでしょうか?pgサーバー1に書き込み、2に複製し、pgサーバー2に書き込み、サーバー1に複製することはできますか?
-mrkafk


-2

使用可能な「マルチマスター」レプリケーションシステムが見つかりました。

  1. RabbitMQ http://www.rabbitmq.com/を入手してください -これはメッセージミドルウェアです。

  2. RabbitでRabbit MQクラスターを構成します。

  3. クラスタ内の各ノードのキューを作成し、それらを「ファンアウト」タイプの交換にバインドします。

この方法により、メッセージは任意のノードおよびキューに送信され、他のすべてのノードに複製されます。私はこれのために機能するコードを持っています!


2
@mrafk-持っている「作業コード」を投稿/リンクしますか?
ウォーレン

2
これはpostgresでのレプリケーションと何の関係がありますか?これによりメッセージが配信されますが、DBからデータメッセージ/更新を取得し、メッセージキューでメッセージを受信するノードをどのように更新しますか?
僧ks

3
これはあなたが直面していた基本的な問題の解決策かもしれませんが、この質問に対する答えではありません
トムアンダーソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.