Redis學習日記--redis持久化
1.什麼是持久化
將資料從掉電易失的記憶體存放到能夠永久儲存的裝置上
2.Redis持久化方式
RDB(Redis DB)
AOF(AppendOnlyF
Redis持久化-RDB
在預設情況下,Redis 將資料庫快照儲存在名字為 dump.rdb的二進位制檔案中
執行策略:
自動:按照配置檔案中的條件滿足就執行BGSAVE
手動:客戶端發起SAVE、BGSAVE命令
SAVE命令
1.redis > save
2.阻塞Redis服務,無法響應客戶端請求
3.建立新的dump.rdb替代舊檔案
BGSAVE命令
1.redis > bgsave
2.非阻塞,Redis服務正常接收處理客戶端請求
3.Redis會fork()一個新的子程序來建立RDB檔案,子程序處理完後會向父程序傳送一個訊號,通知它處理完畢
4.父程序用新的dump.rdb替代舊檔案
BGSAVE命令是一個非同步命令(shell的父子程序)。執行過程流圖如下:
1.fork():copy on writ
2.子程序記憶體中儲存父程序記憶體的指向,不必開闢資料大小的記憶體佔用
3.父程序不會阻塞,如果客戶端修改了父程序的記憶體,阻塞(cow):父程序的值,然後在子程序中開闢(舊的)。父程序才真正修改。:阻塞是很小。
4.9:00 BGSAVE 10:00完成,持久化資料儲存的是9:00
優點
完全備份,不同時間的資料集備份可以做到多版本恢復
緊湊的單一檔案,方便網路傳輸,適合災難恢復
恢復大資料集速度較AOF快
缺點
會丟失最近寫入、修改的而未能持久化的資料
fork過程非常耗時,會造成毫秒級不能響應客戶端請求
SAVE 和 BGSAVE 命令相對比
SAVE不用建立新的程序,速度略快
BGSAVE需要建立子程序,消耗額外的記憶體
SAVE適合停機維護,服務低谷時段
BGSAVE適合線上執行
Redis持久化-AOF
Append only file,採用追加的方式儲存;
預設檔案appendonly.aof;
記錄所有的寫操作命令,在服務啟動的時候使用這些命令就可以還原資料庫;
調整AOF持久化策略,可以在服務出現故障時,不丟失任何資料,也可以丟失一秒的資料。相對於RDB損失小得多
AOF寫入機制
AOF方式不能保證絕對不丟失資料
目前常見的作業系統中,執行系統呼叫write函式,將一些內容寫入到某個檔案裡面時,為了提高效率,系統通常不會直接將內容寫入硬盤裡面,而是先將內容放入一個記憶體緩衝區(buffer)裡面,等到緩衝區被填滿,或者使用者執行fsync呼叫和fdatasync呼叫時才將儲存在緩衝區裡的內容真正的寫入到硬盤裡,未寫入磁碟之前,資料可能會丟失
寫入磁碟的策略
appendfsync選項,這個選項的值可以是always、everysec或者no
Always:伺服器每寫入一個命令,就呼叫一次fdatasync,將緩衝區裡面的命令寫入到硬碟。這種模式下,伺服器出現故障,也不會丟失任何已經成功執行的命令資料
Everysec(預設):伺服器每一秒重呼叫一次fdatasync,將緩衝區裡面的命令寫入到硬碟。這種模式下,伺服器出現故障,最多隻丟失一秒鐘內的執行的命令資料
No:伺服器不主動呼叫fdatasync,由作業系統決定何時將緩衝區裡面的命令寫入到硬碟。這種模式下,伺服器遭遇意外停機時,丟失命令的數量是不確定的
執行速度:always的速度慢,everysec和no都很快
AOF重寫機制
AOF檔案過大
合併重複的操作,AOF會使用盡可能少的命令來記錄
重寫過程
fork一個子程序負責重寫AOF檔案
子程序會建立一個臨時檔案寫入AOF資訊
父程序會開闢一個記憶體緩衝區接收新的寫命令
子程序重寫完成後,父程序會獲得一個訊號,將父程序接收到的新的寫操作由子程序寫入到臨時檔案中
新檔案替代舊檔案
注:如果寫入操作的時候出現故障導致命令寫半截,可以使用redis-check-aof工具修復
優點
寫入機制,預設fysnc每秒執行,效能很好不阻塞服務,最多丟失一秒的資料
重寫機制,優化AOF檔案
如果誤操作了(FLUSHALL等),只要AOF未被重寫,停止服務移除AOF檔案尾部FLUSHALL命令,重啟Redis,可以將資料集恢復到 FLUSHALL 執行之前的狀態
缺點
相同資料集,AOF檔案體積較RDB大了很多
恢復資料庫速度叫RDB慢(文字,命令重演)