在這裏插入圖片描述java
主從切換技術的方法是:當主服務器宕機後,須要手動把一臺從服務器切換爲主服務器,這就須要人工干預,費事費力,還會形成一段時間內服務不可用。這不是一種推薦的方式,更多時候,咱們優先考慮哨兵模式。redis
哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,做爲進程,它會獨立運行。其原理是哨兵經過發送命令,等待Redis服務器響應,從而監控運行的多個Redis實例。服務器
哨兵主要有兩個做用網絡
經過發送命令,讓Redis服務器返回監控其運行狀態,包括主服務器和從服務器。架構
當哨兵監測到master宕機,會自動將slave切換成master,而後經過發佈訂閱模式通知其餘的從服務器,修改配置文件,讓它們切換主機。ide
然而一個哨兵進程對Redis服務器進行監控,可能會出現問題,爲此,咱們可使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就造成了多哨兵模式。測試
故障切換(failover)的過程。假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會立刻進行failover過程,僅僅是哨兵1主觀的認爲主服務器不可用,這個現象成爲主觀下線。當後面的哨兵也檢測到主服務器不可用,而且數量達到必定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操做。切換成功後,就會經過發佈訂閱模式,讓各個哨兵把本身監控的從服務器實現切換主機,這個過程稱爲客觀下線。這樣對於客戶端而言,一切都是透明的。spa
在這裏插入圖片描述代理
在這裏插入圖片描述code
啓動命令:redis-server redis-7000.conf
配置
port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir "/opt/soft/redis/data/"
redis-server redis-7001.conf
redis-server redis-7002.conf
slave-1:
port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
slave-2:
port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
port ${port}
dir "/opt/soft/redis/data/"
logfile "${port}.log"
// 配置監聽的主服務器,這裏sentinel monitor表明監控,mymaster表明服務器的名稱,能夠自定義,192.168.11.128表明監控的主服務器,6379表明端口,2表明只有兩個或兩個以上的哨兵認爲主服務器不可用的時候,纔會進行failover操做。
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-millseseconds mymaster 30000 //判斷主節點時間
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
啓動
redis-sentinel sentinel.conf
可使用 ps -ef|grep redis-sentinel 命令查看進程、
/**
* 測試Redis哨兵模式
* @author liu
*/
public class TestSentinels {
@SuppressWarnings("resource")
@Test
public void testSentinel() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxIdle(5);
jedisPoolConfig.setMinIdle(5);
// 哨兵信息
Set<String> sentinels = new HashSet<>(Arrays.asList("127.0.0.1:26379","1127.0.0.1:26379","127.0.0.1:26379"));
// 建立鏈接池
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
// 獲取客戶端
Jedis jedis = pool.getResource();
// 執行兩個命令
jedis.set("mykey", "myvalue");
String value = jedis.get("mykey");
System.out.println(value);
}
}
若是咱們把主服務器停掉,在通過一段時間的報錯後,redis集羣會恢復
主觀下線和客觀下線
主觀下線:當前sentintel節點認爲某個redis節點不可用。
客觀下線:全部sentinel節點認爲某個redis節點不可用。
三個定時任務
每10秒每一個sentinel對master 和 slave執行info
- 發現slave節點
- 確認主從關係
每2秒每一個sentinel經過master節點對channel交換信息(發佈訂閱)
- 經過_sentinel_:hello頻道交互
- 交互對節點的「見解」和自身信息
每1秒每一個sentinel 對其餘sentinel和redis執行ping
領導者選舉
只須要一個sentinel節點完成故障轉移
經過sentinel is - master -down -by-addr 命令都但願成爲領導者
-1. 每一個主觀下線都Sentitle 節點向其餘Sentinel節點發送命令,要求將它設置爲領導者
-2. 收到命令對Sentinel節點若是沒有同一經過其餘Sentinel節點發送的命令,那麼就將同一該請求,不然拒絕
-3. 若是該Sentinel節點發現直接的票數已經超過Sentinel集合半數且超過quorum,那麼它將成爲領導者
-4. 若是此過程由多個Sentinel節點成爲領導者,那麼未來等待一段時間從新進行選舉
在這裏插入圖片描述
故障轉移(Sentinel領導者節點完成)
選擇 「合適的」 slave節點