首頁  >  文章  >  資料庫  >  Redis如何實現持久化方案(RDB和AOF使用)

Redis如何實現持久化方案(RDB和AOF使用)

WJ
WJ轉載
2020-05-30 11:51:542666瀏覽

一、持久化的作用

1.什麼是持久化

redis的所有資料保存在記憶體中,資料的更新將非同步的儲存到硬碟上

2.持久化的實作方式

快照:某時某一刻資料的一個完成備份   -mysql的Dump    -redis的RDB寫日誌:任何作業記錄日誌,要恢復數據,只要把日誌重新走一遍即可   -mysql的Binlog    -Hhase的HLog #   -Redsql的Binlog    -Hhase的HLog #   -Redsql#AOF

Redis如何實現持久化方案(RDB和AOF使用)

在外##A

二、RDB

1.什麼是RDB

2.觸發機制-主要三種方式

第一種:save(同步)

1 用戶端輸入save指令----》redis服務端----》同步創建RDB二進位檔案

2 會造成redis的阻塞(資料量非常大的時候)

3 檔案策略:如果老的RDB存在,會取代舊的

4複雜度o(n)

第二種:bgsave(異步,Backgroud saving started)

1 客戶端輸入save指令----》redis服務端----》異步建立RDB二進位(fork函數產生一個子程序(fork會阻塞reids),執行createRDB,執行成功,回傳至reids訊息)

2 此時存取redis,會正常回應客戶端

3 檔案策略:跟save相同,如果老的RDB存在,會取代舊的

4 複雜度o(n)

第三種:(常用方式)(** ****)自動(透過設定檔)

設定  seconds   changes

save   900        1save   300        10save   60  改變了10條數據,自動產生rdb

如果900s改變了1條數據,自動產生rdb

以上三條符合任一條,就自動產生rdb,內部使用bgsave

##設定:

save 900 1 #設定一條


save 300 10 #設定一條

save 60 10000 #設定一條

dbfilename dump.rdb #rdb檔案的名字,預設為dump.rdb


dir ./ #rdb檔案存在當前目錄

stop-writes-on-bgsave-error yes #如果bgsave出現錯誤,是否停止寫入,預設為yes

rdbcompression yes #採用壓縮格式

rdbchecksum yes #是否對rdb檔案進行校驗與檢定

##最佳設定

save 900 1


save 300 10

save 60 10000 dbfilename dump-${port}.rdb

 #以連接埠號當檔名,可能一台機器上很多reids,不會亂

dir /bigdiskpath #儲存路徑放到一個大硬碟位置目錄

stop-writes-on-bgsave-error yes

#出現錯誤停止

rdbcompression yes #壓縮


rdbchecksum yes #校驗

RDB觸發機制一般使用第三種方式,但是這種方式也會有缺點。如果修改的條數沒有在設定範圍內那麼就不會觸發,就會引發很多資料沒有持久化的情況。所以我們一般會採用下面方式:AOF。

如果是保存不重要的資料可以使用RDB方式(例如快取資料),如果是保存很重要的資料就要使用AOF,但兩種方式也可以同時使用。

三、AOF

1.RDB問題

耗時,耗效能。不可控,可能會遺失資料。 #########2.AOF介紹######客戶端每寫入一條指令,都記錄一筆日誌,放到日誌檔案中,如果出現宕機,可以將資料完全恢復## #######3.AOF的三個策略######日誌不是直接寫到硬碟上,而是先放在緩衝區,緩衝區根據一些策略,寫到硬碟上#### ###第一種:always:redis--》寫入指令刷新的緩衝區---》每個指令fsync到硬碟---》AOF檔#######第二種:everysec(預設值):redis——》寫指令刷新的緩衝區---》每秒把緩衝區fsync到硬碟--》AOF檔#######第三種:no:redis——」寫指令刷新的緩衝區---》作業系統決定,緩衝區fsync到硬碟--》AOF檔###
#always everysec no
優點 不遺失資料  
每秒一次fsync,遺失1秒資料  不用管 
缺點  
IO開銷大,一般的sata碟只有幾百TPS #丟1秒資料 不可控

4.AOF重寫

隨著指令的逐步寫入,並發量的變大, AOF檔案會越來越大,透過AOF重寫來解決該問題

  
#原生AOF ##AOF重寫
set hello world

set hello java

#set hello hehe

incr counter

ncr counter

rpush mylist a

rpush mylist b

rpush mylist c

過期資料

#set hello hehe

set counter 2

set counter 2


set a b c


Redis如何實現持久化方案(RDB和AOF使用)

#本質就是把過期的,無用的,重複的,可以優化的指令,來優化這樣可以減少磁碟佔用量,加速恢復速度

實作方式

bgrewriteaof:客戶端向服務端發送bgrewriteaof指令,服務端會起一個fork進程,完成AOF重寫

AOF重寫設定:

重寫流程 1.rdb與aof的比較rdbaof低   小   快速#資料安全性   遺失資料 
AOF設定檔(******) appendonly yes #將該選項設為yes,開啟appendfilename "appendonly-${port}.aof " #檔案保存的名字appendfsync everysec #採用第二種策略dir /bigdiskpath #存放的路徑no-appendfsync-on-rewrite yes #在aof重寫的時候,是否要做aof的append操作,因為aof重寫消耗效能,磁碟消耗,正常aof寫磁碟有一定的衝突,這段期間的數據,允許遺失 #四、RDB和AOF的選擇

指令



啟動優先權

高(掛掉重啟,會載入aof的資料)   

體積

#大

恢復速度  



#################################################################### ###依照策略決定   ################重   #########重   #########輕######################################################################################################################################################################################################################## #######

2.rdb最佳策略

rdb關掉,主從操作時
集中管理:按天,按小時備份資料
主從配置,從節點開啟

3.aof最佳策略

開:快取和存儲,大部分情況都打開,
aof重寫集中管理
everysec:透過每秒刷新的策略

4.最佳策略

小分片:每個redis的最大記憶體為4g
快取或儲存:根據特性,使用不通策略
時時監控硬碟,內存,負載網路等
有足夠內存

以上就是Redis(四)-持久化方案(RDB和AOF使用)的全部內容。

相關參考:PHP中文網

#

以上是Redis如何實現持久化方案(RDB和AOF使用)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51dev.com。如有侵權,請聯絡admin@php.cn刪除