資料庫到底要不要上Docker

2020-11-24 電子發燒友

資料庫到底要不要上Docker

IT實戰聯盟 發表於 2020-04-06 09:59:00

前言

近2年Docker非常的火熱,各位開發者恨不得把所有的應用、軟體都部署在Docker容器中,但是您確定也要把資料庫也部署的容器中嗎?

這個問題不是子虛烏有,因為在網上能夠找到很多各種操作手冊和視頻教程,小編整理了一些資料庫不適合容器化的原因供大家參考,同時也希望大家在使用時能夠謹慎一點。

目前為止將資料庫容器化是非常不合理的,但是容器化的優點相信各位開發者都嘗到了甜頭,希望隨著技術的發展能夠更加完美的解決方案出現。

Docker不適合部署資料庫的7大原因

1、數據安全問題

不要將數據儲存在容器中,這也是 Docker 官方容器使用技巧中的一條。容器隨時可以停止、或者刪除。當容器被rm掉,容器裡的數據將會丟失。為了避免數據丟失,用戶可以使用數據卷掛載來存儲數據。但是容器的 Volumes 設計是圍繞 Union FS 鏡像層提供持久存儲,數據安全缺乏保證。如果容器突然崩潰,資料庫未正常關閉,可能會損壞數據。另外,容器裡共享數據卷組,對物理機硬體損傷也比較大。

即使你要把 Docker 數據放在主機來存儲 ,它依然不能保證不丟數據。 Docker volumes 的設計圍繞 Union FS 鏡像層提供持久存儲,但它仍然缺乏保證。

使用當前的存儲驅動程序,Docker 仍然存在不可靠的風險。 如果容器崩潰並資料庫未正確關閉,則可能會損壞數據。

2、性能問題

大家都知道,MySQL 屬於關係型資料庫,對IO要求較高。當一臺物理機跑多個時,IO就會累加,導致IO瓶頸,大大降低 MySQL 的讀寫性能。

在一次Docker應用的十大難點專場上,某國有銀行的一位架構師也曾提出過:「資料庫的性能瓶頸一般出現在IO上面,如果按 Docker 的思路,那麼多個docker最終IO請求又會出現在存儲上面。現在網際網路的資料庫多是share nothing的架構,可能這也是不考慮遷移到 Docker 的一個因素吧」。

針對性能問題有些同學可能也有相對應的方案來解決:

(1)資料庫程序與數據分離

如果使用Docker 跑 MySQL,資料庫程序與數據需要進行分離,將數據存放到共享存儲,程序放到容器裡。如果容器有異常或 MySQL 服務異常,自動啟動一個全新的容器。另外,建議不要把數據存放到宿主機裡,宿主機和容器共享卷組,對宿主機損壞的影響比較大。

(2)跑輕量級或分布式資料庫

Docker 裡部署輕量級或分布式資料庫,Docker 本身就推薦服務掛掉,自動啟動新容器,而不是繼續重啟容器服務。

(3)合理布局應用

對於IO要求比較高的應用或者服務,將資料庫部署在物理機或者KVM中比較合適。目前TX雲的TDSQL和阿里的Oceanbase都是直接部署在物理機器,而非Docker 。

3、網絡問題

要理解 Docker 網絡,您必須對網絡虛擬化有深入的了解。也必須準備應付好意外情況。你可能需要在沒有支持或沒有額外工具的情況下,進行 bug 修復。

我們知道:資料庫需要專用的和持久的吞吐量,以實現更高的負載。我們還知道容器是虛擬機管理程序和主機虛擬機背後的一個隔離層。然而網絡對於資料庫複製是至關重要的,其中需要主從資料庫間 24/7 的穩定連接。未解決的 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服務掛掉,會自動啟動新容器,而不是繼續重啟容器服務。

資料庫利用中間件和容器化系統能夠自動伸縮、容災、切換、自帶多個節點,也是可以進行容器化的。

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 將Docker與pipeline一起使用
    管道支持添加傳遞給Docker的自定義參數,從而允許用戶指定 要安裝的自定義 Docker卷,可用於 在兩次管道運行之間在代理上緩存數據 。以下示例將~/.m2利用maven容器在兩次管道運行之間進行 緩存,從而避免為管道的後續運行重新下載依賴項。
  • 雲計算核心技術Docker教程:Docker Compose的restart和rm命令詳解
    Docker-Compose restart命令可以重新啟動所有已停止並正在運行的服務,Docker-Compose rm命令可以刪除已經停止的容器,如果服務在運行,需要先docker-compose stop 停止容器。
  • Docker 容器 9 類 48 個常見故障的處理和使用規範 | 周末送資料
    如果宿主機上的埠被容器或者系統進程佔用,就會導致埠分配失敗。>為避免出現各種奇怪且偶發的問題,運維和開發人員應該有規範的去使用docker容器,最大程度的去避免因為使用不當而引起的故障,參考以下:Docker使用規範建議儘量使用最近1-2年的新的穩定的docker版本不要去安裝今年前很老的版本,大量的bug已經被新版本更新解決掉了儘量不要去創建非常大的鏡像
  • Docker & Singularity
    自從微軟更新了WSL2(雖然我一直在用WSL),但是發現docker只能在WSL2下使用,又是被需求更新。於是上網查了下window 家庭版的更新方法。打個補丁就好(可以參考該連結https://www.jianshu.com/p/a20c2d58eaac)。
  • 雲計算核心技術Docker教程: Docker 容器連接
    容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 參數來指定埠映射。下面我們來實現通過埠連接到一個 docker 容器。我們創建了一個 python 應用的容器。
  • CoreOS實踐指南(七):Docker容器管理服務
    結緣雷教主說,「站在風口上,豬也能飛起來」。Docker正是借著雲計算的風飛上了天。伴隨著Docker和應用容器的興起,拉動了一批PaaS產品的發展,而CoreOS也借了這股勁兒賺足了人氣,進行得風生水起。
  • 雲計算核心技術Docker教程:利用Dockerfile來創建鏡像
    在docker使用過程中,我們可以從已經創建的容器中更新鏡像,並且commit提交這個鏡像來創建新的鏡像,使用docker commit 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享此時我們可以使用 Dockerfile 指令來創建一個新的鏡像。
  • 雲計算核心技術Docker教程:Docker Compose的pull和push命令詳解
    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務關聯的鏡像,Docker-Compose push命令可以將服務鏡像推送到registry/repository中。
  • 微服務部署到docker中
    可以看到項目根目錄下新增一個名為Dockerfile的文件6.通過Xftp將項目從Windows下的磁碟位置拷貝到Linux的root目錄下二、Linux下通過Docker構建應用1.通過Xshell連接上Linux虛擬機,進入到項目目錄下
  • 【最新版】Docker實戰總結
    a)出生不同 Google根據其在Linux上容器管理經驗,改造到docker管理上,就是kubernetes。他的在許多方面表現良好,最重要的是構造於Google多年的寶貴經驗只上。
  • 使用Jenkins、Docker 構建部署 Serverless 應用
    和 docker 命令掛載到容器中,啟動 jenkins 命令如下: 注意:由於容器內 Jenkins 服務是由 jenkins 用戶啟動的,它無法訪問 /var/run/docker.sock,因此我們需要更改這個文件的權限。
  • Docker 引擎概述
    Docker Engine 實際上是一個客戶端伺服器(client-server)應用:一個在伺服器上長期運行的被稱為 dockerd 的進程。一個指定結構的 APIs,這個 API 被用來與 Docker 守護進程進行通信。
  • 雲計算核心技術Docker教程:Compose使用
    2.使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行。3.最後,執行 docker-compose up 命令來啟動並運行整個應用程式。運行以下命令以下載 Docker Compose 的當前穩定版本:$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • Docker邁入雲(DockerHub)+端(Docker引擎)時代
    Docker簡介和快速發展開源項目Docker於2013年3月啟動,是由PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,原始碼託管在 Github 上,基於谷歌發布的開源程式語言 Go。Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到主流的 Linux 機器上。
  • Docker是什麼?有什麼用途?及理論知識詳細說明
    運維生成環境中:docker化。 了解docker三個重要概念 image鏡像 docker鏡像就是一個只讀模板,比如,一個鏡像可以包含一個完整的centos,裡面僅安裝apache或用戶的其他應用,鏡像可以用來創建docker容器,另外docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那裡下周一個已經做好的鏡像來直接使用 container
  • SpringBoot+GitLab+Docker+Jenkins實現持續集成下
    HOME_PATHADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jarENTRYPOINT ["java", "-jar", "springboot_jenkins01.jar"]這一切都準備完畢之後,我們把項目push到上一節搭建好的
  • Docker v1.13.0 正式版發布,應用容器引擎
    可通過 docker plugin rm 命令卸載插件。Error starting daemon: json: cannot unmarshal string into Go value of type types.PluginEnv要手動刪除所有插件並解決此問題
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    實時和視頻目標識別都可以在我的個人筆記本電腦上以高性能運行,僅使用 8GB CPU。Docker在數據科學中的應用我不在這裡描述 Tensorflow 目標檢測 API 的實現,因為相關的文檔很多。我將展示數據科學家在日常工作中如何使用 Docker。
  • 大白話讓你更懂Docker
    It is on its way to deliver those to you」 Docker直譯過來是碼頭工人,然而Docker給人的第一感覺是容器,容器技術英譯為Linux Container, Container的直譯有貨櫃,容器兩個意思,如果要形象的理解Linux Container的話還是叫貨櫃技術比較好(可以結合著上圖及LOGO
  • Docker不再是唯一的選擇
    如果你已經使用Docker很長時間了,估計要真正說服你去考慮其他工具,得先提供些依據。首先,Docker是一個單體工具。它嘗試去涵蓋所有的功能,通常這並不是最佳實踐。大多數情況下,我們都是只選擇一種專門的工具,它只做一件事,並且做得非常好,非常精。