九、資料存盤
(一)如何實作跨 Docker 主機存盤?
從業務資料的角度看,容器可以分為兩類:無狀態(stateless)容器和有狀態(stateful)容器,
無狀態是指容器在運行程序中不需要保存資料,每次訪問的結果不依賴上一次訪問,比如提供靜態頁面的 web 服務器,
有狀態是指容器需要保存資料,而且資料會發生變化,訪問的結果依賴之前請求的處理結果,最典型的就是資料庫服務器,
簡單來講,狀態(state)就是資料,如果容器需要處理并存盤資料,它就是有狀態的,反之則無狀態,對于有狀態的容器,如何保存資料呢?
前面在 Docker 存盤章我們學習到 data volume 可以存盤容器的狀態,不過當時討論的 volume 其本質是 Docker 主機 本地 的目錄,
本地目錄就存在一個隱患:如果 Docker Host 宕機了,如何恢復容器?
一個辦法就是定期備份資料,但這種方案還是會丟失從上次備份到宕機這段時間的資料,更好的方案是由專門的 storage provider 提供 volume,Docker 從 provider 那里獲取 volume 并掛載到容器,這樣即使 Host 掛了,也可以立刻在其他可用 Host 上啟動相同鏡像的容器,掛載之前使用的 volume,這樣就不會有資料丟失,
本章將詳細討論如何實作跨 Docker 主機管理 data volume,
(1)從一個例子開始
假設有兩個 Dokcer 主機,Host1 運行了一個 MySQL 容器,為了保護資料,data volume 由 storage provider 提供,如下圖所示,

當 Host1 發生故障,我們會在 Host2 上啟動相同的 MySQL 鏡像,并掛載 data volume,

Docker 是如何實作這個跨主機管理 data volume 方案的呢?答案是 volume driver,
任何一個 data volume 都是由 driver 管理的,創建 volume 時如果不特別指定,將使用 local 型別的 driver,即從 Docker Host 的本地目錄中分配存盤空間,如果要支持跨主機的 volume,則需要使用第三方 driver,
目前已經有很多可用的 driver,比如使用 Azure File Storage 的 driver,使用 GlusterFS 的 driver,完整的串列可參考 https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins
我們這里將選擇 Rex-Ray driver,其原因是:
- Rex-Ray 是開源的,而且社區活躍,
- 支持多種 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等,
- 支持多種作業系統,Ubuntu、CentOS、RHEL 和 CoreOS,
- 支持多種容器編排引擎,Docker Swarm、Kubernetes 和 Mesos,
- Rex-Ray 安裝使用方法非常簡單,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241778.html
標籤:其他
