1. 程式人生 > >Redis-企業級資料備份方案

Redis-企業級資料備份方案

一、企業級的持久化配置策略

1、首先是RDB的生成策略,這點用Redis預設的配置即可,比如:save 60 10000。但是如果我們希望儘可能確保說,RDB最多丟1分鐘的資料,那麼儘量就是每隔1分鐘都生成一個快照,比如設定成:save 60 1000。個人覺得預設的配置即可,當然我們也可以根據自己的應用和業務的資料量去決定如何調整這個引數。

2、AOF持久化一定要開啟,fsync的策略為everysec也沒有多大問題。可能我們僅僅需要做些調整的是下面兩個引數:

auto-aof-rewrite-percentage 100: 就是當前AOF大小膨脹到超過上次100%,上次的兩倍
auto-aof-rewrite-min-size 64mb: 根據你的資料量來定,比如改成:16mb,32mb

二、企業級的資料備份方案

RDB非常適合做冷備,每次生成之後,就不會再有修改了。企業中的資料備份方案通常是:

(1)寫crontab定時排程指令碼去做資料備份。

crontab -e

0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh

(2)每小時都copy一份rdb的備份,到一個目錄中去,僅僅保留最近48小時的備份。

#### redis_rdb_copy_hourly.sh

#!/bin/sh 

cur_date=`date +%Y%m%d%k`
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%k`
rm -rf /usr/local/redis/snapshotting/$del_date

(3)每天都保留一份當日的rdb的備份,到一個目錄中去,僅僅保留最近1個月的備份。

#### redis_rdb_copy_daily.sh

#!/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

(4)每天晚上將當前伺服器上所有的資料備份,傳送一份到遠端的雲服務上去。

三、企業級的資料恢復方案

以下分為5種場景(恢復時,需要注意的是:當同時開啟RDB和AOF時,會使用AOF恢復資料):

(1)如果是redis程序掛掉,那麼重啟redis程序即可,直接基於AOF日誌檔案恢復資料。

(2)如果是redis程序所在機器掛掉,那麼重啟機器後,嘗試重啟redis程序,嘗試直接基於AOF日誌檔案進行資料恢復。

AOF沒有破損,也是可以直接基於AOF恢復的。

AOF append-only,順序寫入,如果AOF檔案破損,那麼用redis-check-aof fix。

(3)如果redis當前最新的AOF和RDB檔案出現了丟失/損壞,那麼可以嘗試基於該機器上當前的某個最新的RDB資料副本進行資料恢復。

(4)如果當前機器上的所有RDB檔案全部損壞,那麼從遠端的雲服務上拉取最新的RDB快照回來恢復資料。

(5)如果是發現有重大的資料錯誤,比如某個小時上線的程式一下子將資料全部汙染了,資料全錯了,那麼可以選擇某個更早的時間點,對資料進行恢復。

比如在某個時間點發現程式碼有bug,導致程式碼生成的所有的快取資料,寫入redis全部錯了。那麼可以找到一份該時間點前的最近一分rdb的冷備,然後按照上面的步驟,去恢復資料。