如何在K8S上備份和恢復MySQL
越來越多的生產系統和關鍵應用運行在K8S上。在生產系統運行有狀態應用,並不是一件容易的事情,它需要我們仔細的計劃並部署。我們之前有一篇文章專門介紹如何在K8S上運行高可用的MySQL。這次我們來介紹下如何備份和恢復MySQL。當我們在生產環境中備份和恢復MySQL,我們需要思考下面的問題:
- 我們需要備份哪些K8S對象?
- 我如何備份我的持久卷(PVs)?
- 我的備份文件存儲在哪裏?
- 我的備份需要保持多久的可用性?
- 我能否恢復我的備份到另外一個K8S集羣?
- 誰有訪問這些備份的權限?
- 誰有權限實施備份?
- 我們能否按照預定的時間計劃自動進行備份?
- 備份需要多長時間?
- 我的備份是安全的嗎?
下面的介紹會逐一回答上面的問題,以及介紹如何在K8S生產環境備份和恢復MySQL。
在K8S上備份MySQL的必要步驟
在我們制定備份和恢復計劃的時候,很重要的一點是不是所有的數據都需要同等級別的保護。在生產環境中,我們需要滿足我們的商業需求和客戶需要的最合適的保護級別。下面我們來了解一下在生產環境中創建備份和恢復的一些必要的步驟。
1. 瞭解誰負責來創建備份
2. 所需RPO(恢復點目標)的級別
3. 確保清晰的知道備份到哪個位置
4. 備份的時間計劃以及備份的留存時間計劃
5. 確保與應用關聯的數據也被正確備份了,從而確保應用的一致性
我們來詳細過一遍備份MySQL的關鍵步驟,包括一些代碼樣例和截圖。
對MySQL進行備份和恢復
在我們備份MySQL之前,我們必須首先正確配置PX-Backup,使它可以訪問集羣。>本篇文章並沒有覆蓋如何安裝PX-Backup,可以參考以前的系列文章,有一篇專門講解如何安裝PX-Backup。在PX-Backup界面裏,選擇“Add Cluster”
接下來需要提供一個集羣名稱,以及爲集羣提供一個Kubeconfig (https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/),以及Portworx的一些信息。注意Kubeconfig控制了對集羣進行訪問的權限類型,對PX-Backup也是這樣。如果我們僅僅對一個命名空間有訪問權限,我們就只能爲這一個命名空間進行備份和恢復。如果你沒有Portworx集羣信息,或者並沒有爲捲來使用Portwrox,這部分可以先留空。
這步完成後,就可以看到集羣已經被添加到主界面了,在集羣那裏就會出現一個綠色的備份圖標,點擊就可以進入備份界面。
如果你的備份圖標不是綠色的,看一下集羣裏運行的是不是Stork 2.4+的版本(https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/stork/#install)>參考備份界面裏面Add Cluster的界面,可以複製下面的命令來爲集羣增加stork。
(正在運行 Portworx)
KBVER=$(kubectl version --short | awk -Fv '/Server Version: /{print $3}') curl -fsL -o stork-spec.yaml "https://install.portworx.com/2.5?kbver=${KBVER}&comp=stork" kubectl apply -f stork-spec.yaml
(沒有運行 Portworx)
curl -fsL -o stork-spec.yaml "https://install.portworx.com/2.5?comp=stork&storkNonPx=true" kubectl apply -f stork-spec.yaml
配置你的備份目標位置
在備份MySQL之前,我們必須創建一個備份目標位置,點擊Cloud Settings,繼續輸入備份目標位置的身份信息等。
關於不同的備份目標位置,這裏有詳細的文檔(https://backup.docs.portworx.com/use-px-backup/credentials/)。一般來說,至少需要創建一個雲賬戶(如AWS,Azure,Google),以及創建一個備份位置(如雲對象存儲的位置)。
當你創建了一個備份位置,你可以選擇之前創建的雲賬戶,輸入相關的信息。
創建一個備份的時間計劃
這步是可選的。
我們需要創建一個備份時間計劃,來明確備份的頻率(以達到RPO的目標),以及保存多少個備份。(注意:如果需要RPO爲零,則需要使用PX-DR)。點擊設定菜單的Schedule Policies,會出現一個界面來幫助你配置備份的時間計劃。
點擊瀏覽欄的Add按鈕,
在這個界面,創建你需要的備份時間計劃。你可以選擇定期、每天、每週、或者每月,然後選擇需要保存多少個備份。在後續對MySQL進行備份的過程中,就可以選擇這個備份時間計劃。
創建應用一致的MySQL備份的前置和後置規則
當系統驗證發現數據已經準備好可以備份了,就可以開始備份了。這就是我們說的應用感知。爲了保持應用的一致性,我們希望在備份前和備份後進行一定的控制。通過PX-Backup,我們可以配置前置和後置規則(https://backup.docs.portworx.com/use-px-backup/rules/),這些規則會通過在一個或多個Pods裏運行命令來達到我們的目標。首先,我們需要理解MySQL是如何存儲狀態的。這會對我們的備份方式和規則有很大的幫助。MySQL服務器管理的信息,都保存在data directory裏,(https://dev.mysql.com/doc/refman/8.0/en/data-directory.html)
這個data directory位於MySQL服務器的文件系統的/var/lib/mysql 目錄裏。在這個目錄裏存儲的文件和數據對於MySQL維持數據一致性非常重要。因此,我們mount K8S持久卷聲明(PVCs),到MySQL鏡像的data directory也非常重要。在K8S裏,volumeMount的配置文件差不多是下面的樣子:
volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql-data
在data directory內,MySQL存儲與系統、性能和客戶數據有關的:數據結構,表,日誌文件、配置、以及數據庫數據。Mount持久卷,使得PX-Backup可以在需要的時候對MySQL的數據進行快照和備份。
MySQL有一個叫做mysqldump的工具,可以專門用來對MySQL做備份。由於PX-Backup可以爲多種數據類型提供數據備份和恢復的抽象,我們可以複製mysqldump的最佳工作方式(https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_add-locks)。例如flush和鎖定日誌和數據庫表,並保存到PX-Backup的前置和後置規則裏。PX-Backup的規則和備份可以跨多個MySQL實例和跨雲來使用,這對於DevOps團隊管理雲環境和多雲環境很有幫助。
MySQL的前置規則
在備份MySQL的時候,推薦方式是把一些特定數據flush到磁盤裏,這樣可以確保備份的一致性。如數據庫表和日誌,就應該被flush。對MySQL而言,另外很重要的一點是鎖定數據庫表,這樣在備份期間,沒有新的I/O請求來增加數據庫記錄,否則MySQL就無法保持一致性。
爲了達到這樣的目標,我們可以在前置規則中部署FLUSH TABLES WITH READ LOCK命令,它會進行下面的操作:
(FLUSH TABLES WITHREAD LOCK)- 關閉所有打開的數據庫表,通過全局化的讀鎖定,來鎖定所有數據庫的所有表。對於文件系統是可以及時進行快照的Veritas或者ZFS來說,這是一個非常便捷的備份方式。
可以使用UNLOCK TABLES來解除鎖定。
由於PX-Backup對K8S裏的持久卷做快照,這會幫助我們完成我們的目標。
在PX-Backup的界面裏,創建規則。
> 注意:我們設定規則在後臺運行,這需要一個WAIT_CMD(https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/create-snapshots/snaps-3d/#step-1-create-rules),來使得規則可以正確的執行和退出。
MySQL的後置規則
由於我們在備份之前,Flush並鎖定了MySQL的數據。那麼在備份完成後,我們必須從全局化的讀鎖定中,解除對數據庫的鎖定。根據MySQL的技術文檔,這是因爲在FLUSH TABLES WITHREAD LOCK操作後,全局化的鎖定並不會自動解鎖。FLUSH LOGS(https://dev.mysql.com/doc/refman/8.0/en/flush.html#flush-logs)也是一個好的操作,它關閉並重新打開服務器正在執行寫入操作的所有日誌文件,並且更新日誌的序列數字。如果用戶需要在備份前後保持一個清晰的日誌的區別,這個操作就很重要。Flushing Logs在我們現在的步驟中並不是必須的,但我們把它加入到後置規則中,以保持操作的完整。
在PX-Backup界面中創建規則。
> 注意: 備份的後置規則不允許在後臺運行,所以我們需要WAIT_CMD(https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/create-snapshots/snaps-3d/#step-1-create-rules)
爲MySQL創建一個備份
現在我們已經完成了配置,我們也已經爲應用創建了規則。我們可以開始備份我們的MySQL了。我們需要進入應用所在集羣的備份界面,選擇我們的應用正在運行所在的命名空間。
在命名空間內,我們可以選擇MySQL相關的標籤,可以僅備份具備標籤的特定的對象。或者在命名空間備份界面中,通過點擊右上角的Backup按鈕備份整個命名空間。
如果你需要備份特定的對象,在跳出的菜單欄中,輸入下面的信息,
- 名稱
- 備份位置
- 選擇現在備份,還是有一個備份的時間計劃
- 提供前置和後置規則
- 可選的備份標籤
信息輸入完成後,點擊創建,
一旦創建完成,備份會進入Pending狀態,然後進入In Progress狀態。這時的備份圖標是下面的樣子。
如果需要了解備份過程的進展,可以選擇菜單欄裏面的Show Details按鈕,這會允許你查看當前的狀態,以及與備份有關的元數據。所有的進展和錯誤信息都會在這個界面顯示出來。
我們之前創建的前置和後置規則的一些狀態信息也會顯示出來。當這些規則在執行的時候,會顯示爲進行中。如果有任何的錯誤,也會在這個界面顯示出來。
當規則執行完成,它會繼續備份卷,信息細節也會變化,下面是一些信息的例子:
一旦備份成功完成,圖標就會顯示成下面的樣子。
如果中間有任何錯誤,圖標就會變成下面的紅色的樣子,在Show Details欄位,會顯示錯誤的信息。
從備份中恢復MySQL
開始恢復,選擇菜單欄裏的Backups,找到你需要恢復的備份,選擇菜單欄裏的Restore。
在下面的界面中,你可以提供恢復的名稱,恢復到的目標集羣,以及其它一些選項,包括:
- 默認恢復
會恢復備份到這個備份原本來自的命名空間。注意是否需要覆蓋現有資源這個選項。
- 定製化恢復
會允許我們提供一個新的命名空間,來恢復備份。注意這個新的命名空間不需要在此之前就已經創建好。
- 覆蓋現有資源
恢復的過程會覆蓋現有的對象。實際操作中這些對象會被刪除並重新創建。
- 恢復Jobs
Jobs通常運行一次就會完成。通常不需要反覆運行這些Jobs – 特別是當我們把備份恢復到該備份原本來自的同一集羣的情況下。但當我們恢復到一個新的集羣或者新的命名空間的時候,就需要再次運行Jobs了。
你會在界面中看到狀態從Pending變成了Success,你可以選擇菜單裏的Show Details,來獲得備份相關的信息。
結論
對於K8S上的應用來說,備份和恢復是非常重要的。PX-Backup使得備份和恢復的過程變得非常簡單。並且有效地保證了數據的一致性。可以訪問Portworx網站獲取更詳細的文檔,或者申請試用。(https://portworx.com/products/px-backup/)