9

私のアプリケーションは Postgresql 9.0 を使用し、グローバル データベースと対話する 1 つ以上のステーションで構成されています。これは一般的なクライアント サーバー アプリケーションに似ていますが、ハードウェアの追加を避けるために、すべてのステーションにクライアントとサーバーの両方が含まれています。サーバーとしても機能し、その他はクライアントとして機能します。このソリューションにより、私はスケーラブルになります。ユーザーは最初は単一のステーションを必要とするかもしれませんが、初期段階で役に立たない別のサーバーを使用せずに、将来さらに拡張することを決定できます。

メインステーションがダウンすると、他のすべてのステーションが機能しなくなることを回避しようとしています。そのための最善の解決策は、メイン データベースを 1 つ以上のステーションの未使用のデータベースに継続的に複製することです。

検索すると、私のニーズに pgpool を使用できることがわかりましたが、すべての例とチュートリアルから、障害点はメインデータベースから pgpool を実行するサーバーに移動するようです。

複数の pgpool とハートビート ツールについて読んだことがありますが、その方法が明確ではありません。

分離された特殊なサーバーが存在しない私のアーキテクチャを考えると、誰かが私にいくつかのヒントを与えることができますか? フェールオーバーの場合、pgpool はすべて自動で行うように見えますが、フェールオーバーの状況は、管理者の介入なしに標準ユーザーが処理できると考えてよいでしょうか?

4

4 に答える 4

8

この種のアプリケーションでは、AmazonのDynamoデザインが本当に気に入っています。リンク先のドキュメントはかなり大きいですが、読む価値があります。実際、このアプローチをすでに実装しているアプリケーションがあります。

多分他の人ですが、私は知りません。CassandraはFacebook内で開始され、VoldemortはLinkedInで使用されているものです。物事を分散させ、データ分散に冗長性を追加することで、従来のマスタースレーブレプリケーションアプローチから離れることができます。

PostgreSQLを使い続けたいのであれば、そのようなアプローチを実装することは大したことではないはずです。事前に構成されたオプションに基づいてデータの取得/保存方法を決定する追加のレイヤー(プロキシ)を実装する必要があります。

プロキシ層は次の場所に実装できます。

  • アプリケーション(多くの作業が必要ですIMHO);
  • データベース;
  • ミドルウェアとして。

Skypeで作成されたプロジェクトであるミドルウェアレイヤーでPL/Proxyを使用できます。PostgreSQLに深く統合されているので、オプション2と3の組み合わせだと思います。PL/ Proxyでは、データベースに対するあらゆる種類のクエリに関数を使用する必要があります。パフォーマンスの問題が発生した場合は、PgBouncerを使用できます。

最後の注意:どのような方法でも、既知の量の開発が必要になります。

編集:

それはすべて、あなたが「失敗」と呼ぶものと、システムが中断された状態にあるとあなたが考えるものに依存します。

pgpoolの機能を見てみましょう。

  1. 接続プールPostgreSQLは、セッションごとに1つのプロセス(フォーク)を使用しています。明らかに、非常に忙しいサイトがある場合は、OSの制限に達します。これを克服するために、接続プーリーが使用されます。また、リソースを均等に使用できるため、通常、データベースの前にプーリーを配置することをお勧めします。
    pgpoolが停止した場合、データベースにアクセスできない多数のクライアントに直面します。プーリーを避けてデータベースに直接ポイントすると、パフォーマンスの問題が発生します。

  2. レプリケーションすべてのクエリはスレーブインスタンスに自動レプリケーションされます。これは、DMLおよびDDLクエリにとって意味があります。
    pgpoolが停止した場合、pgpoolの外部で変更の追跡が行われないため、レプリケーションが停止し、スレーブはマスターに追いつくことができなくなります(私が知る限り)。

  3. 負荷分散読み取り専用クエリは複数のインスタンスに分散され、優れた応答時間を実現し、システムにより多くの帯域幅を割り当てることができます。
    pgpoolが停止した場合、システムがそのような負荷を処理できる場合、クエリの実行は突然遅くなります。そしてこれは、失敗したpgpoolの代わりにマスターデータベースが追いつく場合です。

  4. 超過接続の制限pgpoolは、接続をすぐに処理できない場合に備えて、接続をキューに入れます。
    pgpoolが停止した場合、そのような接続はすべて中止され、DB /アプリケーションプロトコルにブレーキがかかる可能性があります。つまり、アプリケーションは接続が中止されないように設計されています。

  5. 並列クエリ応答時間を短縮するために、単一のクエリが複数のノードで実行されます。
    pgpoolが停止した場合、そのようなクエリは不可能になり、処理が長くなります。

このような状況に直面しても問題がなく、それらを失敗として扱わない場合は、pgpoolが役立ちます。また、5分間の停止で会社に数千ドルの費用がかかる場合は、より確実なソリューションを探す必要があります。

停止のコストが高いほど、フェイルオーバーシステムをより細かく調整する必要があります。通常、フェイルオーバーの自動化を実現するために使用されるツールは1つだけではありません。それぞれの失敗で、あなたは微調整する必要があります:

  • すべてのクライアントの再構成が必要な場合を除き、DNS。
  • バックアップとフェイルオーバー手順を再初期化します。
  • 古いマスターが戻ってきた場合にその役割のために戦おうとしないことを確認してください(STONITH);
  • 私の経験では、適切な戦略を決定するのはDBA、SysAdmin、アーキテクト、運用の各部門の人々です。

最後に、私の見解では、pgpoolは優れたツールであり、私はそれを使用しています。ただし、完全なフェイルオーバーソリューションとして設計されているわけではなく、特別な思考、対策、スクリプトの作成が必要です。したがって、私は分散データベースへのリンクを提供しました。それらははるかに高いレベルの可用性を提供します。

また、PostgreSQLは拡張性が高いため、少しの労力で配布できます。

于 2012-04-07T20:28:30.390 に答える
2

このブログを読んでみてください (PostgreSQL と PgPool-II に関する多くの情報が記載されています)。

https://www.itenlight.com/blog/2016/05/21/PostgreSQL+HA+with+pgpool-II+-+Part+5

同じブログで「WATCHDOG」を検索してください。これで、PgPool-II クラスターを構成できます。ただし、同じサブネット上の 2 つのマシンと、同じサブネット上の仮想 IP が必要です。

これが同じことをしようとしている人にとって役立つことを願っています(この答えがかなり遅れていても)。

于 2016-11-16T11:36:52.057 に答える
2

まず、 pgpoolではなくpgBouncerをチェックアウトすることをお勧めします。次に、どのレベルのスケーリングに到達しようとしていますか? すべてのクライアント システムで接続プーラーを実行することを選択することもできます (バウンサーはこれが機能するのに十分軽量です)。

そうは言っても、ヴィエゴロフの答えはおそらく、この時代に本当に見るべき方向です。本当にデータベースが必要ですか?

編集

したがって、かなり明白な答えは、pgPool を実行しているボックスが 1 つしかない場合、pgPool は単一障害点を作成するということです。明らかな解決策は、複数のボックスで複数のプーラーを実行することです。次に、データベースの切断を処理するようにアプリケーション コードを設計する必要があります。これは思ったほど簡単ではありませんが、基本的に、冪等でない変更には 2 フェーズ コミットを使用する必要があります。したがって、可能な限り、変更を冪等にする必要があります。

あなたのコメントに基づいて、データベースのレプリケーションを扱った経験が限られているのではないでしょうか? pgPool はステートメントベースのレプリケーションを行います。ここにはトレードオフがあります。設定が非常に簡単なのがメリットです。欠点は、レプリケートされたデータベースのデータが同一で​​あるという保証がないことです。また、(最近チェックしていないと思いますが)2pcと互換性がありません。

データベースが本当に必要かどうかを尋ねる前のコメントは、システムのこの部分についてあまり詳しく説明せずにシステムを設計したという私の認識に基づいていました。私は、同様のシステムの「この部分」に取り組んだ約 20 年の経験があります。すぐに使えるソリューションはなく、関連する問題が非常に複雑になっていることに気付くと思います。つまり、デザインを再検討することをお勧めします。

于 2012-04-24T00:37:18.540 に答える