2016-09-26 14 views
1

データベースを展開できる複数のノードを含むDocker Swarm上でPostgresql DBを実行する。 Dockerバージョン1.12以降を使用しています。Docker Swarm JDBC接続

データコンテナを使用すると、Postgresqlのフェイルオーバーがうまく機能しています。今私は、JavaクライアントをDBに接続させて、フェールオーバーにも耐えたいと思っています。ここでJDBC接続をどのように管理する必要がありますか?接続文字列は変更されますか?他の場所で動作しているnginxのコンテナのようなものを通して管理されるべきですか?この例はどこにでもありますか?概念的には、私はこれを別の(nginxのような)コンテナに移動すると思うが、細部を酷くすることはできない!

答えて

1

swarmモードでは、同じオーバーレイネットワーク内のサービスのサービス名をDNS名で取得するため、プロキシレイヤーを自分で追加する必要はありません。 swam networking docsは詳細には触れたが、本質的には:

docker network create -d overlay app-net 
docker service create --name app-db --network app-net [etc.] 
docker service create --name app-web --network app-net [etc.] 

お使いのデータベースサーバが同じapp-net、ネットワーク内の任意のサービスへのapp-dbなど、ネットワーク内のDNSによって提供されています。したがって、app-dbは、JDBC接続文字列で使用するサーバー名です。 Postgresコンテナの複数のレプリカ、またはフェイルオーバー時に移動する単一のコンテナを複数持つことができます。サービスは常にそのアドレスで利用可能になります。

しかし、私はあなたのデータコンテナでのフェールオーバーについて慎重であろう。そこにデータベースの状態を持つ単一のコンテナがあります。状態がボリューム内にあっても、クラスタの周りを移動することはありません。したがって、データのあるノードに障害が発生した場合、データコンテナは他の場所から開始されますが、データはそのノードには格納されません。

+0

ありがとうございます - 私はこれを試してみましょう! FWIWは、少なくとも今のところ、swarmのすべての物理ホストにマウントされているNFSマウントのボリュームに状態を​​持っています。データはすべての失敗に対して動いていますが、私はまだこれを行うより良い方法を調査しています – JoeG

+0

多くの人々がより良い方法を検討しています... NFSはパフォーマンスを犠牲にしても機能するオプションです。ここにボリュームマッピングを投稿することができれば、それは将来の読者にとって有益かもしれません。 –

+0

接続のラウンドロビンスタイルのロードバランシングを使用するJdbcでは、面白い動作が発生する可能性があります。 IMHOより良いアイデアは、1つのノードとn個のノードを持つ別のスレーブサービスとで別々のマスターサービスを開始することです。必要に応じて、マスターマスタータイプのセットアップ用に別のマスターサービスを追加することができます。 –