本文對redis快照的實現過程進行介紹,了解redis快照實現過程對redis管理很有幫助。
redis缺省會將快照檔案儲存在redis當前程序的工作目錄中的dump.rdb檔案中,可以通過配置dir和dbfilename兩個引數分別指定快照檔案的儲存路徑和檔名。快照的過程如下。
(1)redis使用fork函式複製乙份當前程序(父程序)的副本(子程序);
(2)父程序繼續接收並處理客戶端發來的命令,而子程序開始將記憶體中的資料寫入硬碟中的臨時檔案;
(3)當子程序寫入完所有資料後會用該臨時檔案替換舊的 rdb 檔案,至此一次快照操作完成。
在執行 fork 的時候作業系統(類 unix 作業系統)會使用寫時複製(copy-on-write)策略,即fork函式發生的一刻父子程序共享同一記憶體資料,當父程序要更改其中某片資料時(如執行乙個寫命令),作業系統會將該片資料複製乙份以保證子程序的資料不受影響,所以新的rdb檔案儲存的是執行fork一刻的記憶體資料。
寫時複製策略也保證了在 fork 的時刻雖然看上去生成了兩份記憶體副本,但實際上記憶體的佔用量並不會增加一倍。這就意味著當系統記憶體只有2 gb,而redis資料庫的記憶體有1.5 gb時,執行 fork後記憶體使用量並不會增加到3 gb(超出物理記憶體)。為此需要確保 linux 系統允許應用程式申請超過可用記憶體(物理記憶體和交換分割槽)的空間,方法是在/etc/sysctl.conf 檔案加入 vm.overcommit_memory = 1,然後重啟系統或者執行 sysctl vm.overcommit_memory=1 確保設定生效。
另外需要注意的是,當進行快照的過程中,如果寫入操作較多,造成 fork 前後資料差異較大,是會使得記憶體使用量顯著超過實際資料大小的,因為記憶體中不僅儲存了當前的資料庫資料,而且還儲存著 fork 時刻的記憶體資料。進行記憶體用量估算時很容易忽略這一問題,造成記憶體用量超限。
通過上述過程可以發現redis在進行快照的過程中不會修改rdb檔案,只有快照結束後才會將舊的檔案替換成新的,也就是說任何時候 rdb 檔案都是完整的。這使得我們可以通過定時備份 rdb 檔案來實現 redis 資料庫備份。rdb 檔案是經過壓縮(可以配置rdbcompression 引數以禁用壓縮節省cpu占用)的二進位制格式,所以占用的空間會小於記憶體中的資料大小,更加利於傳輸。
redis啟動後會讀取rdb快照檔案,將資料從硬碟載入到記憶體。根據資料量大小與結構和伺服器效能不同,這個時間也不同。通常將乙個記錄1000萬個字串型別鍵、大小為1 gb 的快照檔案載入到記憶體中需要花費20~30秒。
通過rdb方式實現持久化,一旦redis異常退出,就會丟失最後一次快照以後更改的所有資料。這就需要開發者根據具體的應用場合,通過組合設定自動快照條件的方式來將可能發生的資料損失控制在能夠接受的範圍。例如,使用redis儲存快取資料時,丟失最近幾秒的資料或者丟失最近更新的幾十個鍵並不會有很大的影響。如果資料相對重要,希望將損失降到最小,則可以使用aof方式進行持久化。
快照實現原理詳解(運維)
click here 五 快照與映象 複製的區別 映象 快照和複製是三種不同的功能 映象是通過從乙個i o建立兩個i o來複製資料。磁碟映象通過os或捲管理軟體在主系統上建立。磁碟映象是依靠平台和本地連線特性的本地選件。映象可用於das和san並且大多數nas支援它。儲存 式映象磁碟子系統 例如,e...
快照技術原理
五 快照與映象 複製的區別 映象 快照和複製是三種不同的功能 映象是通過從乙個i o建立兩個i o來複製資料。磁碟映象通過os或捲管理軟體在主系統上建立。磁碟映象是依靠平台和本地連線特性的本地選件。映象可用於das和san並且大多數nas支援它。儲存 式映象磁碟子系統 例如,emc srdf,ibm...
儲存快照的原理
儲存快照有兩種實現方式 cow 寫時複製copy on write row 寫重定向redirect on write 兩種實現方法有區別,造成讀寫效能 應用場景有比較大的區別。cow 原理見下圖 從網上找的,沒自己畫 1 原卷資料是a g。此卷metedata像指標一樣指向這些資料。2 當做快照時...