如何在K8S上備份和恢復MySQL

2021-01-09 存儲在線

越來越多的生產系統和關鍵應用運行在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了。

你會在界面中看到狀態從Pending變成了Success,你可以選擇菜單裡的Show Details,來獲得備份相關的信息。

結論

對於K8S上的應用來說,備份和恢復是非常重要的。PX-Backup使得備份和恢復的過程變得非常簡單。並且有效地保證了數據的一致性。可以訪問Portworx網站獲取更詳細的文檔,或者申請試用。(https://portworx.com/products/px-backup/)

相關焦點

  • MySQL數據的備份和恢復
    目錄MySQL數據的備份和恢復MySQL完全備份(1) 物理冷備份與恢復(2) mysqldump備份與恢復(3) MySQL物理冷備份及恢復5. mysqldump備份資料庫(1) mysqldump命令對單個庫進行完全備份(2) 單庫備份的示例(3) mysqldump命令對多個庫進行完全備份
  • MySQL不同存儲引擎的數據備份與恢復
    【IT168 評論】數據備份的目的很直接也很簡單,就是為了避免因不可預測、偶然的事件而導致的慘重損失,所以數據越重要、變化越頻繁,就越要進行數據備份。在之前的幾篇文章中,我們以MySQL為例對數據備份進行了粗略的解讀,本文我們依然以MySQL為例,講講面對不同的存儲引擎如何做數據備份與恢復。
  • 實戰 | MySQL數據備份、恢復
    當有增量備份需求時,採用xtrabackup進行增量備份,以降低磁碟空間的消耗。為了能更靈活的將數據恢復到指定的時間點,使用 binlog 作為增量備份。1.2.數據恢復方式1.3.1. 資料庫或者數據表誤刪除情況這種情況幾乎不可見,生產環境中一般用戶是沒有drop權限的,不會對數據表和資料庫產生破壞。
  • mysql備份與恢復:完全,增量備份,基於位置點,時間點恢復
    理論介紹數據備份的重要性資料庫備份的分類常見的備份方法MySQL完全備份資料庫完全備份分類資料庫備份與恢復MySQL資料庫完全備份與恢復mysqldump備份與恢復MySQL資料庫增量備份恢復基於位置的恢復基於時間恢復
  • MySQL MyISAM和InNodb備份與恢復技巧
    備份時最好也備份my.cnf或my.ini,這樣可以保存你以前的配置參數。2. MyISAM 表備份/恢復策略2.1. 文件熱備份2.1.1. 拷貝文件因為MySQL表保存為文件方式,很容易備份。要想保持備份的一致性,對相關表執行LOCK TABLES操作,然後對表執行FLUSH TABLES。
  • mysql備份及恢復常用命令
    # ---------------------------------------備份指定表----------------------------------------------------mysqldump -uroot -p"password" 資料庫 表1 表2 > /data/backup/order.sql.0526# ----
  • MySQL數據備份及恢復教程 巧用xtrabackup工具備份恢復
    >  註:遠程備份的目錄需要有寫入權限另外,和備份備份一樣,如果存在大表或超大事務運行時不建議使用/tmp目錄3. 恢復4.1  基於全量備份的恢復4.1.1 回放日誌備份後的文件不能直接用作恢復,還需要先使用apply-log 做前滾和回滾 /root/xtrabackup/bin/innobackupex  --defaults-file=.
  • 《MySQL 入門教程》第 06 篇 備份與恢復
    另外,在升級 MySQL 之前進行備份也是一種必要的安全措施;而且備份還可以用於在另一臺伺服器上恢復 MySQL 環境,或者創建複製結構中的從節點。MySQL 支持各種備份方法和策略,可以根據需求進行選擇。
  • 一種MySQL備份恢復流程的設計思路
    binlog server的方式,那麼如何快速恢復就成為了我們需要思考的問題恢復需求根據我以往的一些經驗來說,通常需要從備份恢復數據的場景有如下幾種:被誤刪庫了被誤刪表了,類型為TRUNCATE或者DROP被誤刪列了,類型為
  • 如何備份和恢復wordpress網站數據
    一旦網站被黑客攻擊插入病毒代碼或者伺服器宕機無法恢復數據,到時候哭都來不及。所以定期備份網站數據非常重要非常重要非常重要,重要的事情說三遍。網站數據主要包含兩個方面:資料庫內容,網站文件。今天本文主要說一下wordpress網站如何備份和恢復數據。對,備份網站數據很重要,驗證備份數據的完整性並恢復網站數據同樣重要。如果備份數據無法正常恢復網站到原來的樣子,相當於沒備份不是。
  • 做好mysql運維,必須熟練掌握備份和恢復,實戰一次不行多來幾次
    2、確定使用全備份還是增量備份。全備份的優點是備份保持最新備份,恢復的時候可以花費更少的時間;缺點是如果數據量大,將會花費很多的時間,並對系統造成較長時間的壓力。增量備份相反,只需要備份每天的增量日誌,備份時間少,對負載壓力也小;缺點就是恢復的時候需要全備份加上次備份到故障前的所有日誌,恢復時間長一些。
  • MySQL資料庫的mysqldump完全備份、binlog的增量備份與還原
    MySQL資料庫的mysqldump完全備份、binlog的增量備份與還原一、 備份的目的:做災難性恢復:對損壞的書籍進行恢復和還原需求改變:因需求改變而需要把數據還原到改變以前>恢復數據要在多長時間內完成;恢復的時候是否需要持續提供服務;恢復的對象:是整個庫、多個表,還是單個庫、單個表。
  • 連延遲從庫都用不上了,MySQL備份還能恢復嗎?
    背景首先交代一下背景,由於某些因素的限制,我們公司目前的備份策略採用的是隔天全備的方案,增量備份則使用的是binlog server的方式,那麼如何快速恢復就成為了我們需要思考的問題。假設你的備份在遠程的機器上,那麼你可能需要做如下幾步動作來進行全備恢復:將備份scp或者rsync到目標實例機器上;假設備份文件是壓縮的情況下,需要解壓;解壓完成後,需要apply redo log;
  • mysqldump簡單備份
    檢查備份可用性備份可用性檢查、備份空間檢查定期的恢復演練對於資料庫的恢復演練,需要過半年或每月進行測試恢復演習數據恢復通過現有的備份,將資料庫恢復到故障前的狀態,配合binlog日誌數據遷移同資料庫遷移是最簡單的。
  • MySQL 數據恢復
    對於 MySQL 數據的備份, 主要有兩種: 全量備份和增量備份.全量備份: 將資料庫中的所有數據全部進行備份. 相當於複製粘貼的步驟. 全量備份要保存所有數據, 佔用空間大, 必然不可能精確到每一秒.增量備份: 對資料庫的所有變動進行備份.
  • MySQL資料庫遭到攻擊篡改---使用備份和binlog進行數據恢復
    是否有備份數據,是否能夠進行恢復並加固。本文來自資料庫技術專家張正,主要描述了MySQL遭到攻擊篡改數據,利用從庫的備份和主庫的Binlog進行不完全恢復。 以下是作者原文:一、發現問題今天是2014-09-26,開發大清早就說昨晚資料庫遭到了攻擊。資料庫中某文章表的文章內容欄位遭到篡改,全部改成了同一篇文章。
  • 使用docker備份mysql資料庫
    所以,資料庫備份在生產上是必不可少的,下面我們來了解下在docker環境下mysql資料庫的備份是如何做的。一、資料庫容器假設我們在伺服器上部署了一個mysql docker容器實例,容器名為mysql,如下圖
  • MySQL資料庫誤刪恢復
    這世界上有後悔藥-www.houhuiyao.cc 後悔藥數據恢復 站長語前面介紹了MySQL資料庫在使用InnoDB引擎時,如果誤刪了數據表,在共享表空間MySQL數據表InnoDB引擎表誤刪恢復(共享表空間ibdata1)和獨立表空間MySQL數據表InnoDB引擎表誤刪恢復
  • mysql學習詳記四&&資料庫的備份及恢復&&mysql多表設計&外鍵約束
    一、mysql資料庫的備份及恢復備份資料庫表中的數據cmd> mysqldump -u 用戶名 -p 資料庫名 > 文件名.sqlmysqldump -uroot -p db_name > d:/1.sql恢復資料庫(注意:如果資料庫已經刪除,先創建資料庫再恢復數據。)
  • 面試官:mysql主從宕機如何恢復?
    mysql主從宕機恢復步驟在生產環境中經常會出現slave出現錯誤,從而發生主從同步故障,此時就需要人工幹預了。以下是小生整理出的一個回復思路,歡迎大佬指導,分享更好的方法。宕機恢復分為幾種情況:1.從庫數據一致性要求低2.從庫數據一致性要求高從庫數據要求一致性低:這種情況比較好解決,由於對數據一致性要求比較低,我們可以先把slave起來從而達到熱備份的效果(因為之前有做過全量備份和增量備份,所以不用擔心數據丟失)。以目前master對應的pos作為slave起始的pos。