redis 主從複製和哨兵模式(二)

Redis 主從複製

爲了分擔單機 redis 的數據服務壓力,需要進行讀寫分離,所以搭建 redis 的主從結構,主節點負責寫,從節點負責讀,主節點定期把數據同步到從節點。

配置主從

# 配置文件中增加一行以哪個 redis 爲主
slaveof ip port
# 主節點的密碼
masterauth h123

# 從節點只讀,默認配置
slave-read-only yes
# 關閉 TCP_NODELAY ,無論多大的包都直接發送,默認即可
repl-disable-tcp-nodelay no
# 主節點默認每 10 秒向從節點發送心跳包,默認即可
repl-ping-slave-period 10

主從拓撲結構

slaveof 只是說明本機是哪臺的從節點,所以很靈活的實現可種主從結構

  • 一主一從:用於主節點故障轉移從節點,當主節點的“寫”命令併發高且需要持久化,可以只在從節點開啓AOF(主節點不需要),這樣即保證了數據的安全性,也避免持久化對主節點的影響
  • 一主多從:用於讀場景比較多的場合,但這樣會造成主節點需要同步較多的從節點,影響主節點的帶寬。
  • 樹狀主從:主節點推送更少的從節點,由從節點來遞歸推送

可以使用 info 命令查詢當前 redis 的從節點個數和位置,需要自己依次遍歷查詢才能得到完整的拓撲結構

數據同步

redis 2.8版本以上使用psync命令完成同步,過程分全量複製部分複製

  • 全量複製:一般用於初次複製場景(第一次建立SLAVE後全量)
  • 部分複製:網絡出現問題,從節點再次連接主節點時,主節點補發缺少的數據,每次數據增量同步

故障修復

當主節點出現故障時,已經不能對外提供寫服務 ,但從節點可以提供讀服務

可以將其中一臺從節點轉變成主節點,需要人工處理,無法實現高可用

處理流程

  1. 修改一臺從節點爲主節點,在節點執行 slaveof no one
  2. 讓其它從節點以現在的主節點爲主節點,redis-cli 執行 slaveof ip port

Redis 哨兵機制(Sentinel)

哨兵機制主要是爲了解決主從複製不能自動切換 master 的問題,當主節點故障時,由 sentinel 自動完成故障發現和修復,並通知應用方,實現高可用

配置哨兵節點配置文件,並啓動三個哨兵

# 後臺啓動
daemonize yes
# 監控主節點
sentinel monitor mymaster 127.0.0.1 6379 1
# 啓動哨兵 
./redis-sentinel conf/sentinel.conf  

哨兵的監控任務

  1. 每 10 秒會向主節點和從節點發送 info 命令獲取最新拓撲圖
  2. 每個哨兵節點會每隔 2 秒向 redis 數據節點的指定主題(__sentinel__:hello)上發送該哨兵節點對於主節點的判斷以及當前哨兵節點的信息;同時每個哨兵節點自己也會訂閱這個主題,用來了解其它節點的判斷,其實就是通過 publish/subscribe 來完成的。
  3. 每隔 1 秒每個哨兵會向主節點,從節點及其餘哨兵節點發送一次 ping 命令做心跳檢查,用來判斷節點是否正常。

判斷主節點是否異常

主觀下線(sdown):ping 命令如果在配置的 down-after-milliseconds 之後沒有收到有效回覆,那麼就認爲該數據節點主觀下線。

客觀下線:超過選舉個數哨兵認爲異常

當有哨兵節點判斷主節點異常時,此時該哨兵節點會通過指令sentinel is-masterdown-by-addr尋求其它哨兵節點對主節點的判斷,當超過quorum(選舉)個數的哨兵節點回答下線,則認爲該主節點客觀下線

哨兵領導者的選舉

當主節點客觀下線時,需要選舉出一個哨兵節點做爲哨兵領導者,以完成後續選出新的主節點的工作。

這個選舉的大體思路是:

  • 每個哨兵節點通過向其他哨兵節點發送sentinel is-master-down-by addr命令來申請成爲哨兵領導者。
  • 而每個哨兵節點在收到一個sentinel is-master-down-by addr命令時,只允許給第一個節點投票,其他節點的該命令都會被拒絕。
  • 如果一個哨兵節點收到了半數以上的同意票,則成爲哨兵領導者。
  • 如果前面三步在一定時間內都沒有選出一個哨兵領導者,將重新開始下一次選舉。

    可以看到,這個選舉領導者的流程很像 Raft 中選舉 Leader 的流程。

如何選擇誰成爲主節點

在剩下的從節點中,按照以下順序來選擇新的主節點:

  • 過濾掉“不健康”的數據節點:比如主觀下線、斷線的從節點、五秒內沒有回覆過哨兵節點 Ping 命令的節點、與主節點失聯的從節點。
  • 選擇 Slave-Priority(從節點優先級)最高的從節點,如果存在則返回,不存在則繼續後面的流程。
  • 選擇複製偏移量最大的從節點,這意味着這個從節點上面的數據最完整,如果存在則返回,不存在則繼續後面的流程。
  • 到了這裏,所有剩餘從節點的狀態都是一樣的,選擇 runid 最小的從節點。

提升從節點爲主節點

最後就是把從節點轉移成主節點,並讓其它從節點以它爲主節點,和手動處理是一樣的流程,只是發起命令人變成了哨兵

  1. 修改它爲主節點,在節點執行 slaveof no one
  2. 讓其它從節點以現在的主節點爲主節點,執行 slaveof ip port
  3. 哨兵節點集合會將原來的主節點更新爲從節點,當其恢復之後命令它去複製新的主節點的數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章