如何在K8S上備份和恢復MySQLhtml
愈來愈多的生產系統和關鍵應用運行在K8S上。在生產系統運行有狀態應用,並非一件容易的事情,它須要咱們仔細的計劃並部署。咱們以前有一篇文章專門介紹如何在K8S上運行高可用的MySQL。此次咱們來介紹下如何備份和恢復MySQL。當咱們在生產環境中備份和恢復MySQL,咱們須要思考下面的問題:mysql
咱們須要備份哪些K8S對象?sql
我如何備份個人持久卷(PVs)?數據庫
個人備份文件存儲在哪裏?安全
個人備份須要保持多久的可用性?服務器
我可否恢復個人備份到另一個K8S集羣?數據結構
誰有訪問這些備份的權限?app
誰有權限實施備份?curl
咱們可否按照預約的時間計劃自動進行備份?ide
備份須要多長時間?
個人備份是安全的嗎?
下面的介紹會逐一回答上面的問題,以及介紹如何在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/)