天天看點

redis 資料備份持久化方案

原文: redis 資料備份持久化方案 本文連結: http://www.cnblogs.com/zhenghongxin/p/9050219.html

  • 使用兩種備份方案

備份方案選擇RDB和AOF同時進行備份,必須打開AOF的持久化機制,除非能接受在故障環境下丢失幾分鐘的資料。

在redis重新開機的時候,是優先通過AOF進行資料恢複的,因為AOF資料比較完整。

  • RDB的生成政策

要修改的是該條指令:

save 60 10000      

該條指令是60秒内,如果有1萬條指令執行,那麼就進行快照備份。這個值略大,可以根據自己的業務量而定,可以調小至1000。但也同時意味着,在一分鐘内,如果指令執

行了999條,且在最後一秒redis挂掉,該分鐘内的指令将會全部丢失。

注意不要用:redis-cli SHUTDOWN
這樣的方式去測試,這是一種安全退出的模式,redis會安全生成dump.rdb      

它的工作流程:

(1)redis根據配置自己嘗試去生成rdb快照檔案
(2)fork一個子程序出來
(3)子程序嘗試将資料dump到臨時的rdb快照檔案中
(4)完成rdb快照檔案的生成之後,就替換之前的舊的快照檔案dump.rdb,每次生成一個新的快照,都會覆寫之前的老快照      
  • AOF的生成政策

當AOF開啟之後,redis每次接收到一條寫指令,就會寫入日志檔案中,先寫入系統的 os cache中,然後隔一段時間再fsync一下。

 fsync的政策有三種:

always: 每次寫入一條資料,立即将這個資料對應的寫日志fsync到磁盤上去,性能非常非常差,吞吐量很低; 
     如果說確定說redis裡的資料一條都不丢,那就隻能這樣了

everysec: 每秒将os cache中的資料fsync到磁盤,這個最常用的,生産環境一般都這麼配置,性能很高,QPS還是可以上萬的

no:就是直接寫入os cache就不管了,讓linux自帶的機制去将資料刷入磁盤,這樣很不可控      

是以我們要配置為everysec。

 接着配置兩條指令:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb      

redis 2.4之前,還需要手動,開發一些定時任務腳本,通過BGREWRITEAOF指令去執行AOF rewrite,但是redis 2.4之後,會自動進行rewrite操作

也就是說在上一次AOF rewrite之後,日志大小是128mb,接着再往裡面寫日志,當總日志大小增長的比例,超過了之前的100%,即達到256mb後,就會觸發rewrite操作。

注意,此時還要跟 auto-aof-rewrite-min-size 比較大小,256M 大于 64m,可以觸發rewrite操作。這兩條指令,可以根據業務進行調節大小,或者保持預設值

  •  定時任務備份方案(重要)

并不是說讓redis自動進行持久化備份就可以的,而是要另開腳本,進行更細緻的備份。

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

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

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`  # 48小時前的目錄檔案名
rm -rf /usr/local/redis/snapshotting/$del_date # 删除48小時前的目錄      

 2 )每天copy一次備份

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

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  //備份cp

del_date=`date -d -1month +%Y%m%d`  #僅保留近一個月的資料
rm -rf /usr/local/redis/snapshotting/$del_date #删除      

3)每天一次将所有資料上傳一次到遠端的雲伺服器上去

 原理跟第2點一樣,隻是不是用cp,而是用scp或rsync等指令将檔案備份到遠端安全伺服器

 以上隻給了rdb的備份,aof的備份腳本基本一緻。

  •  資料恢複方案(重要)

 (1)如果是redis程序挂掉,那麼重新開機redis程序即可,直接基于AOF日志檔案恢複資料

 (2)如果是redis程序所在機器挂掉,那麼重新開機機器後,嘗試重新開機redis程序,嘗試直接基于AOF日志檔案進行資料恢複

   如果AOF沒有破損,可以直接基于AOF恢複的

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

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

     找到RDB最新的一份備份,小時級的備份可以了,小時級的肯定是最新的,copy到redis裡面去,就可以恢複到某一個小時的資料 

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

恢複的過程:

(1)優先用appendonly.aof去恢複資料

(2)停止redis,關閉aof (為什麼要關閉?如果不關閉,啟動redis後,redis會生成一份新的可能為空的aof強行覆寫目錄下的aof,導緻恢複失敗)

(3)拷貝備份檔案,重新開機redis

(4)指令行修改redis配置,開啟aof (redis config set )

繼續閱讀