Redis 集羣的主從切換

Redis 集羣的主從切換再也不使用 Sentinel 做爲外置監控, 而是集羣內部在主節點掛掉以後選舉出一個從節點取代主節點, 處理相應的分片的數據請求.redis

固然前提條件是對應的主節點有至少一個可連通的從. 有一些複雜的網絡環境下, 也許 A 有 B, C 兩個從, B 和 C 能夠獨立鏈接 A 並獲取備份數據, 但 B 和 C 之間不能連通的話, 就會產生問題.網絡

以上只是一個前提, 自動主從切換的另外一個前提是半數以上的非空主節點還活着, 由於只有那些已分配槽位的主進行主從切換選舉, 並且選舉得出的結果須要至少半數的主意見一致. 這一點舉幾個典型的反例運維

  • 1 主 1 從或 2 主 2 從的集羣, 任意一個主掛了, 集羣中不會發生自動主從切換 (創建集羣須要 3 個以上的主節點這一規定在官方的 redis-trib.rb 腳本中, 而不是集羣自身的限制)
  • 3 主 3 從的集羣, 幾乎同時掛掉 2 個主, 集羣中不會發生自動主從切換
  • 3 主 3 從的集羣, 其中一個主沒有分配槽位, 掛掉另外任意一個主, 集羣中不會發生自動主從切換

第一種狀況中, 主掛掉, 固然不知足半數以上 (不是至少半數) 的主還活着.工具

第二種狀況中, 2 個主前後掛掉之間的時間間隔很重要. 好比如今有 A B C D E F 共 6 個 Redis, 主從結構爲 A slaveof D, B slaveof E, C slaveof F, 這時若是 D 掛了, 剩下 2 個主, 是有機會進行選舉讓 A 切換爲主的, 若是 A 切換爲主以後, E 再掛掉, 以後仍然能夠選舉, 讓 B 切換; 可是, 若是選舉還沒完成, A 還沒來得及切換, E 又掛了, 那麼至關於集羣同時掛掉 2 個主, 剩下 1 個 F 沒法選舉, 因而自動主從切換不會發生.get

第三種狀況, 假設仍是 6 個 Redis, 主從結構爲 A slaveof D, B slaveof E, C slaveof F, 但 F 沒有槽位, 那麼 D 掛了的話, F 不參與選舉, 跟第一種狀況同樣, 沒半數, 不予切換.io

這時, 能夠手動切換. 切換方法是使用 redis-cli 工具連上相應的從節點, 執行 cluster failover TAKEOVER 命令 (必須加上 TAKEOVER 參數).集羣

好比上面第二種狀況, D 和 E 都掛了, 那麼須要連上 A 執行上述命令, 強制 A 取代已經死掉的 D 成一個主. 注意, 這時活着的主的數量就會恢復到 2 個, 知足了一半以上的數量要求, 接下來 B 會自動切換爲主.監控

這種行爲還引出一個讓運維哭的結論: 若是使用兩臺對等的機器配置一個交叉集羣, 那麼若是一臺機器斷電了, 剩下一臺機器是上的實例是不會自動主從切換的...cli

相關文章
相關標籤/搜索