2

私のWebアプリケーションは、Web層とDB層の両方でスケーラビリティをサポートする必要があります。私は次のコンポーネントを持っています:

  1. N個のWebサーバー(Tomcat)
  2. シャードキーとしてユーザー名でシャーディングされたMDBサーバー(PostgreSQL)

次のようなシャード戦略:

  1. シャード戦略はルックアップテーブルベースであり、1つのインデックステーブル(username、shardId)ともう1つのシャードテーブル(shardId、connectionString、loading)があります。

  2. シャードDBを定期的に監視し、読み込みステータスフィールドを更新します。

  3. 新しいユーザーを作成するときは、常に負荷が最も低いシャードを取得し、インデックステーブルに保存します。

  4. DBシャードは動的に追加または削除されます。

getDBConnection(username)シャードキー(この場合はログインユーザー)に従って1つのJDBC接続を取得するようなAPIを実装する必要があります。

質問は次のとおりです。

1.接続プールで機能する方法でこのAPIを実装するにはどうすればよいですか?各シャードが500の接続をサポートしているとすると、Javaコードを介してこれをどのように行うことができますか?

4

1 に答える 1

2

私はおそらくアプリケーションで接続プールをまったく使用しないでしょう、私はおそらくサーバー側の接続プールをpgpool-IIまたはで使用するでしょうpgbouncer

アプリケーション内プーリングを使用する場合は、シャードごとの接続プールを作成し、シャードに適切なプールから接続を選択するだけです。これは、宣言的ではなくプログラムでプールを作成できる接続プールの実装で機能します。各プールは、非アクティブな接続を非常に積極的に閉じようとする必要があります。これにorg.apache.tomcat.jdbc.pool.DataSource適しているようです。TomcatJDBCプールのドキュメントを参照してください。

これにより、潜在的に多数の接続が存在し、多数の接続/切断が発生するため、サーバー側の接続プールを実行して、各シャードへの接続を制限および共有することも非常に重要です。pgbouncer各シャードで、またはトランザクションプーリングモードのようなものを使用pgpool-IIして、Webワーカーからの多数の接続間で比較的少数の実際のPostgreSQL接続を共有します。

次のようなパターンが必要になると思います。

web1 [pool1]-----------------------------[server1-pgbouncer]------[server1-pg]
     [pool2]-------------------------------v         ^
     [pool3]---------v        [server2-pgbouncer]-----------------[server2-pg]
                     |                     ^         |
                    [server3-pgbouncer]---------------------------[server3-pg]
                     |                     |         |
web2 [pool3]---------^                     |         |
     [pool2]-------------------------------|         |
     [pool1]------------------------------------------

ここで、各アプリプールは、そのプールに対応するシャードサーバー上のpgbouncerに接続し、そのシャードサーバーのpgbouncerのみがシャードのPostgreSQLインスタンスと通信します。

于 2012-10-29T09:41:56.847 に答える