這是 OpenStack 實施經驗分享系列的第 13 篇。
instance snapshot 操作可用于備份或者将 instance 儲存為新的 image。如果在生産系統中執行 snapshot 操作,必須確定此操作快速且安全。這裡有兩個關鍵點:
快速。
為保證資料的一緻性,snapshot 時需要 pause instance,操作完後再 resume。在這個過程中 instance 是無法對外服務的,為了減少對業務的影響,我們希望 snapshot 越快越好。
安全。
即資料一緻性,snapshot 出來的 image 不能有沒落盤的資料,能夠正常啟動。是以通常在執行 snapshot 前要 pause instance,暫停所有的 IO 操作。
預設配置下的 snapshot 操作是否能滿足快速和安全這兩個條件呢?
snapshot 是對 instance 的鏡像檔案(系統盤)做快照,鏡像檔案位于計算節點 /var/lib/nova/instances/<instance id>/disk。在第036篇中我們詳細讨論了 snapshot 的執行步驟:
pause instance
執行 qemu-img convert 指令複制 disk 檔案,生成快照檔案
resume instance
将快照檔案上傳到 Glance
其中第 1 步保證了 安全,而是否 快速 取決于第 2 步要花多長時間。qemu-img convert 的執行時間取決于 disk 及其 backing 檔案的大小,通常 instance 系統盤都以 G 為機關,是以第 2 步花費的時間是分鐘級别的。
讓生産系統暫停幾分鐘通常是不能被接受的,是以預設的 snapshot 操作沒法做到 快速。
解決方案是什麼呢?
live snapshot 的原理是:做快照時不 pause instance,直接執行 qemu-img convert。也就是去掉第 1 和 第 3 步。
這樣雖然 快速 條件滿足了,業務不會受到影響。但由于沒有 pause instance,有可能出現快照過程中不斷有新資料寫進 disk 檔案的情況,很難保證資料的一緻性,結果 安全 又成了問題。
官網文檔建議:如果要做 live snapshot,使用者必須自己保證資料的一緻性,比如做快照前確定所有資料已經落盤,并且不會有新資料寫進來。個人覺得,live snapshot 基本上沒法在生産中使用。
那到底有沒有既 安全 又 快速 的方案呢?
預設 snapshot 的問題在于 qemu-img convert 耗時太長,而耗時太長的原因是 instance 的系統盤是檔案,拷貝檔案本身就是一個耗時的操作。真正的解決方案是:
讓 instance 從 cinder volume 啟動,利用 storage provider 自己的 snapshot 技術實作快速複制。
現代存儲系統(無論開源還是商業存儲)基本上都提供了 volume 的 snapshot 功能,而這個 snapshot 是基于指針的,不會真正拷貝資料,是以非常快,通常一瞬間就完成,對業務幾乎沒有影響。是以如果 instance 是從 cinder volume 啟動的,那麼做快照的時候 OpenStack 就會使用 storage provider 的 snapshot 完成操作。這就實作了既 安全 又 快速。
部署 instance 時指定建立 volume。

這裡我們選擇的 image 是 xenial(Ubuntu 16.04),大小為 2.20 GB。確定 Create New Volume 選項為 Yes。Volume Size 為 3(大于 image 2.20 GB)。執行部署後,OpenStack 會完成如下工作:
在 ceph 中建立一個 3 GB 的 volume。
将 image 資料拷貝到該 volume。
instance 從該 volume 啟動。
在 volume 管理界面可以看到這個新建立的 volume。
ubuntu-test 就是我們部署的 instance。接下來對 ubuntu-test 執行 snapshot 操作。
操作瞬間完成!
注意到快照 snap-test 的 Size 是 0 位元組,這是因為它真正的存放位置在 cehp。通過 snap-test 部署出來的 instance 直接就是 boot from volume 的。
boot from volume 其實是 OpenStack 部署 instance 的最佳實踐,instance 的啟動盤和資料盤都由 cinder 管理,而且做快照和做備份都很友善。
到這裡,實施經驗分享部分就先告一段落。按照之前的計劃,接下來是容器技術的内容。不過最近收到很多同學的留言,希望講一講 cloud-init 的工作原理和相關應用。
instance 定制化其實是個非常重要的内容,在生産環境中的需求很大。目前最主流的方案就是 cloud-init,當然僅僅 cloud-init 是不夠的,還得需要 OpenStack 服務的支援。前面之是以沒有讨論,主要是因為這個主題會同時涉及 nova 和 neutron 兩大子產品,要求的知識和技能比較綜合,不過現在則是個非常好的時機。
接下來 CloudMan 會系統講解 instance 定制化這個主題,從原理到實踐力求把它講透。隻是容器部分不得不再多等一下了,見諒見諒。