0

私のお気に入りのプロジェクト (予想を超えて成長したプロジェクト) では、なんらかの形式の負荷分散と障害に対する安全性を追加する必要があります。このプロジェクトでは、次の 3 つのレイヤーを使用します。

  1. フロントエンド (顧客がアクセスするもの)
  2. ミドルウェア (フロントエンドとバックエンド間の通信を提供)
  3. バックエンド(ビジネスロジック、データストレージ)

ミドルウェアは Java サーブレット、バックエンドは PostgreSQL です。顧客ごとに 1 つのデータベースがあるため、常に DB が行き来しています。新しいデータは 24 時間ごとに 1 回インポートされ、それ以外の時間は基本的に読み取り専用であるため、バックエンドは非常にシンプルです。

システム全体の回復力を高める (サーバーの障害、負荷の急増など) ために、バックエンドを他のサーバーに複製したいと考えています。その後、ミドルウェアは実行中のすべてのバックエンドにリクエストを均等に分散できます。

問題は、レプリケーションにどのようにアプローチするかです。

  1. ミドルウェアにすべての作業を任せます (DB ダンプを作成し、そのダンプを他のバックエンド サーバーにプッシュして復元します)。
  2. Postgres の組み込みメカニズム (Slony、ストリーミング リプリケーションなど) を使用します。

どちらの方法にも長所と短所があり、どちらも完全に正しいとは思えません。私の主な考えは次のとおりです。

  • ミドルウェアを使用すると、制御が強化され、現在存在する顧客をより簡単に特定して、それらの DB のみをレプリケートできます。新しいバックエンド サーバーをクラスターに追加するのがより簡単になります。オンデマンドでレプリケーションを実行できます。この顧客の新しいデータがインポートされたとき。pg_dump と pg_restore を正しく処理するには、かなりの開発作業が必要です。
  • 組み込みのメカニズムを使用すると、いくつかの作業が節約され、パフォーマンスと信頼性が向上する可能性があります。バックエンド サーバー (SSH、VPN) 間に何らかの通信チャネルを提供する必要があります。

それで、ここでより良いアプローチは何ですか?私はミドルウェア オプションを好む傾向がありますが、それは Postgres の経験が非常に限られているためかもしれません。

おまけの質問: Postgres レプリケーションがより良いオプションである場合、どのメカニズム (現在 Postgres 9 にはかなりの数があります) が私のシナリオに最適ですか?

4

3 に答える 3

1

短い答え、既存のソリューションの上に構築します。複製は困難であり、多くの賢明な人々がすでに大部分の作業を行っています。Slony、Londiste、ストリーミング レプリケーションはすべて異なる機能を提供しますが、共通点が 1 つあります。どちらを選択するかは、何を達成しようとしているかによって異なります。

ストリーミング レプリケーションでは、複数の読み取り専用ノードがマスター ノードからわずかに遅れているだけです (通常は目立ちません)。スキーマの変更を適用するための管理オーバーヘッドがなくなります。これはバイナリ レプリケーションです。ただし、これはオール オア ナッシング レプリケーション (クラスター レベルでのレプリケーション) です。すべてのサーバーへのルート アクセス権があれば、セットアップは特に難しくありません。

Londiste/Slony を使用すると、レプリケートされる内容をより詳細に制御できるようになり、テーブル レベルまで制御できるようになります。これにより、1 つのタスク (つまり、1 つのビジネス領域) のみを実行するノードを簡単に追加できます。インストールはもう少し複雑で、スキーマの移行はより複雑です。Londiste を使用すると PGQ を取得できるため、データベースにメッセージ キューが作成されます。これもまた、ビジネスの他の部分で役立つ場合とそうでない場合があります。

運用データベースに最近小さな問題が発生したため、バイナリ ストリーミング レプリケーション (ホット スタンバイ ノード) をセットアップしたところです。私はそれがどのように機能するか、そしてそれがどれほど最新であるかに非常に感銘を受けました。また、このノードへの読み取り専用クエリの負荷分散も検討しています。私はLondisteで簡単な経験があり、十分に文書化されていることがわかりましたが、通常はクラスター全体のレプリケーションが必要なので、ホットスタンバイが最も理にかなっています.

時間を無駄にする/バグを作成する/必要以上の作業を自分に与える以外に、自分で複製を行うことで得られるものはわかりません。

于 2012-07-15T15:21:02.130 に答える
0

ここで車輪を再発明しても意味がないというオチャールズに同意します。ただし、pg_dump/pg_restore がそれを実行できる場合、それは完全に適切なセットアップです。通常、レプリケーションで完全なダンプ/復元が実行できない理由は次のとおりです。

  1. データベースが大きすぎます - フル ダンプ/復元に時間がかかりすぎます。

  2. データベースがアクティブすぎます - コピーを最新の状態に保つ必要があります。

これらが問題にならない場合、レプリケーション プロセスは次のようになります。

データベースごとに...

  1. ログ テーブルに「時刻 T にバックアップを取得しようとしています」を挿入します。

  2. pg_dump データベース

  3. バックアップを 1 つまたは複数のスレーブにコピーする

  4. pg_restore

  5. 上記のタイムスタンプ挿入がスレーブに存在することを確認します

これはシンプルで保守性が高く、アクティブな各データベースの毎日のアーカイブ可能な自己完結型バックアップという素晴らしいボーナスを提供します。

もちろん、データベースが大きくなりすぎたり、1 日に複数回更新する必要がある場合、これはうまくいきません。

于 2012-07-16T06:10:23.657 に答える
0

OP によるフォローアップの質問への回答 -- Londiste のセットアップ/構成は非常に簡単です。いくつかの簡単な手順を実行するだけで、レプリケーション用にマスターに任意のテーブルを追加し、それらを宛先データベースにマテリアライズできます (カスケード レプリケーションが利用可能)。skytools パッケージの doc フォルダーには、さまざまなシナリオを説明する複数のハウツーがあります。

于 2013-11-05T16:20:25.473 に答える