備份和還原 Redis 數據
備份和恢復數據是管理任何數據庫系統(包括 Redis)的關鍵方面。數據丟失可能是由于硬件故障、軟件錯誤、意外刪除甚至惡意攻擊而發生的。因此,擁有強大的備份和恢復策略對于確保數據持久性和業務連續性至關重要。本課將介紹備份和恢復 Redis 數據的方法,重點介紹上一課中介紹的 RDB 快照和 AOF 文件。我們將探討創建備份、驗證備份完整性以及從備份中恢復數據所涉及的實際步驟。
了解 Redis 中的備份策略
Redis 提供兩種主要的持久性機制:RDB(Redis 數據庫)快照和 AOF(僅追加文件)。這些機制還用作備份和還原數據的基礎。選擇正確的備份策略取決于您對數據持久性和恢復時間的特定要求。
用于備份的 RDB 快照
RDB 快照是 Redis 數據的時間點表示形式。它們是緊湊的二進制文件,可以輕松傳輸和存儲。
- RDB 備份的工作原理: 當 Redis 配置為使用 RDB 持久性時,它會定期將數據的快照保存到磁盤。此快照是 Redis 數據庫在特定時刻的完整副本。
- 備份過程: 要使用 RDB 備份 Redis 數據,您只需將 RDB 文件復制到安全位置即可。這可以手動或通過自動化腳本完成。
- 恢復過程: 要從 RDB 備份還原,請將當前 RDB 文件替換為備份文件,然后重新啟動 Redis 服務器。然后,Redis 會將 RDB 文件中的數據加載到內存中。
用于備份的 AOF
AOF 持久性方法記錄服務器收到的每個寫入作。與 RDB 相比,這提供了一種更持久的持久性形式。
- AOF 備份的工作原理: AOF 文件包含修改了 Redis 數據庫的所有命令的日志。
- 備份過程: 與 RDB 類似,備份 AOF 文件涉及將其復制到安全位置。
- 恢復過程: 要從 AOF 備份還原,請將當前 AOF 文件替換為備份文件,然后重新啟動 Redis 服務器。然后,Redis 將重放 AOF 文件中的所有命令以重建數據庫。
在 RDB 和 AOF 之間進行備份
在 RDB 和 AOF 之間進行備份的選擇取決于您的特定需求:
特征 | RDB | AOF |
---|---|---|
數據持久性 | 下限 (時間點快照) | 更高(每個寫入作) |
備份大小 | 較小 | 較大 |
恢復時間 | 更快 | 較慢(需要重放所有命令) |
復雜性 | 簡單 | 更復雜(尤其是重寫) |
- RDB 適用于: 一些數據丟失是可以接受的,并且快速恢復很重要的應用程序。
- AOF 適用于: 數據持久性至關重要且您無法承受丟失任何數據的應用程序。
在實踐中,許多 Redis 部署結合使用 RDB 和 AOF 來最大程度地保護數據。RDB 提供了一種從最近的快照還原的快速方法,而 AOF 可確保您可以恢復所有數據,直到最后一次寫入作。
創建 Redis 備份
讓我們探討一下使用 RDB 和 AOF 創建備份所涉及的實際步驟。
備份 RDB 快照
-
找到 RDB 文件: RDB 文件的位置在
redis.conf
文件中使用dir
和dbfilename
指令指定。默認情況下,RDB 文件名為dump.rdb
,位于 Redis 工作目錄中。 -
啟動備份: 您可以通過多種方式觸發 RDB 快照:
-
使用
SAVE
命令: 此命令將數據庫同步保存到磁盤。它會阻止 Redis 服務器,直到快照完成,因此通常不建議將其用于生產環境。SAVE
-
使用
BGSAVE
命令: 此命令在后臺異步將數據庫保存到磁盤。它不會阻止 Redis 服務器,允許它繼續為請求提供服務。BGSAVE
-
自動快照: Redis 可以配置為根據指定的保存間隔自動創建快照。這些間隔在
redis.conf
文件中使用save
指令定義。例如:save 900 1 # Save the DB if after 900 sec (15 min) if at least 1 key changed save 300 10 # Save the DB if after 300 sec (5 min) if at least 10 keys changed save 60 10000 # Save the DB if after 60 sec if at least 10000 keys changed
-
-
復制 RDB 文件: 創建 RDB 快照后,將
dump.rdb
文件復制到安全備份位置。這可以是本地目錄、網絡共享或云存儲服務。cp /var/lib/redis/dump.rdb /mnt/backup/redis/dump_$(date +%Y%m%d_%H%M%S).rdb
此命令將
dump.rdb
文件復制到/mnt/backup/redis
目錄,并使用時間戳重命名該文件,以便為每個快照創建唯一的備份文件。
備份 AOF 文件
-
找到 AOF 文件: AOF 文件的位置在
redis.conf
文件中使用dir
和appendfilename
指令指定。默認情況下,AOF 文件名為appendonly.aof
,位于 Redis 工作目錄中。 -
確保 AOF 已啟用: 通過將
appendonly
指令設置為yes
,驗證是否在redis.conf
文件中啟用了 AOF。appendonly yes
-
復制 AOF 文件: 與 RDB 類似,將
appendonly.aof
文件復制到安全的備份位置。cp /var/lib/redis/appendonly.aof /mnt/backup/redis/appendonly_$(date +%Y%m%d_%H%M%S).aof
自動備份
手動創建備份可能很繁瑣且容易出錯。最好使用腳本或工具自動執行備份過程。
-
Cron 工作: 您可以使用 cron 作業來安排 Redis 數據的定期備份。創建一個腳本,用于執行
BGSAVE
命令(如果使用 RDB)并將 RDB 或 AOF 文件復制到備份位置。cron 作業條目示例:
0 2 * * * /path/to/redis_backup.sh
此 cron 作業在每天凌晨 2:00 運行
redis_backup.sh
腳本。 -
Redis 企業版: Redis Enterprise 提供內置的備份和還原功能,包括自動備份、時間點恢復以及與云存儲服務的集成。
還原 Redis 數據
還原 Redis 數據包括將當前 RDB 或 AOF 文件替換為備份文件,然后重新啟動 Redis 服務器。
從 RDB 快照還原
-
停止 Redis 服務器: 在從 RDB 快照還原之前,請停止 Redis 服務器以防止數據損壞。
redis-cli shutdown
-
替換 RDB 文件: 將備份 RDB 文件復制到 Redis 工作目錄,替換現有的
dump.rdb
文件。cp /mnt/backup/redis/dump_20231027_100000.rdb /var/lib/redis/dump.rdb
-
調整文件所有權: 確保 Redis 用戶對還原的 RDB 文件具有正確的所有權和權限。
chown redis:redis /var/lib/redis/dump.rdb
-
啟動 Redis 服務器: 啟動 Redis 服務器。它將自動從還原的 RDB 文件中加載數據。
redis-server /etc/redis/redis.conf
從 AOF 文件恢復
-
停止 Redis 服務器: 與 RDB 一樣,在從 AOF 文件還原之前停止 Redis 服務器。
redis-cli shutdown
-
替換 AOF 文件: 將備份 AOF 文件復制到 Redis 工作目錄,替換現有的
appendonly.aof
文件。cp /mnt/backup/redis/appendonly_20231027_100000.aof /var/lib/redis/appendonly.aof
-
調整文件所有權: 確保 Redis 用戶對還原的 AOF 文件具有正確的所有權和權限。
chown redis:redis /var/lib/redis/appendonly.aof
-
配置 AOF: 確保在
redis.conf
文件中設置了appendonly yes
。 -
啟動 Redis 服務器: 啟動 Redis 服務器。它將重放還原的 AOF 文件中的所有命令以重建數據庫。
redis-server /etc/redis/redis.conf
處理 AOF 損壞
在某些情況下,AOF 文件可能會因服務器意外關閉或其他問題而損壞。Redis 提供了一個名為 redis-check-aof
的工具來修復損壞的 AOF 文件。
-
運行
redis-check-aof
: 使用redis-check-aof
工具分析和修復 AOF 文件。redis-check-aof --fix /var/lib/redis/appendonly.aof
此命令嘗試修復 AOF 文件中的任何不一致或錯誤。
-
重新啟動 Redis 服務器: 修復 AOF 文件后,重啟 Redis 服務器加載數據。
優先考慮 AOF 而不是 RDB
如果 RDB 和 AOF 文件都存在,Redis 將默認優先從 AOF 文件加載數據,因為它代表數據庫的最新狀態。如果要強制 Redis 從 RDB 文件加載,則可以在啟動服務器之前臨時重命名或刪除 AOF 文件。
驗證備份完整性
驗證備份的完整性以確保它們有效并可用于成功還原數據,這一點至關重要。
RDB 完整性檢查
雖然沒有直接工具來“檢查”RDB 完整性,但您可以通過以下方式間接驗證它:
- 還原到暫存環境: 將 RDB 文件還原到單獨的暫存環境,并驗證數據是否一致且完整。
- 比較鍵數: 在備份之前和之后,使用
DBSIZE
命令記錄數據庫中的鍵數。還原后,將密鑰計數與記錄的值進行比較。重大差異可能表示數據損壞。
AOF 完整性檢查
如前所述,redis-check-aof
工具可用于驗證和修復 AOF 文件。
-
在 Check 模式下運行
redis-check-aof
: 使用不帶--fix
選項的redis-check-aof
工具分析 AOF 文件是否有錯誤,而無需修改它。redis-check-aof /var/lib/redis/appendonly.aof
此命令將報告在 AOF 文件中發現的任何不一致或錯誤。
一般備份驗證做法
- 定期測試: 計劃定期測試從備份中恢復,以確保該過程正常工作并且恢復的數據有效。
- 監測: 監視備份過程是否存在錯誤或故障。設置警報以通知您任何問題。
- 冗余: 將備份存儲在多個位置,以防止因硬件故障或其他災難而丟失數據。
實際應用
考慮一個使用 Redis 存儲會話數據、購物車信息和產品目錄的電子商務平臺。該平臺的流量很高,并依賴 Redis 進行快速數據訪問。
- 備份策略: 該平臺使用 RDB 和 AOF 實施混合備份策略。RDB 快照每天凌晨 2:00 拍攝,以便在發生重大故障時提供快速恢復點。AOF 每 sec(
每秒)啟用 appendfsync
,以確保在服務器崩潰時將數據丟失降至最低。 - 備份自動化: cron 作業配置為自動觸發
BGSAVE
命令并將 RDB 和 AOF 文件復制到云存儲服務。備份文件使用時間戳命名,以維護備份的歷史記錄。 - 恢復過程: 如果發生數據丟失事件,平臺的運營團隊會遵循記錄在案的還原程序。他們首先嘗試從最新的 AOF 文件還原。如果 AOF 文件已損壞或不可用,它們將從最新的 RDB 快照中恢復。
- 驗證: 每次還原后,運營團隊都會通過比較密鑰計數并手動檢查關鍵數據元素(如用戶會話和購物車)來驗證還原數據的完整性。