redis的AOF、RDB、Sentinel介紹


一.寫作目的

  最近整理面試題,發現很多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.宕機恢復的舊主節點設為新主節點的從節點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM