## 三個定時任務
1. 每10秒每個sentinel對master和slave執行info;
1.發現slave節點;
2. 確認主從關系;

2. 每2秒每個sentinel通過master節點的channel交換信息(pub/sub)channel是發布訂閱的頻道;
1. 通過__sentinel__:hello頻道交互
2. 交互對節點的“看法”和自身信息;

3. 每1秒每個sentinel對其他sentinel和redis執行ping;
1. 心跳檢測,失敗判定依據;

## 主觀下線和客觀下線
主觀下線:
上面介紹的第三個定時任務(每隔一秒),當這些節點超過down-after-milliseconds(設置的有效回復時間)沒有進行有效的回復,Sentinel節點就會對該節點做失敗判定,這個行為叫做主觀下線
客觀下線:
當Sentinel主觀下線的節點是主節點時,該Sentinel節點會通過sentinel ismaster-down-by-addr命令向其他Sentinel節點詢問對主節點的判斷,當超過個數,Sentinel節點認為主節點確實有問題,這時該Sentinel節點會 做出客觀下線的決定
這樣客觀下線的含義是比較明顯了,也就是大部分Sentinel節點都對主節點的下線做了同意的判定,那么這個判定就是客觀的
當判定完客觀下線后是不是就可以進行故障轉移了?當然不是,實際上至于要一個sentinel節點來執行,所以要先進行領導者的選擇,由這個領導者來進行。
## 領導者節點的選舉
Redis使用了Raft算法實 現領導者選舉,因為Raft算法相對比較抽象和復雜,以及篇幅所限,所以這里給出一個Redis Sentinel進行領導者選舉的大致思路:
1)每個在線的Sentinel節點都有資格成為領導者,當它確認主節點主觀下線時候,會向其他Sentinel節點發送sentinel is-master-down-by-addr命令, 要求將自己設置為領導者
2)收到命令的Sentinel節點,如果沒有同意過其他Sentinel節點的sentinel is-master-down-by-addr命令,將同意該請求,否則拒絕
3)如果該Sentinel節點發現自己的票數已經大于等于max(quorum, num(sentinels)/2+1),那么它將成為領導者; 如下圖的2就是通過((節點數/2) + 1)計算獲得(意思就是大于半數+1的節點同意); 所以sentinel的節點數最好是一個奇數(3,5,7);

4)如果此過程沒有選舉出領導者,將進入下一次選舉
選舉的過程非常快,基本上誰先完成客觀下線,誰就是領導者
其實這個過程就是一個投票的過程,sentinel中先完成客觀下線的就向其他sentinel節點詢問是否同意自己當領導,假如票數大于一半,自己將成為領導者,如果沒有足夠的票數,就重新進行選舉;

## 故障轉移(sentinel領導者節點完成)
故障轉移就是當master宕機,選擇一個合適的slave節點來升級為master節點的操作,sentinel會自動完成這個,不需要手動實現;
具體步驟:
1)在從節點列表中選出一個節點作為新的主節點,選擇方法如下:
* a)過濾:“不健康”(主觀下線、斷線)、5秒內沒有回復過Sentinel節 點ping響應、與主節點失聯超過down-after-milliseconds\*10秒
* b)選擇slave-priority(從節點優先級)最高的從節點列表,如果存在則返回,不存在則繼續;(默認不配置的)
* c)選擇復制偏移量最大的從節點(復制的最完整),如果存在則返回,不存在則繼續
* d)選擇runid最小的從節點
2)Sentinel領導者節點會對第一步選出來的從節點執行slaveof no one命令讓其成為主節點
3)Sentinel領導者節點會向剩余的從節點發送命令,讓它們成為新主節點的從節點,復制規則和parallel-syncs參數有關
4)Sentinel節點集合會將原來的主節點更新為從節點,并保持著對其關注,當其恢復后命令它去復制新的主節點;

- 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布隆過濾器
- 分布式布隆過濾器
- 開發規范
- 內存管理
- 開發運維常見坑
- 實戰
- 對文章進行投票
- 數據庫的概念
- 啟動多實例