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