數據持久化

數據持久化

一持久化定義

  將數據從掉電易失的內存放到永久存儲的設備上redis

二爲何須要持久化

  由於全部的數據都在內存上,因此必須得持久化數據庫

一數據持久化分類之 - RDB模式(默認開啓)

(一)默認模式

一、保存真實的數據
二、將服務器包含的全部數據庫數據以二進制文件的形式保存到硬盤裏面
三、默認文件名 :/var/lib/redis/dump.rdb緩存

(二)建立rdb文件的兩種方式

方式一:服務器執行客戶端發送的SAVE或者BGSAVE命令安全

127.0.0.1:6379> SAVE
OK
# 特色
1、執行SAVE命令過程當中,redis服務器將被阻塞,沒法處理客戶端發送的命令請求,在SAVE命令執行完畢後,服務器纔會從新開始處理客戶端發送的命令請求
2、若是RDB文件已經存在,那麼服務器將自動使用新的RDB文件代替舊的RDB文件
# 工做中定時持久化保存一個文件

127.0.0.1:6379> BGSAVE
Background saving started
# 執行過程以下
1、客戶端 發送 BGSAVE 給服務器
2、服務器立刻返回 Background saving started 給客戶端
3、服務器 fork() 子進程作這件事情
4、服務器繼續提供服務
5、子進程建立完RDB文件後再告知Redis服務器

# 配置文件相關操做
/etc/redis/redis.conf
263行: dir /var/lib/redis # 表示rdb文件存放路徑
253行: dbfilename dump.rdb  # 文件名

# 兩個命令比較
SAVE比BGSAVE快,由於須要建立子進程,消耗額外的內存

# 補充:能夠經過查看日誌文件來查看redis都作了哪些操做
# 日誌文件:配置文件中搜索 logfile
logfile /var/log/redis/redis-server.log

方式二:設置配置文件條件知足時自動保存(使用最多)服務器

# 命令行示例
redis>save 300 10
  表示若是距離上一次建立RDB文件已通過去了300秒,而且服務器的全部數據庫總共已經發生了很多於10次修改,那麼自動執行BGSAVE命令
redis>save 60 10000
  表示若是距離上一次建立rdb文件已通過去60秒,而且服務器全部數據庫總共已經發生了很多於10000次修改,那麼執行bgsave命令

# redis配置文件默認
218行: save 900 1
219行: save 300 10
220行: save 60 10000
  1、只要三個條件中的任意一個被知足時,服務器就會自動執行BGSAVE
  二、每次建立RDB文件以後,服務器爲實現自動持久化而設置的時間計數器和次數計數器就會被清零,並從新開始計數,因此多個保存條件的效果不會疊加

三數據持久化分類之 - AOF(AppendOnlyFile,默認未開啓)

(一)特色

1、存儲的是命令,而不是真實數據
2、默認不開啓
# 開啓方式(修改配置文件)
一、/etc/redis/redis.conf
  672行: appendonly yes # 把 no 改成 yes
  676行: appendfilename "appendonly.aof"
2、重啓服務
  sudo /etc/init.d/redis-server restart

(二)RDB缺點

  一、建立RDB文件須要將服務器全部的數據庫的數據都保存起來,這是一個很是消耗資源和時間的操做,因此服務器須要隔一段時間才建立一個新的RDB文件,也就是說,建立RDB文件不能執行的過於頻繁,不然會嚴重影響服務器的性能
  二、可能丟失數據app

(三)AOF持久化原理及優勢

# 原理
   1、每當有修改數據庫的命令被執行時,服務器就會將執行的命令寫入到AOF文件的末尾
   2、由於AOF文件裏面存儲了服務器執行過的全部數據庫修改的命令,因此給定一個AOF文件,服務器只要從新執行一遍AOF文件裏面包含的全部命令,就能夠達到還原數據庫的目的

# 優勢
  用戶能夠根據本身的須要對AOF持久化進行調整,讓Redis在遭遇意外停機時不丟失任何數據,或者只丟失一秒鐘的數據,這比RDB持久化丟失的數據要少的多

(四)安全性問題考慮

# 由於
  雖然服務器執行一個修改數據庫的命令,就會把執行的命令寫入到AOF文件,但這並不意味着AOF文件持久化不會丟失任何數據,在目前常見的操做系統中,執行系統調用write函數,將一些內容寫入到某個文件裏面時,爲了提升效率,系統一般不會直接將內容寫入硬盤裏面,而是將內容放入一個內存緩存區(buffer)裏面,等到緩衝區被填滿時纔將存儲在緩衝區裏面的內容真正寫入到硬盤裏

# 因此
  1、AOF持久化:當一條命令真正的被寫入到硬盤裏面時,這條命令纔不會由於停機而意外丟失
  2、AOF持久化在遭遇停機時丟失命令的數量,取決於命令被寫入到硬盤的時間
  三、越早將命令寫入到硬盤,發生意外停機時丟失的數據就越少,反之亦然

(五)策略 - 配置文件

# 打開配置文件:/etc/redis/redis.conf,找到相關策略以下
1、701行: alwarys
   服務器每寫入一條命令,就將緩衝區裏面的命令寫入到硬盤裏面,服務器就算意外停機,也不會丟失任何已經成功執行的命令數據
二、702行: everysec(# 默認)
   服務器每一秒將緩衝區裏面的命令寫入到硬盤裏面,這種模式下,服務器即便遭遇意外停機,最多隻丟失1秒的數據
3、703行: no
   服務器不主動將命令寫入硬盤,由操做系統決定什麼時候將緩衝區裏面的命令寫入到硬盤裏面,丟失命令數量不肯定

# 運行速度比較
always:速度慢
everysec和no都很快,默認值爲everysec

(六)AOF文件中是否會產生不少的冗餘命令?函數

爲了讓AOF文件的大小控制在合理範圍,避免胡亂增加,redis提供了AOF重寫功能,經過這個功能,服務器能夠產生一個新的AOF文件
  -- 新的AOF文件記錄的數據庫數據和起因的AOF文件記錄的數據庫數據徹底同樣
  -- 新的AOF文件會使用盡量少的命令來記錄數據庫數據,所以新的AOF文件的說起一般會小不少
  -- AOF重寫期間,服務器不會被阻塞,能夠正常處理客戶端發送的命令請求

示例:性能

原有AOF文件 重寫後的AOF文件
select 0 SELECT 0
sadd myset peiqi SADD myset peiqi qiaozhi danni lingyang
sadd myset qiaozhi
sadd myset danni
sadd myset lingyang
INCR number  
INCR number  
DEL number  
SET message 'hello world'   SET msg 'hello tarena'
SET message 'hello tarena'
RPUSH mylist 1 2 3  RPUSH mylist 2 3 5  
RPUSH mylist 5
LPOP mylist

(七)文件重寫方法觸發

1、客戶端向服務器發送BGREWRITEAOF命令
   127.0.0.1:6379> BGREWRITEAOF
   Background append only file rewriting started

2、修改配置文件讓服務器自動執行BGREWRITEAOF命令
  auto-aof-rewrite-percentage 100
  auto-aof-rewrite-min-size 64mb
  # 解釋
    一、只有當AOF文件的增量大於100%時才進行重寫,也就是大一倍的時候才觸發
        # 第一次重寫新增:64M
        # 第二次重寫新增:128M
        # 第三次重寫新增:256M(新增128M)

(八)RDB和AOF持久化對比

RDB持久化 AOF持久化
全量備份,一次保存整個數據庫 增量備份,一次保存一個修改數據庫的命令
保存的間隔較長 保存的間隔默認爲一秒鐘
數據還原速度快 數據還原速度通常,冗餘命令多,還原速度慢
執行SAVE命令時會阻塞服務器,但手動或者自動觸發的BGSAVE不會阻塞服務器 不管是平時仍是進行AOF重寫時,都不會阻塞服務器
更適合數據備份 更適合用來保存數據,一般意義上的數據持久化,在appendfsync always模式下運行

# 用redis用來存儲真正數據,每一條都不能丟失,都要用always,有的作緩存,有的保存真數據,我能夠開多個redis服務,不一樣業務使用不一樣的持久化,新浪每一個服務器上有4個redis服務,整個業務中有上千個redis服務,分不一樣的業務,每一個持久化的級別都是不同的。ui

(九)數據回覆

既有dump.rdb,又有appendonly.aof,恢復時找誰?spa

  先找appendonly.aof

(十)配置文件經常使用配置總結

# 設置密碼
  1、requirepass password
# 開啓遠程鏈接
  二、bind 127.0.0.1 ::1 註釋掉
  三、protected-mode no  把默認的yes改成no# rdb持久化-默認配置
  四、dir /var/lib/redis
  5、dbfilename 'dump.rdb'
# rdb持久化-自動觸發
  save 900 1
  save 300 10
  save 60 10000
# aof持久化開啓
  appendonly yes
  appendfilename "appendonly.aof"
# aof持久化策略
  appendfsync alwarys  
  appendfsync everysec   #默認
  appendfsync no
# aof重寫觸發
  auto-aof-rewrite-percentage 100  #超過百分比觸發
  auto-aof-rewrite-min-size 64mb   #超過大小

(十一)Redis相關文件存放路徑 

1.配置文件: /etc/redis/redis.conf

2.備份文件: /var/lib/redis/*.rdb|*.aof

3.日誌文件: /var/log/redis/redis-server.log

4.啓動文件: /etc/init.d/redis-server

 # /etc/下存放配置文件

# /etc/init.d/下存放服務啓動文件