天天看點

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

Snapshot 可以為 volume 建立快照,快照中儲存了 volume 目前的狀态,以後可以通過 snapshot 回溯。snapshot 操作實作比較簡單,流程圖如下:

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

向 cinder-api 發送 snapshot 請求

cinder-api 發送消息

cinder-volume 執行 snapshot 操作

下面我們詳細讨論每一個步驟。

客戶(可以是 OpenStack 最終使用者,也可以是其他程式)向 cinder-api 發送請求:“請 snapshot 指定的 volume。

這裡我們将 snapshot volume “vol-1”。

進入 GUI 操作菜單 Project -> Compute -> Volumes。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

選擇 volume “vol-1”,點選 “Create Snapshot”。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

為 snapshot 命名。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

這裡我們看到界面提示目前 volume 已經 attach 到某個 instance,建立 snapshot 可能導緻資料不一緻。我們可以先 pause instance,或者确認目前 instance 沒有大量的磁盤 IO,處于相對穩定的狀态,則可以建立 snapshot,否則還是建議先 detach volume 在做 sanpshot。

cinder-api 将接收到 snapshot volume 的請求。日志檔案在 /opt/stack/logs/c-api.log。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

cinder-api 發送消息 snapshot 消息。cinder-api 沒有列印發送消息的日志,隻能通過源代碼檢視 /opt/stack/cinder/cinder/volume/api.py,方法為 _create_snapshot。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

cinder-volume 執行 lvcreate 指令建立 snapshot。 日志為 /opt/stack/logs/c-vol.log。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

對于 LVM volume provider,snapshot 實際上也是一個 LV,同時記錄了與源 LV 的 snapshot 關系,可以通過 lvdisplay 檢視。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

GUI 的 Volume Snapshots 标簽中可以看到新建立的 “vol-1-snapshot”。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

有了 snapshot,我們就可以将 volume 回溯到建立 snapshot 時的狀态。方法是通過 snapshot 建立新的 volume。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

新建立的 volume 容量必須大于或等于 snapshot 的容量

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作

其過程與 Create Volume 類似,不同之處在于 LV 建立之後會通過 dd 将 snapshot 的資料 copy 到新的 volume。

日志分析不再贅述,留個大家練習。

如果一個 volume 存在 snapshot,則這個 volume 是無法删除的。

這是因為 snapshot 依賴于 volume,snapshot 無法獨立存在。

在 LVM 作為 volume provider 的環境中,snapshot 是從源 volume 完全 copy 而來,是以這種依賴關系不強。

但在其他 volume provider(比如商業儲存設備或者分布式檔案系統),snapshot 通常是源 volume 建立快照時資料狀态的一個引用(指針),占用空間非常小,在這種實作方式裡 snapshot 對源 volume 的依賴就非常明顯了。

以上就是 volume snapshot 的分析,下一節我們讨論一個與 snapshot 容易混淆的操作:backup。

Snapshot Volume 操作 - 每天5分鐘玩轉 OpenStack(58) 向 cinder-api 發送 snapshot 請求 cinder-api 發送消息 cinder-volume 執行 snapshot 操作