前面兩篇咱們瞭解了Redis的安裝、Redis最經常使用的5種數據類型。本篇總結下Redis的持久化、主從複製特性,以及Redis服務掛了以後的一些處理思路。web
前期回顧傳送門:面試
Linux下安裝Redis簡易教程
Redis實戰 | 5種Redis數據類型詳解redis
常常有面試官會問:Redis數據存儲在內存中,萬一斷電了怎麼辦呢?數據庫
不要慌,這個其實就是在問Redis的持久化策略啦。咱們知道,保存在內存中的數據,在服務重啓或者是機器掛掉以後是會丟失的。而硬盤中的數據是不會丟失的,所以只有將數據保存在硬盤上才相對安全些。安全
Redis爲了追求高性能而將數據存在內存中,同時也提供了持久化的選項保證數據的安全性。這兩種方式是:bash
什麼是RDB持久化呢?服務器
也叫快照持久化,就是將當前Redis數據庫中的數據快照保存一份到磁盤文件中(通常叫dump.rdb
)。好了,這個時候若是斷電了,沒事啊,重啓後,Redis經過加載rdb文件能夠將數據庫狀態恢復。基本上算是,滿血復活了(由於存在數據丟失問題,血不是很滿!)app
RDB 功能最核心的是 rdbSave 和 rdbLoad 兩個函數, 前者用於生成 RDB 文件到磁盤, 然後者則用於將 RDB 文件中的數據從新載入到內存中函數
看圖說話:工具
怎麼實現RDB的持久化呢?
SAVE 和 BGSAVE兩個命令來實現RDB持久化,這兩個命令都會調用 rdbSave 函數,將數據保存在rdb文件中。可是有所區別:
通常咱們怎麼配置RDB持久化呢?
這裏咱們能夠經過修改redis.conf配置文件中關於RDB持久化的選項讓Redis自動去執行持久化。好比下面這些選項:
# 900s以內有1次寫入
save 900 1
# 300s內有10次寫入
save 300 10
# 60s內有10000次寫入
save 60 10000
#執行bgsave失敗時是否繼續執行寫命令,默認是yes
stop-writes-on-bgsave-error yes
#是否對快照文件進行壓縮,模式是yes
rdbcompression yes
#快照文件的名稱,默認是dump.rdb
dbfilename dump.rdb
當配置了多個save選項時,當任意一個save配置項條件被知足時,Redis就會觸發一次BGSAVE命令。
除了在redis.conf配置文件中配置rdb持久化以外,還有一些方式,能夠建立快照:
前面說到,RDB丟失數據的問題,其實就是在兩次同步數據之間,若是服務器發生崩潰,便會丟失掉這之間的數據。
什麼是AOF,就是appendonly file的縮寫啦!
簡單來講,AOF持久化就是將被執行的寫命令追加到AOF文件的末尾,以此來記錄數據發生的變化。在恢復數據時,只須要從頭至尾從新執行一遍AOF文件所包含的全部命令便可。
那麼,AOF持久化有哪些配置項呢?
# 是否使用appendonly模式,默認是no
appendonly no
# appendfilename文件名
appendfilename "appendonly.aof"
# appendfsync always //每一個命令都同步
appendfsync everysec //沒秒執行一次同步,默認是這個
# appendfsync no //操做系統決定什麼時候進行同步
# 在對aof文件進行壓縮的時候可否執行同步
no-appendfsync-on-rewrite no
AOF方式的持久化有個缺點,就是文件的體積比較大。
Redis爲了緩解這個問題,給咱們提供了BGREWRITEAOF的命令,這個命令會經過移除AOF文件中的一些冗餘命令來重寫AOF文件,使得AOF文件的體積儘量地縮小。類比BGSAVE命令,這裏的BGREWRITEAOF命令也是fork出一個子進程進行AOF文件的壓縮(也就是重寫)工做。
一樣地,咱們能夠在redis.conf配置文件中配置AOF文件的重寫選項,讓Redis自動執行BGREWRITEAOF
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
這兩個配置的意思就是,當AOF文件的體積大於64MB,
而且AOF文件的體積比上一次重寫以後的體積大了至少一倍(100%)時,
Redis將執行AOF文件的重寫命令。
就是將一臺Redis服務器的數據,複製到另一臺或幾臺Redis服務器上。前者就是主服務器,後者就是從服務器。主服務器負責處理客戶端的讀寫請求,而從服務器能夠分擔一部分讀請求或者負責全部的讀請求。
客戶端每次向主服務器寫入的命令,從服務器都能獲得實時的更新。默認狀況下,每臺Redis服務器都是主節點;且一個主節點能夠有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。
配置主從複製其實很簡單,就一條命令 slaveof
。配置主從複製,其實就是配置Redis的從服務器從哪臺主服務器複製數據。主服務器不須要動的。
所以,咱們能夠修改從服務器的 redis.conf
文件,增長以下一行配置就行:
slaveof masterip port
除了配置文件的方式外,還能夠在啓動redis實例的時候 加入 --slaveof masterip port
,這樣就會告訴redis實例從哪臺機器和端口處複製數據。
也能夠直接在redis客戶端執行命令 slaveof masterip port
,讓服務器開始複製一個主服務器。
另外,若是要斷開同主服務器的複製,可使用下面命令:
slaveof no one
當從服務器鏈接主服務器時,主從服務器執行的大概操做以下圖所示:
服務器宕機以後,可能須要恢復數據,這時候會用到以前說的持久化到硬盤上的aof或是dump快照文件。Redis給咱們提供了兩個命令行工具,在系統故障以後,用來檢查aof文件和快照文件的狀態,而且在還有修復功能。
下面是這兩個命令行程序:
redis-check-aof
redis-check-dump
下面舉例一種故障的場景:
A是redis主服務器,B是從服務器。A機器故障暫沒法修復。現將C機器上的redis服務做爲主服務器替換上去。
具體的替換計劃是這樣的:
做者Info:公衆號:二營長的筆記