一.寫作目的
最近整理面試題,發現很多RDB、AOF以及Redis Sentinel的面試題,所以在這里記一下,內容基本都來自《Redis開發與運維》,推薦大家看一下這本書,寫的非常好。
其中AOF、RDB是Redis的兩種“持久化”機制,持久化指的是將數據從內存保存到磁盤介質中,當Redis服務器因為故障崩潰后,可以利用持久化的文件來會進行數據恢復。
二. RDB-內存快照
RDB持久化方式,是把內存中的數據生成快照保存到硬盤,可以通過手動和自動兩種途徑來觸發RDB持久化:
RDB持久化后,保存的文件擴展名為*.rdb。
2.1 手動觸發RDB持久化
手動觸發,是指執行命令來觸發持久化,又可分為兩種,分別是save和bgsave兩個命令,這兩個命令存在相當大的區別:
save:阻塞當前Redis服務器,直到RDB過程完成為止,對於內存數據比較大的Redis服務器會造成長時間阻塞;
bgsave:Redis進程執行fork操作創建子進程,RDB持久化過程由子進程負責,完成后自動結束,阻塞只發生在fork階段,時間很短;
2.2 自動觸發RDB持久化
這種方式主要是通過配置來實現,在redis的配置文件中設置
save seconds changes # seconds秒內進行了changes次修改,則執行一次save命令 # 下面表示60秒內,如果發生了至少5次修改,則會進行RDB流程 save 60 5
需要注意的是,配置的是多少秒發生了多少次更改,只會對更改的次數計數,因為讀操作不會更改數據。
2.3 優缺點
優點:保存全量數據,可以用來災難恢復;
缺點:無法保證實時性,因為保存的是內存快照,在保存快照過程中,Redis仍在請求(可能包含數據修改),造成快照數據和實時數據存在差異;
三、AOF-文件追加
3.1 簡單介紹
AOF是指將Redis收到的“寫”命令記錄到文件中(包含增刪改命令,不包含讀命令);
另外AOF默認會將命令追加到名為的appendonly.aof文件中。
3.2 AOF注意點
1.AOF方式並不是簡單的將命令直接追加到aof文件中(會有一定格式);
2.AOF並不是每次都將命令追加到aof文件中(有一個緩沖區),可以設置配置項appendfsync的值always、no、everysec,其中always表示每次都要同步寫入硬盤,no表示由系統控制,everysec表示每秒寫一次;
3.不斷將寫命令追加到aof文件中,時間一長,aof文件就會特別大,需要定期對其進行壓縮重寫(比如多次del合並為一次del這種)。重寫也有手動和自動兩種方式,手動方式是執行bgrewriteaof,自動方式時進行配置。
四、Sentinel-哨兵
4.1 哨兵介紹
Redis Sentinel是一個分布式架構,其中包含若干個Sentinel節點和Redis 數據節點(包含master、slave節點);
每個Sentinel節點會對數據節點和其余Sentinel節點進行監控,當它發現節點不可達時,會對節點做下線標識。
如果被標識的是主節點,它還會和其他Sentinel節點進行“協商”,當大多數Sentinel節點都認為主節點不可達時,它們會選舉出一個Sentinel節點來完成自動故障轉移的工作,同時會將這個變化實時通知給Redis應用方。
4.2 主觀下線
每個Sentinel節點會每隔1秒對主節點、從節點、其他Sentinel節點發送ping命令做心跳檢測,當這些節點超過 down-after-milliseconds沒有進行有效回復,Sentinel節點就會對該節點做失敗判定,這個行為叫做主觀下線。
4.3 客觀下線
當Sentinel主觀下線的節點是主節點時,該Sentinel節點會通過sentinel is-master-down-by-addr命令向其他Sentinel節點詢問對主節點的判斷,當超過<quorum>個數,Sentinel節點認為主節點確實有問題,這時該Sentinel節點會做出客觀下線的決定,但是並沒有進行故障轉移。
4.4 哨兵Leader選舉
使用Raft算法,選舉過程如下(簡要):
1.每個在線的Sentinel節點都有資格成為領導者,當它確認主節點主觀 下線時候,會向其他Sentinel節點發送sentinel is-master-down-by-addr命令, 要求將自己設置為領導者。
2.收到命令的Sentinel節點,如果沒有同意過其他Sentinel節點的sentinel is-master-down-by-addr命令,將同意該請求,否則拒絕。
如果該Sentinel節點發現自己的票數已經大於等於max(quorum, num(sentinels)/2+1),那么它將成為領導者。
如果此過程沒有選舉出領導者,將進入下一次選舉。
4.5 故障轉移
1.選擇最好的從節點:優先級最高、偏移量最大(數據越完整)、runid最小。
2.將選定的從節點設為主節點,並將該新主節點設為其他從節點的主節點;
3.宕機恢復的舊主節點設為新主節點的從節點。
