真槍實彈!Redis 「冷備」讓您睡個安穩覺zZ
大家好,我是悟空呀。
Redis 的 RDB 持久化方案,相信大家都有所了解,但是對于企業來說,如果只是持久化了一個 RDB 文件,不足以應付生產級別的事故。
通常的方案就是對 RDB 進行多個備份,今天帶大家來真槍實彈操作下 RDB 的冷備,以及通過 RDB 進行數據恢復。學會了這招,今晚可以好好睡覺了嗎?
企業級冷備方案
Redis RDB 持久化是非常適合做企業級的冷備方案的,這里的冷備可以理解為將已生成的文件拷貝到其他機器或者云服務器上。
RDB 適合做冷備的原因如下:
RDB 文件生成后,改變的頻率低,除非頻繁觸發檢查點導致重新生成。
RDB 是 Redis 內存快照,比 AOF 日志恢復速度快。
RDB 的生成策略可以自行配置,而且可以配置多項,可以根據系統的使用場景和實際情況進行設置。
備份方案
1、用 Linux 自帶的 crontab 命令執行定時任務,調用數據備份腳本。
2、每小時備份一份一次當前最新的 RDB 快照文件到指定目錄,只保留最近 48 小時的備份。
3、每天備份一份當前最新的 RDB 快照文件到指定目錄,只保留最近一個月的 備份。
4、每天晚上將備份文件都發送遠程的云服務器上。
流程圖如下所示:
每小時備份
首先需要編寫一個腳本,專門用來做數據備份,創建腳本的命令如下:
- mkdir /usr/local/redis
- mkdir /usr/local/redis/copy
- vi /usr/local/redis/copy/redis_rdb_copy_hourly.sh
- mkdir /usr/local/redis/snapshotting
- chmod 777 /usr/local/redis
然后編寫這個腳本文件:
- #!/bin/sh
- cur_date=`date +%Y%m%d%H`
- rm -rf /usr/local/redis/snapshotting/$cur_date
- mkdir /usr/local/redis/snapshotting/$cur_date
- cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date
- del_date=`date -d -48hour +%Y%m%d`
- rm -rf /usr/local/redis/snapshotting/$del_date
腳本解釋:
- cur_data 代表當前時間,精確到小時,比如 2021080616。
- 刪除當前小時的快照文件。
- 創建當前小時的備份文件,文件為空的。
- 拷貝當前的快照文件到上一步創建的空的備份文件中。
- del_date 代表 48 小時以前的時間,精確到小時,比如 2021080416。
- 刪除 48 小時以前的備份文件。
設置定時任務,每個小時的 0 分跑一次腳本:
- crontab -e
- 0 * * * * sh /usr/local.redis/copy/redis_rdb_copy_hourly.sh
因為要等到下一個小時的 0 點,所以就手動運行腳本來測試:
- cd /usr/local/redis/copy
- ./redis_rdb_copy_hourly.sh
會在 snapshotting 文件夾創建一個目錄:2021080809,表示這是 2021-08-08 09 時的備份文件夾(注意這個時間是 UTC 時間)。這個目錄里面還會有一個 dump.rdb 文件。如下圖所示:
每天備份
和每小時備份類似,先創建一個每天備份一次的腳本:
- vi /usr/local/redis/copy/redis_rdb_copy_daily.sh
- chomd 777 *
編寫腳本:
- #!/bin/sh
- cur_date=`date +%Y%m%d`
- rm -rf /usr/local/redis/snapshotting/$cur_date
- mkdir /usr/local/redis/snapshotting/$cur_date
- cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date
- del_date=`date -d -1month +%Y%m%d`
- rm -rf /usr/local/redis/snapshotting/$del_date
創建每天備份一次的定時任務:
- crontab -e
- 0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh
手動執行備份腳本:
- cd /usr/local/redis/copy
- ./redis_rdb_copy_daily.sh
會在 snapshotting 文件夾創建一個目錄:20210808,表示這是今天 2021-08-08 的備份文件夾(注意這個時間是 UTC 時間)。這個目錄里面還會有一個 dump.rdb 文件。如下圖所示:
另外這些備份建議都上傳到云服務器上,多個地方備份增加一份安全感。(云服務同步的后續再介紹。)
今晚就可以睡個安穩覺了~
從備份文件中恢復
假設一種場景:幾個小時前上線的程序把 Redis 的數據都污染了,數據錯了,該怎么辦?
可以選擇某個更早的時間點的備份文件進行恢復。
恢復的流程
- 停止 Redis,暫時關閉 AOF 的持久化配置。
- 刪除 AOF 日志文件和 RDB 快照文件。
- 拷貝 RDB 快照文件到 Redis 的 RDB 文件加載目錄。
- 重啟 Redis,確認數據恢復成功。
- 熱修改 Redis 的 AOF 持久化配置,Redis 會將內存中的數據寫入到 AOF 文件中。
- 再次停止 Redis,手動修改配置文件,打開 AOF 持久化,防止熱修改不生效。
- 再次重啟 Redis。
本文轉載自微信公眾號「悟空聊架構」,可以通過以下二維碼關注。轉載本文請聯系悟空聊架構公眾號。