Redis數據持久化

Redis是個支持持久化的內存數據庫,redis須要常常將內存中的數據同步到磁盤來保證持久化。
redis


一、RDB方式(Snapshotting默認快照方式):
數據庫

1.1)配置:緩存

save 900 1       #在900秒(15分鐘)以後,若是至少有1個key發生變化,則dump內存快照。
save 300 10      #在300秒(5分鐘)以後,若是至少有10個key發生變化,則dump內存快照。
save 60 10000    #在60秒(1分鐘)以後,若是至少有10000個key發生變化,則dump內存快照。


1.2)工做原理:安全

1.2.1)Redis使用fork函數複製一份當前進程(父進程)的副本(子進程);bash

1.2.2)父進程繼續接收並處理客戶端發來的命令,而子進程開始將內存中的數據寫入硬盤中的臨時文件;服務器

1.2.3)當子進程寫入完全部數據後會用該臨時文件替換舊的RDB文件,至此一次快照操做完成。app


1.3)查看dump.rdb:
ide

127.0.0.1:7000> config get dir
1) "dir"
2) "/usr/local/redis/db"
127.0.0.1:7000>


1.4)優勢:函數

1.4.1)RDB是個很是緊湊的文件,保存了redis在某個時間點上的數據集,使得咱們能夠經過定時備份RDB文件來實現Redis數據庫備份和災難恢復,也能夠將其傳送到其餘的數據中心用於保存。
工具

1.4.2)RDB能夠最大化redis的性能,執行RDB持久化時只須要fork一個子進程,並由子進程進行持久化工做,父進程不須要處理任何磁盤I/O操做。

1.4.3)RDB在恢復大數據集時比AOF要快,啓動效率要高許多。

1.4.4)RDB文件是通過壓縮(能夠配置rdbcompression參數以禁用壓縮節省CPU佔用)的二進制格式,因此佔用的空間會小於內存中的數據大小,更加利於傳輸。


1.5)缺點:

1.5.1)每次快照持久化都是將內存數據完整寫入到磁盤一次,並非增量的只同步增數據。若是數據量大的話,並且寫操做比較多,必然會引發大量的磁盤io操做,可能會嚴重影響性能。

1.5.2)快照方式是在必定間隔時間作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改,有一些數據丟失的風險。

1.5.2)client的save或者bgsave命令通知redis作一次快照持久化不推薦。

127.0.0.1:7000> save
OK
127.0.0.1:7000>

緣由:save操做是在主線程中保存快照的,因爲redis是用一個主線程來處理全部 client的請求,這種方式會阻塞全部client請求。因此不推薦使用。


二、Append-only file(縮寫aof)的方式:

2.1)配置

appendonly yes  
#開啓aof
appendfilename "appendonly.aof"  
#名字
# appendfsync always   
# 每次執行寫入都會執行同步,最安全也最慢
appendfsync everysec   
# 每秒執行一次同步操做
# appendfsync no 
#不主動進行同步操做,而是徹底交由操做系統來作(即每30秒一次),最快也最不安全。
#配置寫入AOF文件後,要求系統刷新硬盤緩存的機制
auto-aof-rewrite-percentage 100  
# 當目前的AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時會再次進行重寫,若是以前沒有重寫過,則以啓動時的AOF文件大小爲依據
auto-aof-rewrite-min-size 64mb   
# 容許重寫的最小AOF文件大小

2.2)工做原理:

2.2.1)redis調用fork ,如今有父子兩個進程

2.2.2)子進程根據內存中的數據庫快照,往臨時文件中寫入重建數據庫狀態的命令

2.2.3)父進程繼續處理client請求,除了把寫命令寫入到原來的aof文件中。同時把收到的寫命令緩存起來。這樣就能保證若是子進程重寫失敗的話並不會出問題。

2.2.4.)當子進程把快照內容寫入已命令方式寫到臨時文件中後,子進程發信號通知父進程。而後父進程把緩存的寫命令也寫入到臨時文件。

2.2.5)如今父進程可使用臨時文件替換老的aof文件,並重命名,後面收到的寫命令也開始往新的aof文件中追加。


2.3)查看aof

127.0.0.1:7000> config get dir
1) "dir"
2) "/usr/local/redis/db"
127.0.0.1:7000>
[root@redis1 db]# ll
總用量 8
-rw-r--r-- 1 root root 146 2月   1 08:36 appendonly.aof
-rw-r--r-- 1 root root  74 2月   1 09:20 dump.rdb
[root@redis1 db]#

2.4)優勢:

2.4.1)該機制能夠帶來更高的數據安全性,即數據持久性。

2.4.2)因爲該機制對日誌文件的寫入操做採用的是append模式,所以在寫入過程當中即便出現宕機現象,也不會破壞日誌文件中已經存在的內容。然而若是咱們本次操做只是寫入了一半數據就出現了系統崩潰問題,不用擔憂,在Redis下一次啓動以前,咱們能夠經過redis-check-aof工具來幫助咱們解決數據一致性的問題。

2.4.3)若是日誌過大,Redis能夠自動啓用rewrite機制。即Redis以append模式不斷的將修改數據寫入到老的磁盤文件中,同時Redis還會建立一個新的文件用於記錄此期間有哪些修改命令被執行。所以在進行rewrite切換時能夠更好的保證數據安全性。

2.4.4) AOF包含一個格式清晰、易於理解的日誌文件用於記錄全部的修改操做。事實上,也能夠經過該文件完成數據的重建。


2.5:缺點:

2.5.1)對於相同數量的數據集而言,AOF文件一般要大於RDB文件,持久化文件會變的愈來愈大。

2.5.2) 根據同步策略的不一樣,AOF在運行效率上每每會慢於RDB。


三、其它

虛擬內存方式和diskstore方式。:(不建議,並且虛擬內存聽說2.4版本後棄用,diskstore也不經常使用)

相關配置

持久化文件會變的愈來愈大。
vm-enabled yes          
#開啓vm功能
vm-swap-file /tmp/redis.swap   
#交換出來的value保存的文件路徑/tmp/redis.swap
vm-max-memory 1000000  
#redis使用的最大內存上限,超過上限後redis開始交換value到磁盤文件中
vm-page-size 32        
#每一個頁面的大小32個字節
vm-pages 134217728     
#最多使用在文件中使用多少頁面,交換文件的大小 = vm-page-size * vm-pages
vm-max-threads 4       
#用於執行value對象換入換出的工做線程數量,0表示不使用工做線程


總結:

一、Redis容許同時開啓AOF和RDB,既保證了數據安全又使得進行備份等操做十分容易。從新啓動Redis後Redis會使用AOF文件來恢復數據,由於AOF方式的持久化可能丟失的數據更少。


二、讀寫分離 經過複製能夠實現讀寫分離以提升服務器的負載能力。在常見的場景中,讀的頻率大於寫,當單機的Redis沒法應付大量的讀請求時(尤爲是較耗資源的請求,好比SORT命令等)能夠經過複製功能創建多個從數據庫,主數據庫只進行寫操做,而從數據庫負責讀操做。


三、從數據庫持久化 持久化一般相對比較耗時,爲了提升性能,能夠經過複製功能創建一個(或若干個)從數據庫,並在從數據庫中啓用持久化,同時在主數據庫禁用持久化。當從數據庫崩潰時重啓後主數據庫會自動將數據同步過來,因此無需擔憂數據丟失。而當主數據庫崩潰時,須要在從數據庫中使用SLAVEOF NO ONE命令將從數據庫提高成主數據庫繼續服務,並在原來的主數據庫啓動後使用SLAVEOF命令將其設置成新的主數據庫的從數據庫,便可將數據同步回來。


若有不妥,歡迎指正!

相關文章
相關標籤/搜索