1. 程式人生 > >redis 主從複製和哨兵模式(二)

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. 哨兵節點集合會將原來的主節點更新為從節點,當其恢復之後命令它去複製新的主節點的資料。

    一點小推廣

    創作不易,希望可以支援下我的開源軟體,及我的小工具,歡迎來 gitee 點星,fork ,提 bug 。

Excel 通用匯入匯出,支援 Excel 公式
部落格地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi

使用模板程式碼 ,從資料庫生成程式碼 ,及一些專案中經常可以用到的小工具
部落格地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-ma