天天看點

idea不小心删除setting配置檔案怎麼回複_面試系列 redis資料删除&叢集

redis資料删除/記憶體淘汰

如果我們設定一批key隻能存活1小時,那麼1小時之後,redis是怎麼對這批資料進行删除的?

答案:定期删數+惰性删除

(1)定期删除

指的是redis預設是每隔100ms就随機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就删除。注意,這裡可不是每隔100ms就周遊所有的設定過期時間的key,那樣就是一場性能上的災難。實際上redis是每隔100ms随機抽取一些key來檢查和删除的。

(2)惰性删除

定期删除的問題是可能會導緻很多過期key到了時間并沒有被删除掉,那怎麼辦?是以還有惰性删除,也就是在查詢某個key的時候,redis會檢查一下這個key如果設定了過期時間并且是否過期了,如果過期了就會在此時删除。

通過定期删除和惰性删除兩種方式結合,保證過期的key一定會被删除

  • 定期删除是為了節省記憶體
  • 惰性删除是為了保證過期性

如果定期沒删除,也沒有查詢,這樣會導緻大量過期的key堆積在記憶體裡怎麼辦?

答案:記憶體淘汰機制

allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key。

volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。

手寫LRU

public 
           

主從複制過程

這個牛客網上問的也不多,先待定二輪複習再補充

Redis哨兵模式

這都是為了提高redis的高可用性

==叢集監控==,負責監控redis master和slave程序是否正常工作

==消息通知==,如果某個redis執行個體有故障,那麼哨兵負責發送消息作為報警通知管理者

==故障轉移==,如果master node挂掉了,會自動轉移到slave node上

==配置中心==,如果故障轉移發生了,通知client用戶端新的master位址

idea不小心删除setting配置檔案怎麼回複_面試系列 redis資料删除&叢集
  • 指令連接配接:用來擷取主/從伺服器的資訊
  • 訂閱連接配接:sentinel1會通過指令連接配接向主從伺服器發送自身狀态資訊,通過訂閱連接配接将此資訊通知到其他的哨兵,是以哨兵不需要知道哨兵之間的位置
  • 哨兵之間指令連接配接:與下線檢測的原理相關(因為此時主伺服器已經當機,無法通過訂閱連接配接讓哨兵之間通知)

哨兵模式工作流程

  1. 每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 執行個體發送一個 PING 指令。
  2. 如果一個執行個體(instance)距離最後一次有效回複 PING 指令的時間超過 down-after-milliseconds 選項所指定的值, 則這個執行個體會被目前 Sentinel 标記為主觀下線。
  3. 如果一個Master被标記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率确認Master的确進入了主觀下線狀态。
  4. 當有足夠數量的 Sentinel(大于等于配置檔案指定的值)在指定的時間範圍内确認Master的确進入了主觀下線狀态, 則Master會被标記為客觀下線 ,進而對Master進行故障轉移

故障轉移流程

  1. 選取領頭哨兵,采取先到先得的方式,超過半數哨兵的支援的哨兵成為領頭哨兵
  2. 從已下線主伺服器屬下的所有從伺服器裡面,挑選一個從伺服器,并将其轉換為主伺服器
  3. 讓一下先主伺服器屬下所有從伺服器改位複制新的主伺服器
  4. 将已下線主伺服器設定位新的主伺服器的從伺服器

挑選從伺服器的流程

  1. 從伺服器處于線上狀态
  2. 從伺服器最近五秒回複過哨兵的INFO指令
  3. 跟master斷開連接配接的時長較短,這是為了保證從伺服器的資料較新
  4. 從伺服器優先級,複制偏移量(哪個slave複制了越多的資料,offset越靠後,優先級就越高),運作ID(run id比較小),進行排序

為什麼哨兵至少需要3個

  • 因為挑選領頭哨兵的時候需要獲得超過半數的投票,是以一般都是把哨兵的節點設定為奇數位。因為(2的majority=2,3的majority=2,5的majority=3,4的majority=3)偶數容易算錯
  • 2個哨兵同樣可以完成功能,是以其實沒有說一定要至少三個,隻是兩個哨兵的時候如果挂了一個就不可用了,而三個哨兵挂了一個還有兩個可用。是以至少3個是為了達到一定的高可用性的常用配置而已。

Redis叢集模式

idea不小心删除setting配置檔案怎麼回複_面試系列 redis資料删除&叢集

redis分片

将整個資料集按照一定的規則配置設定到多個節點上,常用的資料分片的方法有:範圍分片,哈希分片,一緻性雜湊演算法,哈希槽等。

槽位的概念在叢集這裡很重要,任何key都要通過槽位分片到不同的節點運作

建立叢集的流程

  1. 配置和開啟cluster模式
  2. 配置redis執行個體節點握手
  3. 為每個主節點指派槽位,一般按區間平均配置設定
  4. 配置設定主從

擴容叢集過程

  1. 準備新節點
  2. 加入叢集進行握手
  3. 遷移槽和資料( 槽位轉移了,對應槽位的資料也會遷移到新的執行個體上 )

縮容過程

  1. 确定下線的節點是否有負責槽,如果是,需要把槽遷移到其他節點,保證節點下線後整個槽節點映射的完整性。
  2. 當下線節點不在負責槽或着本身是從節點時,就可以通知叢集内其他節點忘記下線節點,當所有節點忘記該節點後就可以正常關閉。

故障轉移

為什麼redis cluster至少需要3個主節點?

因為故障檢測時沒有哨兵,需要超過半數的主節點都主觀下線,該故障節點才會被視為客觀下線。兩個主節點,如果挂了一個,那麼隻剩一個無法達到超過半數的條件。這與哨兵模式不同,因為兩個哨兵不一定會挂。

故障轉移過程-----《redis設計與實作》------感覺不會考

主從複制,哨兵,叢集的差別

1.主從模式

:讀寫分離,備份,一個Master可以有多個Slaves。

2.哨兵

sentinel:監控,自動轉移,哨兵發現主伺服器挂了後,就會從slave中重新選舉一個主伺服器。

3.叢集

:故障轉移不再需要哨兵,提供資料分片,提高并發量,一般都是使用它了。

繼續閱讀