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後全量)
- 部分複製:網路出現問題,從節點再次連線主節點時,主節點補發缺少的資料,每次資料增量同步
故障修復
當主節點出現故障時,已經不能對外提供寫服務 ,但從節點可以提供讀服務
可以將其中一臺從節點轉變成主節點,需要人工處理,無法實現高可用
處理流程
- 修改一臺從節點為主節點,在節點執行
slaveof no one
- 讓其它從節點以現在的主節點為主節點,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
哨兵的監控任務
- 每 10 秒會向主節點和從節點發送
info
命令獲取最新拓撲圖 - 每個哨兵節點會每隔 2 秒向 redis 資料節點的指定主題(**__sentinel__:hello**)上傳送該哨兵節點對於主節點的判斷以及當前哨兵節點的資訊;同時每個哨兵節點自己也會訂閱這個主題,用來了解其它節點的判斷,其實就是通過 publish/subscribe 來完成的。
- 每隔 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 最小的從節點。
提升從節點為主節點
最後就是把從節點轉移成主節點,並讓其它從節點以它為主節點,和手動處理是一樣的流程,只是發起命令人變成了哨兵
- 修改它為主節點,在節點執行
slaveof no one
- 讓其它從節點以現在的主節點為主節點,執行
slaveof ip port
哨兵節點集合會將原來的主節點更新為從節點,當其恢復之後命令它去複製新的主節點的資料。
一點小推廣
創作不易,希望可以支援下我的開源軟體,及我的小工具,歡迎來 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