2016-09-26 111 views
1

在包含多個可部署數據庫的節點的Docker Swarm上運行Postgresql數據庫。使用Docker版本1.12+。Docker Swarm JDBC連接

使用Data容器,Postgresql故障轉移工作正常。現在我希望有一個Java客戶端連接到數據庫,並且還可以在故障轉移後繼續運行。應該如何在這裏管理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.] 

你的數據庫服務器可通過DNS網絡作爲app-db內,任何服務一樣app-net網絡。因此app-db是您在JDBC連接字符串中使用的服務器名稱。您可以擁有Postgres容器的多個副本,或者在故障轉移時移動的單個容器 - 該服務將始終在該地址處可用。

但:我會謹慎使用數據容器進行故障轉移。你有一個包含你的數據庫狀態的容器;即使您的狀態處於音量狀態,也不會在集羣中移動。因此,如果包含數據的節點失敗,那麼您的數據容器將從其他地方啓動,但數據不會與其一起使用。

+0

謝謝 - 我會試試這個! FWIW,至少目前來說,我已經在一個掛載在羣集中所有物理主機上的NFS掛載上有一個狀態。因此,所有失敗的數據都在發生變化,但我仍在研究更好的方法來做到這一點 – JoeG

+0

很多人都在研究更好的方法......儘管NFS是一個可行的選擇,但卻是以性能爲代價的。如果你可以在這裏發佈你的卷映射,這可能對未來的讀者有用。 –

+0

Jdbc與循環式連接負載平衡可能會導致一些有趣的行爲。恕我直言,一個更好的主意是啓動一個獨立的主服務,其中有1個節點,另一個有n個節點的從服務。如果需要,您可以爲主 - 主設備類型設置添加其他主服務。 –