2013-10-08 51 views
17

我有一臺運行5或6個小Rails應用程序的服務器。他們所有的附件都在S3上,他們都使用MySQL作爲數據庫。每個應用程序都有自己的用戶,並運行一些瘦。有一個nginx服務器負責進行負載均衡和域路由。關於數據庫的Docker多應用程序服務器的體系結構

我打算用Docker安裝來替換這個服務器:一臺服務器每個應用都有一個容器,前面有一個nginx。

我的問題是:你會把數據庫部分放在哪裏?

我主要看到4種可能性:

1)一個應用程序的每個容器內MySQL服務器。這並不是我想的Docker哲學。這將要求每個容器的數據單獨備份。

2)適用於所有應用程序的獨特MySQL容器。

3)主機Docker服務器上的標準MySQL安裝。

4)一個單獨的MySQL服務器的所有應用程序。

你會怎麼做? PS:我知道Docker還沒有準備好,我打算現在用它來升級,如果我對它滿意的話,也可以切換。

回答

22

這取決於幾個因素。以下是一些可幫助您決定的問題。

  • 是5-6的應用程序非常相似(即,在泊塢窗而言,你可以一個共同的圖像基礎上他們),並且您考慮部署更多的人,和/或遷移他們中的一些其他服務器?

    • 是:話很有道理嵌入MySQL服務器中的每個應用程序,因爲這將「堅持圍繞」與應用,以最小的配置工作。

    • 否:那麼嵌入MySQL服務器沒有令人信服的理由。

  • 是否要能夠擴展這些應用程序(即,用於對多個容器的單一應用程序的負載平衡的請求),或者是按比例的MySQL服務器(到例如主/從複製設置)?

    • YES:那麼你不能嵌入MySQL服務器,否則,縮放一層會擴展其他層,這將導致頭痛。

    • NO:那麼沒有什麼能阻止你嵌入MySQL服務器。

  • 您是否認爲這些應用程序中的至少一個應用程序會存在重要的數據庫負載?

    • 是的:那麼你可能想使用單獨的MySQL服務器,因爲一個應用程序可能會阻礙其他應用程序。

    • 否:那麼你可以使用一個單一的MySQL服務器。

嵌入MySQL服務器是好的,如果你想要一個超級易於部署的設置,在這裏你不需要的可擴展性,但是要能夠超易發生側滑啓動新的實例,並且希望能夠毫無困難地移動實例。

最靈活的設置是爲每個應用程序部署一個應用程序容器+一個MySQL容器。如果你想這樣做,我會建議等待Docker 0.7,它將實現鏈接,這會讓你有一個基本的服務發現機制,這樣每個應用容器都可以輕鬆發現其數據庫容器的主機/端口。

我不會在主機上部署MySQL;如果你想單一的MySQL安裝,你可以通過運行一個MySQL容器並使用-p 3306:3306(它會將主機的3306/tcp端口路由到MySQL容器的端口3306/tcp)來運行。

+0

謝謝!是的,這些應用程序是相似的,除了Rails和Ruby版本之外,它只是標準的Rails應用程序及其依賴項。不需要擴展或複製,只需要幾乎沒有特性的基本(幾乎遺留下來的)網站。 – aurels

1

由於5級或6的應用程序如你所說,我一定會排除安裝每個集裝箱單獨的MySQL的選擇,原因有二小:

  1. 這是服務器資源的浪費,這幾乎相當於在同一臺服務器上安裝MySQL 5或6次。
  2. 它不夠靈活(無法獨立於應用程序擴展數據庫)並且難以備份。

有一個專門的MySQL的容器或主機上直接安裝MySQL的(即不dockerizied),應具有幾乎相同的性能(在結束時,你將有一個原生MySQL進程在主機上不管是在容器或不)。

唯一的區別是您必須掛載一個卷才能將數據保存在MySQL 容器之外,因此擁有專用的MySQL容器是更好的選擇。

+0

當選擇直接在Docker主機上運行MySQL時,容器能夠輕鬆連接到它嗎?只需通過127.0.0.1? – aurels

+0

是的,通過'卷'。我使用1個docker mysql容器和多個使用它的應用程序,也使用容器。主機只安裝了docker。 – majkinetor

+0

是,只需將您的MySQL的IP /端口作爲環境變量傳遞給將使用它的Docker容器(非127.0.0.1)。 @majkinetor,他問的是直接在主機上運行MySQL,即在Docker容器之外 – iTech

相關問題