提高資料安全性,redis提供了兩類方法,一個是持久化,讓使用者将自己的資料存儲到硬碟上;另一個是複制特性,将不斷更新的資料存儲到附加的機器上(主從概念)。
一、持久化的方式:
1.快照 : 将某一時刻的所有的資料全部都寫入硬碟。
2.AOF(append-only file):它會在執行寫指令時,将被執行的指令複制到硬碟中去。
建立快照的方法:
1、用戶端向redis發送 BGSAVE指令,redis接收到該指令後會單獨起一個子程序負責将快照寫入硬碟,而父程序就繼續執行指令。
2.用戶端向redis發送SAVE指令,redis收到該指令後不會單獨起一個程序,而是收到指令後不再響應其他的任何指令,隻能在快照建立成功之後才會繼續響應其他指令,是以不常用。
3.可以給redis配置檔案中設定 save 60 10000 ,該指令的語意是“在60秒内,如果有10000次寫入請求 這個條件被滿足的時候,就會建立一次快照”,通過該指令建立快照的時候,redis也是通過BGSAVE指令執行的。
4.接收到SHUTDOWN指令後,會執行一個SAVE指令,阻塞所有的用戶端,不再執行用戶端的所有指令。
在隻使用快照來持久化資料時,需要注意:如果系統發生崩潰,業務方将丢失最近一次快照後的所有資料。是以快照持久化隻适用于那些即使丢失一部分資料也不會對業務造成影響的應用。
AOF:append-only file,請注意第一個單次append,追加的意思。也就是說,AOF會将被執行的指令寫入到AOF檔案的末尾,以此來記錄資料的變化。也就是說,redis隻要重頭到位執行一次AOF檔案的所有指令,就可以恢複AOF檔案所記錄的所有資料集。
在配置檔案中,AOF一般有三個選項:
always:每個指令都要同步寫入硬碟,這會降低redis的速度,同時也會造成寫入放大,影響硬碟的使用壽命,不推薦。
everysec:以每秒一次的頻率對AOF檔案進行同步。每秒一次同步的性能和不使用任何持久化時的性能相差無幾,且這樣做之後redis可以保證,即使出現系統崩潰,使用者也隻會丢失一秒的資料。
no:redis将不對AOF檔案進行顯示的同步,完全依賴于作業系統決定何時對AOF進行同步。不推薦。
那麼,AOF看起來很完美,最多也隻會丢失一秒的資料,那他是不是真的很完美呢?
有兩個問題需要注意:
1.redis不斷的運作,AOF檔案會變得越來越大甚至可能會占用整個磁盤的空間。
2.redis在重新開機後需要通過執行AOF檔案中的指令來還原之前的資料,如果AOF檔案很大,還原操作将會持續很長時間。
針對上述兩個問題的解決辦法,redis提供了BGREWRITEAOF指令,該指令會移除AOF檔案中的備援指令來重寫AOF檔案,使AOF檔案的體積變得盡可能的小。和BGSAVE相似,該指令也會單獨起一個子程序來進行重寫。如果AOF檔案很大, 這時候建立一個子程序就會有記憶體問題,甚至可能導緻該子程序被挂起數秒。
同樣地,redis也提供了自動重寫的配置(真是佩服redis的作者,每個問題的解決方案都給你準備好了,隻要意識到相應問題然後選擇用什麼方案就可以,6的飛起啊):
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
當aof檔案的體積大于64mb,并且現在aof檔案的體積比上一次重寫之後的體積大了100%的時候,redis就會執行BGREWRITEAOF指令。
redis的作者真的挺牛,這種設計方案的利弊,值得我們在工作中學習。
二、複制(類似于關系型資料庫的主從複制,主伺服器向多個從伺服器發送更新,并使用從伺服器處理所有讀請求)
無論是快照還是AOF這兩種持久化方式,都隻是将資料在本機硬碟做了備份,除此之外,将持久化得到的檔案在其他機器上做備份也很重要,這樣一台機器挂了,其餘機器能夠繼續執行,不影響業務。
通過設定額外的redis從伺服器來儲存資料集的副本。在接收到主伺服器發送的資料初始副本後,用戶端每次向主伺服器進行寫入時,從伺服器都會實時的得到更新。部署好從伺服器之後,用戶端就可以實時的向任意一個從伺服器發送讀請求了,而不必向之前那樣隻能通過主伺服器。
SLAVEOF host port 來讓redis伺服器複制一個新的主伺服器
SLAVEOF no one 來讓redis終止服務操作
redis複制的過程:
主伺服器開啟BGSAVE指令,這之後接收到的指令全部緩存到緩沖區,BGSAVE指令執行完畢之後,向從伺服器發送快招檔案,并在發送期間繼續使用緩沖區記錄被執行的指令;等到快照檔案發送完畢後,将緩沖區的指令也發送到從伺服器,緩沖區的指令也發送完畢後,就向從伺服器發送相同的寫指令。
其實主伺服器和從伺服器之間并沒有什麼特别不同的地方,是以從伺服器也可以繼續擁有自己的從伺服器,進而形成主從鍊。
更多内容,可以來通路下我的個人部落格http://generalcode.cn