因為一些緣故, 有一座 Hyper-V 叢集跑 DataCenter, 上面會跑好幾十台 VM
但是因為授權的關係, 不能用 Replica 到別台機器上
微軟說, Hyper-V Manager 裡面有多少台 VM 就要計算多少授權
但是每個 VM 的 vhd 都又肥又大, 不能 Replica 的話每天晚上光 Export 就飽了
所以花了點時間研究寫出了兩個 PowerShell 程式利用 CheckPoint 來做差異化備份
請大家參考~
有需要儘管拿去用, 有 Bug 歡迎告訴我
Hyper-V VM Backup 方式, Replica 的替代方案 (自行撰寫 PowerShell 程式)
長網址
http://blog.dino9021.com/2014/09/hyper-v-vm-backup-replica-powershell.html
短網址
http://goo.gl/lUqCNZ
環境:
1. 唯一一台 Hyper-V, 無法做複寫或叢集
2. 只有一座 Hyper-V 叢集, 沒有其他 Hyper-V 主機
描述:
上述狀況都無法進行 Hyper-V 複寫來作為備份策略
如果用 Export-VM 的話, 若 VM 的 vhd 很大則會佔用大量 Disk I/O
解決方式:
自行撰寫 PowerShell 程式, 利用 CheckPoint 功能土砲差異化備份
(與 Replica 雷同)
預設條件:
VM 本身除了備份 Powershell 所建立的 CheckPoint 外不可以有其他 CheckPoint
註: Production 環境的 VM 本來就不該有 CheckPoint, 會影響運作效率
程式運作邏輯:
1. 建立 CheckPoint 使 VM 原始 vhd 停止寫入,
新的變更都會寫在 CheckPoint 所建立的差異磁碟 avhd
且該 CheckPoint 會將當時的記憶體寫入成檔案, 等於 VM Pause
2. 將上述 CheckPoint 資料複製出來作為備份,
未來就還原該 CheckPoint, 達到備份還原目的
可達到的目標:
1. 可進行 VM 線上差異化備份, 不用每次備份都 Export, 佔用大量 I/O
2. 可以在允許 Down Time 較久的前提下手動做不停機 Migration
與 Export 後再 Import 是一樣的道理, 只是使用的是差異化磁碟
歷史:
2014.09.24 加入備份檔案檢查機制
程式運作流程:
初始化:
1. 檢查 VM 任何 CheckPoint, 沒有就可以進行初始備份
2. Copy VM 的 xml 檔
3. 建立 CheckPoint (停止寫入原始 vhd 檔)
4. 複製 VM 原始 vhd 檔
5. 產生 CheckPoint 版本檢查檔
(純文字放在備份路徑中, 用以日後判斷差異磁碟版本)
6. 等待下次備份
備份:
1. 檢查是否只有一個 CheckPoint
2. 檢查該版本是否與 CheckPoint 版本檢查檔中的紀錄相同,
相同就可以進行備份
3. Copy VM 的 xml 檔
4. 建立 CheckPoint (停止寫入前一次 CheckPoint Snapshot 中的 vhd 檔)
5. 複製前一次 CheckPoint 的 差異磁碟 avhd
6. 複製前一次 CheckPoint 的 Snapshot (xml + bin / vsv)
7. 產生 CheckPoint 版本檢查檔
(純文字放在備份路徑中, 用以日後判斷差異磁碟版本)
8. 刪除前一次 CheckPoint
(使 Hyper-V 自動合併, 避免積存太多 CheckPoint 影響效能)
9. 檢查備份數量, 如果超過所設定的備份數量,
就從最舊的版本開始進行 vhd 合併
10. 建立備份歷史檔, 記載備份檔案清單、檔案大小、最後修改日期
11. 等待下次備份
還原:
1. 列出備份資料夾中現有 CheckPoint 版本供選擇
2. 將原始 vhd 檔複製到 Merge 資料夾中
3. 從最舊的 CheckPoint 版本開始,
至所選擇 CheckPoint 版本的 "前一個版本" 為止
將每一個版本所備份的差異化磁碟 avhd 檔複製到 Merge 資料夾中
4. 將上述 avhd 與原始 vhd 依照版本順序 Merge
5. 將所選擇 CheckPoint 版本的差異化磁碟 avhd 檔
複製到 Merge 資料夾中 (不可以 Merge)
6. 將所選擇 CheckPoint 版本的 VM xml 複製到 Merge 資料夾中
7. 將所選擇 CheckPoint 版本的 Snapshot複製到 Merge 資料夾中
8. 完成, 至 Hyper-V 中 Import 上述 Merge 資料夾
9. Import 以右鍵點選 CheckPoint 並選擇 Apply 後再開機
10. 將該 CheckPoint 刪除,
此時會發現 CheckPoint 仍然存在且再次刪除時會發生錯誤
11. 手動至該還原 VM 的資料夾中將 Snapshot 資料夾中的檔案全部刪除
12. 重新整理後已沒有任何存在的檢查點,
並且 VM 正以所選擇的 CheckPoint 版本運作中
13. 重建備份歷史檔, 重新計算原始 vhd 檔案大小、最後修改日期,
刪除已合併的 CheckPoint 歷史資料
14. 繼續使用 VM, 並重新進行 Backup 策略
程式共兩支:
Hyper-V VM Backup.ps1
1. 用來進行備份, 需要帶入 4 個參數:
-VM [VM名稱]
-Path [備份目標路徑]
-RV [備份保留版本數, 數字, 未輸入則預設為 10]
-CI [CheckPoint 檢查名稱, 如有空格前後要加引號,
未輸入預設為 'Backup Circle By Dino9021']
2. 用排程執行就好了, 目前沒有撰寫背景等待執行的功能
Hyper-V VM Restore.ps1
1. 用來還原, 需要帶入 2 個參數:
-Path [備份所在路徑, 未輸入的話程式執行時會要求輸入]
-CI [CheckPoint 檢查名稱, 如有空格前後要加引號,
未輸入預設為 'Backup Circle By Dino9021']
已知問題:
1. 還原後移除 CheckPoint 要按重新整理才會從 CheckPoint 列表中清除
(應該算 Hyper-V Bug?)
2. 除了本程式建立的 CheckPoint 之外不可以有其他的 CheckPoint
要想辦法寫出備份所有的 CheckPoint 也不是不行, 但是很麻煩
Production 環境的 VM 本來就不該有一堆 CheckPoint
所以目前並不打算進行這方面的研究