為什么不建議把數據庫部署在Docker容器內
Docker在過去ocker非常受歡迎。開發人員迫不及待地想將所有應用程序部署在Docker容器中,但你確定你也應該部署數據庫容器嗎?這個問題不是空的,因為你可以在網上找到很多操作手冊和視頻教程。這里整理了一些數據庫不適合容器化的原因供您參考。同時,我希望您在使用時能謹慎。到目前為止,將數據庫容器化是非常不合理的,但我相信所有開發人員都嘗到了容器化的優勢。我希望隨著技術的發展,能出現更完美的解決方案。
為什么不建議在Docker容器中部署數據庫?
部署數據庫的七個原因不適合Docker。
1.不要將數據存儲在容器中,這也是Docker官方容器使用技能之一。容器可以隨時停止。或刪除。當容器被RM丟失時,容器中的數據將丟失。為了避免數據丟失,用戶可以使用數據卷來存儲數據。然而,容器的Volumes設計是圍繞UnionFS鏡像層提供持久存儲,數據安全缺乏保證。如果容器突然崩潰,數據庫沒有正常關閉,數據可能會損壞。此外,容器中共享的數據卷對物理機器的硬件也有很大的損壞。即使你想將Docker數據存儲在主機中,它仍然不能保證不丟失數據。使用當前的存儲驅動程序,Docker仍然存在不可靠的風險。如果容器崩潰,數據庫沒有正確關閉,數據可能會損壞。
2.眾所周知,MySQL是一個關系數據庫,對IO有很高的要求。當一臺物理機運行多次時,IO會累積,導致IO瓶頸,大大降低MySQL的讀寫性能。在Docker應用的十大難點特別節目中,一家國有銀行的一位架構師也提出:數據庫的性能瓶頸通常出現在IO上。如果遵循Docker的想法,許多docker最終的IO請求將再次出現在存儲上。現在互聯網上的大多數數據庫都是sharenothing的架構,這可能是一個不考慮遷移到docker的因素。
一些學生也可能有相應的解決性能問題的方案:
(1)數據庫程序與數據分離。
如果使用Docker運行MySQL,則需要將數據庫程序與數據分離,將數據存儲在共享存儲中,并將程序放入容器中。如果容器異常或MySQL服務異常,自動啟動新容器。此外,建議不要將數據存儲在宿主機中。宿主機和容器共享卷對宿主機的損壞有很大影響。
(2)運行輕量級或分布式數據庫。
Docker部署了輕量級或分布式數據庫。Docker本身建議掛斷服務,自動啟動新容器,而不是繼續重啟容器服務。
(3)合理布局應用。
對于IO要求較高的應用或服務,更適合在物理機或KVM中部署數據庫。目前TX云的TDSQL和阿里的Oceanbase直接部署在物理機上,而不是Docker。
3.如果你想了解Docker網絡,你必須對網絡虛擬化有深入的了解。數據庫需要特殊和持久的吞吐量來實現更高的負載。未解決的Docker網絡問題仍未在1.9版本中解決。將這些問題放在一起,容器化使數據庫容器難以管理。你需要多少時間來解決Docker網絡問題?把數據庫放在一個特殊的環境中不是更好嗎?節省時間專注于真正重要的業務目標。
4.在Docker中包裝無狀態服務非常酷,可以安排容器,解決單點故障問題。但是數據庫呢?將數據庫放置在同一環境中,它將處于狀態,并使系統故障范圍更大。下一次,您的應用程序實例或應用程序崩潰可能會影響數據庫。知識點:在Docker中,水平伸縮只能用于無狀態計算服務,而不是數據庫。Docker快速擴展的一個重要特點是無狀態。具有數據狀態的不適合直接放置在Docker中。如果數據庫安裝在Docker中,則需要單獨提供存儲服務。目前,TX云的TDSQL(金融分布式數據庫)和阿里云的Oceanbase(分布式數據庫系統)直接在物理機器上運行,而不是使用易于管理的Docker。
5.在資源隔離方面,Docker確實不如虛擬機KVM。Docker利用Cgroup實現資源限制。它只能限制資源消耗的最大值,而不能隔離其他程序來占用自己的資源。如果其他應用程序過渡占用物理機器資源,則會影響容器中MySQL的讀寫效率。隔離級別越高,資源成本就越高。與特殊環境相比,易于水平伸縮是Docker的一大優勢。然而,在Docker中,水平伸縮只能用于無狀態計算服務,不適用于數據庫。我們沒有看到任何數據庫隔離功能。我們為什么要把它放在容器里?
6.大多數人通過共享云開始項目。云簡化了虛擬機操作和更換的復雜性,因此沒有必要在夜間或周末測試新的硬件環境。當我們可以快速啟動一個例子時,為什么我們需要擔心這個例子的操作環境呢?這就是為什么我們向云提供商支付了大量的費用。當我們將數據庫容器放置為例子時,上述便利性并不存在。由于數據不一致,新的例子不會與舊的例子兼容。如果我們想限制單機服務的使用,我們應該讓DB使用非容器環境,我們只需要保持靈活擴展計算服務層的能力。
7.DBMS容器和其他服務經常在同一主機上運行。然而,這些服務對硬件有非常不同的要求。數據庫(特別是關系數據庫)對IO有很高的要求。一般數據庫引擎使用特殊環境,以避免并發資源競爭。如果將您的數據庫放入容器中,則將浪費您的項目資源。因為你需要為這個例子配置大量的額外資源。在公共云中,當您需要34G內存時,您必須打開64G內存。在實踐中,這些資源并沒有完全使用。如何解決它?您可以分層設計,并使用固定資源來啟動不同層次的多個例子。水平伸縮總是比垂直伸縮好。
綜上所述,對于上述問題,數據庫是否不能部署在容器中?答案是:我們不能將數據丟失和不敏感的業務(搜索。埋點)集成,并使用數據庫分片來增加實例數,從而增加吞吐量。docker適用于運行輕量級或分布式數據庫。當docker服務掛斷時,新容器將自動啟動,而不是繼續重新啟動容器服務。數據庫可以通過中間件和集成系統自動擴展。容災。切換。它有多個節點,也可以集成。
上一篇: 怎么判斷你的公司外包選擇是否已是完善
下一篇: 網絡設備維護常見的幾種術語介紹
