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