## 說明
* **故障節點從主觀下線變為客觀下線后,如果下線節點是持有槽的主節點則需要在它的從節點中選出一個替換它,從而保證集群的高可用**。下線主節點的所有從節點承擔故障恢復的義務,當從節點通過內部定時任務發現自身復制的主節點進入客觀下線時,將會觸發故障恢復流程,如下圖所示:

## 資格檢查
* 每個從節點都要檢查最后與主節點斷線時間,判斷是否有資格替換故障的主節點;
* 如果從節點與主節點斷線時間**超過cluster-node-time\*cluster-slavevalidity-factor,(默認是15秒)**則當前從節點不具備故障轉移資格**。參數cluster-slavevalidity-factor用于從節點的有效因子,默認為10(10*15 = 150); 也就是說超過150秒就沒有資格成為主節點了;
## 準備選舉時間
* 當從節點符合故障轉移資格后,**更新觸發故障選舉的時間,只有到達該時間后才能執行后續流程**
* **這里之所以采用延遲觸發機制,**主要是通過對多個從節點使用不同的延遲選舉時間來支持優先級問題。**復制偏移量越大說明從節點延遲越低,那么它應該具有更高的優先級來替換故障主節點**
* **使用之上的優先級排名,更新選舉觸發時間**
* **所有的從節點中復制偏移量最大的將提前觸發故障選舉流程**

* 主節點b進入客觀下線后,**它的三個從節點根據自身復制偏移量設置延遲選舉時間,**如復制偏移量最大的節點slave b-1延遲1秒執行,保證復制延遲低的從節點優先發起選舉
## 發起選舉
## 選舉投票
* **只有持有槽的主節點才會處理故障選舉消息**(FAILOVER\_AUTH\_REQUEST),因為每個持有槽的節點在一個配置紀元內都有唯一的一張選票,當接到第一個請求投票的從節點消息時回復FAILOVER\_AUTH\_ACK消息作為投票,之后相同配置紀元內其他從節點的 選舉消息將忽略
* **投票過程其實是一個領導者選舉的過程,**如集群內有N個持有槽的主節點代表有N張選票。由于在每個配置紀元內持有槽的主節點只能投票給一個 從節點,因此只能有一個從節點獲得N/2+1的選票,保證能夠找出唯一的從節點
* **Redis集群沒有直接使用從節點進行領導者選舉,**主要因為從節點數必須大于等于3個才能保證湊夠N/2+1個節點,將導致從節點資源浪費。使用 集群內所有持有槽的主節點進行領導者選舉,即使只有一個從節點也可以完 成選舉過程
* **當從節點收集到N/2+1個持有槽的主節點投票時,從節點可以執行替換主節點操作**,例如集群內有5個持有槽的主節點,主節點b故障后還有4個, 當其中一個從節點收集到3張投票時代表獲得了足夠的選票可以進行替換主 節點操作,如下圖所示

* * **運維提示:**故障主節點也算在投票數內,假設集群內節點規模是3主3從,其中有2 個主節點部署在一臺機器上,當這臺機器宕機時,由于從節點無法收集到3/2+1個主節點選票將導致故障轉移失敗。這個問題也適用于故障發現環 節。**因此部署集群時所有主節點最少需要部署在3臺物理機上才能避免單點問題**
* **投票作廢:**每個配置紀元代表了一次選舉周期,如果在開始投票之后的cluster-node-timeout\*2時間內從節點沒有獲取足夠數量的投票,則本次選舉作廢。從節點對配置紀元自增并發起下一輪投票,直到選舉成功為止
## 替換主節點
**當從節點收集到足夠的選票之后,觸發替換主節點操作:**
* 1)當前從節點**取消復制變為主節點**
* 2)執行clusterDelSlot操作**撤銷故障主節點負責的槽**,并執行clusterAddSlot把這些槽委派給自己
* **3)向集群廣播自己的pong消息,**通知集群內所有的節點當前從節點變為主節點并接管了故障主節點的槽信息
- Redis簡介
- 簡介
- 典型應用場景
- Redis安裝
- 安裝
- redis可執行文件說明
- 三種啟動方法
- Redis常用配置
- API的使用和理解
- 通用命令
- 數據結構和內部編碼
- 單線程
- 數據類型
- 字符串
- 哈希
- 列表
- 集合
- 有序集合
- Redis常用功能
- 慢查詢
- Pipline
- 發布訂閱
- Bitmap
- Hyperloglog
- GEO
- 持久化機制
- 概述
- snapshotting快照方式持久化
- append only file追加方式持久化AOF
- RDB和AOF的抉擇
- 開發運維常見問題
- fork操作
- 子進程外開銷
- AOF追加阻塞
- 單機多實例部署
- Redis復制原理和優化
- 什么是主從復制
- 主從復制配置
- 全量復制和部分復制
- 故障處理
- 開發運維常見問題
- Sentinel
- 主從復制高可用
- 架構說明
- 安裝配置
- 客戶端連接
- 實現原理
- 常見開發運維問題
- 高可用讀寫分離
- 故障轉移client怎么知道新的master地址
- 總結
- Sluster
- 呼喚集群
- 數據分布
- 搭建集群
- 集群通信
- 集群擴容
- 集群縮容
- 客戶端路由
- 故障轉移
- 故障發現
- 故障恢復
- 開發運維常見問題
- 緩存設計與優化
- 緩存收益和成本
- 緩存更新策略
- 緩存粒度控制
- 緩存穿透優化
- 緩存雪崩優化
- 無底洞問題優化
- 熱點key重建優化
- 總結
- 布隆過濾器
- 引出布隆過濾器
- 布隆過濾器基本原理
- 布隆過濾器誤差率
- 本地布隆過濾器
- Redis布隆過濾器
- 分布式布隆過濾器
- 開發規范
- 內存管理
- 開發運維常見坑
- 實戰
- 對文章進行投票
- 數據庫的概念
- 啟動多實例