web-dev-qa-db-ja.com

Webサイトで分散PostgreSQLデータベースを使用するにはどうすればよいですか?

Webサイトをホストしたいのですが、バックエンドはPostgreSQLデータベースサーバーになります。冗長性を確保するために、異なるデータセンターに複数のWebサーバーを配置したいと思います。次に、各WebサーバーでDNSをラウンドロビンして、負荷を分散します。

これを行うには、複数のデータベースを用意し、何らかのレプリケーションを使用する必要がありますか?または、1つのデータベースを用意し、各Webサーバーがインターネット経由でそのデータベースを指すようにする方がよいでしょうか。

更新1

単一障害点を排除するために、複数のWebサーバーに複数のDBサーバーを配置する必要があるという考えが持ち上がりました。各データセンターに複製を設定したいのですが。各データセンターにWebサーバーとDBサーバーがあります。これが可能かどうかはわかりませんでした。そのため、DBサーバーを1つだけにするか、すべてのDBを1つの場所に置くかを考えました。しかし、理想的には、各データセンターに独自のデータセンターがあります。

2
Anthony D

私は最近、同様のプロジェクトでもそれを理解しようとしました。私が見つけたのは、それはそれほど簡単ではないということです。レプリケーションに関しては、いくつかのオープンソースおよび商用の代替手段があります。ただし、それらのほとんどは複数のマスター-マスターソリューションをサポートしておらず、それらの多くは保守とセットアップが困難です。

Webアプリケーションのセットアップ方法と必要な冗長性に応じて、先に進むためのいくつかの選択肢があります。最も簡単な方法は、おそらくウォームスタンバイを実行することです(その機能はバージョン8.3にすでに含まれています)が、クラッシュが発生した場合、ダウンタイムが発生します。

私が調べた他のレプリケーションソリューションは次のとおりです。

その中で、ブカルドはマスターマスター(マルチではありません)をサポートし、セットアップが非常に簡単なようであるため、最も興味深いと思いました。

Slonyはセットアップが少し難しく、テーブルを更新するときに多くのメンテナンスが必要です(DDLの変更は複製されません)。また、マスタースレーブにすぎないため、1つのデータベースにしか書き込むことができません。

PgClusterは維持されていないようで、ドキュメントやWebサイトに深刻な印象を与えることはありません(Webサイトは2005年以降更新されていません)。

3
Jimmy Stenke

DNSを介してグローバルラウンドロビンを実行すると、接続が非永続的になる可能性があります。コードがノードを認識しない場合は、複製されたデータベースへの書き込みを期待する必要があります。

ソリューションのカップル を使用してマルチマスターレプリケーションのセットアップを行うことができます。私は以前にPgClusterを使用して成功しました。 Postgres-R にも興味深いプロジェクトがあります。

ここでは一貫性が敵であることに注意してください。あるノードに書き込んでから別のノードから読み取ると、リクエストが他のデータベースへのコミットを上回る可能性があります。

クエリの大部分が読み取りである場合は、通常のレプリケーションスキームを設定してから、コードに中央のマスターデータベースへの書き込みを実行させることができます。それはより多くの作業ですが、一貫性の問題に対処しやすくなります。 Slony のようなものを使用して、「通常の」レプリケーションを実行できます。

編集:PgClusterの設定が難しく、ドキュメントが悪いというコメントに同意します。私がこれを書いているときに彼らのサイトがダウンしているので、私は彼らにリンクしませんでした。

1
kordless