redis哨兵模式没有切换主机_Redis哨兵(Sentinel)模式
Redis哨兵(Sentinel)模式
在這里插入圖片描述一、主從復(fù)制高可用
當(dāng)我們使用主從復(fù)制出現(xiàn)的問題
- 手動故障轉(zhuǎn)移
- 寫能力和存儲能力受限
- 主從復(fù)制 -master 宕機(jī)故障處理
主從切換技術(shù)的方法是:當(dāng)主服務(wù)器宕機(jī)后,需要手動把一臺從服務(wù)器切換為主服務(wù)器,這就需要人工干預(yù),費事費力,還會造成一段時間內(nèi)服務(wù)不可用。這不是一種推薦的方式,更多時候,我們優(yōu)先考慮哨兵模式。
~哨兵模式概述
哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進(jìn)程,作為進(jìn)程,它會獨立運行。其原理是哨兵通過發(fā)送命令,等待Redis服務(wù)器響應(yīng),從而監(jiān)控運行的多個Redis實例。
哨兵主要有兩個作用
通過發(fā)送命令,讓Redis服務(wù)器返回監(jiān)控其運行狀態(tài),包括主服務(wù)器和從服務(wù)器。
當(dāng)哨兵監(jiān)測到master宕機(jī),會自動將slave切換成master,然后通過發(fā)布訂閱模式通知其他的從服務(wù)器,修改配置文件,讓它們切換主機(jī)。
然而一個哨兵進(jìn)程對Redis服務(wù)器進(jìn)行監(jiān)控,可能會出現(xiàn)問題,為此,我們可以使用多個哨兵進(jìn)行監(jiān)控。各個哨兵之間還會進(jìn)行監(jiān)控,這樣就形成了多哨兵模式。
故障切換(failover)的過程。假設(shè)主服務(wù)器宕機(jī),哨兵1先檢測到這個結(jié)果,系統(tǒng)并不會馬上進(jìn)行failover過程,僅僅是哨兵1主觀的認(rèn)為主服務(wù)器不可用,這個現(xiàn)象成為主觀下線。當(dāng)后面的哨兵也檢測到主服務(wù)器不可用,并且數(shù)量達(dá)到一定值時,那么哨兵之間就會進(jìn)行一次投票,投票的結(jié)果由一個哨兵發(fā)起,進(jìn)行failover操作。切換成功后,就會通過發(fā)布訂閱模式,讓各個哨兵把自己監(jiān)控的從服務(wù)器實現(xiàn)切換主機(jī),這個過程稱為客觀下線。這樣對于客戶端而言,一切都是透明的。
二、架構(gòu)說明
在這里插入圖片描述三、安裝配置
在這里插入圖片描述- 主節(jié)點
配置
port?7000daemonize?yes
pidfile?/var/run/redis-7000.pid
logfile?"7000.log"
dir?"/opt/soft/redis/data/"
- Redis從節(jié)點
redis-server?redis-7002.conf
slave-1:
port?7002daemonize?yes
pidfile?/var/run/redis-7002.pid
logfile?"7002.log"
dir?"/opt/soft/redis/data/"
slaveof?127.0.0.1?7000
slave-2:
port?7001daemonize?yes
pidfile?/var/run/redis-7001.pid
logfile?"7001.log"
dir?"/opt/soft/redis/data/"
slaveof?127.0.0.1?7000
- sentine 主要配置 ?編輯 sentinel.conf
dir?"/opt/soft/redis/data/"
logfile?"${port}.log"
//?配置監(jiān)聽的主服務(wù)器,這里sentinel monitor代表監(jiān)控,mymaster代表服務(wù)器的名稱,可以自定義,192.168.11.128代表監(jiān)控的主服務(wù)器,6379代表端口,2代表只有兩個或兩個以上的哨兵認(rèn)為主服務(wù)器不可用的時候,才會進(jìn)行failover操作。
sentinel?monitor?mymaster?127.0.0.1?7000?2???
sentinel?down-after-millseseconds?mymaster?30000?//判斷主節(jié)點時間
sentinel?parallel-syncs?mymaster?1????
sentinel?failover-timeout?mymaster?180000
啟動
redis-sentinel?sentinel.conf可以使用 ps -ef|grep redis-sentinel 命令查看進(jìn)程、
四、實現(xiàn)原理
- 故障轉(zhuǎn)移 ? ? --- java實現(xiàn)
?*?測試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?sentinels?=?new?HashSet<>(Arrays.asList("127.0.0.1:26379","1127.0.0.1:26379","127.0.0.1:26379"));//?創(chuàng)建連接池
????????JedisSentinelPool?pool?=?new?JedisSentinelPool("mymaster",?sentinels,jedisPoolConfig,"123456");//?獲取客戶端
????????Jedis?jedis?=?pool.getResource();//?執(zhí)行兩個命令
????????jedis.set("mykey",?"myvalue");
????????String?value?=?jedis.get("mykey");
????????System.out.println(value);
????}
}
如果我們把主服務(wù)器停掉,在經(jīng)過一段時間的報錯后,redis集群會恢復(fù)
主觀下線和客觀下線
主觀下線:當(dāng)前sentintel節(jié)點認(rèn)為某個redis節(jié)點不可用。
客觀下線:所有sentinel節(jié)點認(rèn)為某個redis節(jié)點不可用。
三個定時任務(wù)
每10秒每個sentinel對master 和 slave執(zhí)行info
- 發(fā)現(xiàn)slave節(jié)點- 確認(rèn)主從關(guān)系
每2秒每個sentinel通過master節(jié)點對channel交換信息(發(fā)布訂閱)
- 通過_sentinel_:hello頻道交互- 交互對節(jié)點的“看法”和自身信息
每1秒每個sentinel 對其他sentinel和redis執(zhí)行ping
領(lǐng)導(dǎo)者選舉
只需要一個sentinel節(jié)點完成故障轉(zhuǎn)移
通過sentinel is - master -down -by-addr 命令都希望成為領(lǐng)導(dǎo)者
-1. 每個主觀下線都Sentitle 節(jié)點向其他Sentinel節(jié)點發(fā)送命令,要求將它設(shè)置為領(lǐng)導(dǎo)者
-2. 收到命令對Sentinel節(jié)點如果沒有同一通過其他Sentinel節(jié)點發(fā)送的命令,那么就將同一該請求,否則拒絕
-3. 如果該Sentinel節(jié)點發(fā)現(xiàn)直接的票數(shù)已經(jīng)超過Sentinel集合半數(shù)且超過quorum,那么它將成為領(lǐng)導(dǎo)者
-4. 如果此過程由多個Sentinel節(jié)點成為領(lǐng)導(dǎo)者,那么將來等待一段時間重新進(jìn)行選舉
故障轉(zhuǎn)移(Sentinel領(lǐng)導(dǎo)者節(jié)點完成)
- 1.從slave節(jié)點中選出一個 “合適點”節(jié)點作為master節(jié)點
- 2.對上面對slave節(jié)點執(zhí)行slaveof no one 命令讓其成為master節(jié)點。
- 3.向剩余的slave節(jié)點發(fā)送命令,讓它們成為新的maater節(jié)點的slave節(jié)點,復(fù)制規(guī)避和parallel-syncs參數(shù)有關(guān)
- 4.更新對原來master節(jié)點配置為slave,并保持著對其 “關(guān)注”,當(dāng)其恢復(fù)后命令他去復(fù)制新對master節(jié)點
選擇 “合適的” slave節(jié)點
- 1.選擇slave-priority(slave節(jié)點優(yōu)先級)最高對slave節(jié)點,如果存在返回,不存在繼續(xù)
- 2.選擇復(fù)制偏移量最大的slave節(jié)點,復(fù)制最完整,存在返回,不存在繼續(xù)
- 3.選擇runId最小的slave節(jié)點
五、需要說明的問題
- 盡可能在不同物理機(jī)上和同一個網(wǎng)絡(luò)部署Redis sentinel的所有節(jié)點
- Redis sentinel中的sentinel節(jié)點個數(shù)應(yīng)該大于等于3且最好是奇數(shù)。(節(jié)點數(shù)多可以保證高可用)
- Redis sentinel中的數(shù)據(jù)節(jié)點和普通數(shù)據(jù)節(jié)點沒有區(qū)別。每個sentinel節(jié)點在本質(zhì)上還是一個Redis實例,只不過和Redis數(shù)據(jù)節(jié)點不同的是,其主要作用是監(jiān)控Redis數(shù)據(jù)節(jié)點
- 客戶端初始化時連接的是sentinel節(jié)點集合,不再是具體的Redis節(jié)點,但sentinel只是配置中心不是代理。
個人博客:http://blog.yanxiaolong.cn/
總結(jié)
以上是生活随笔為你收集整理的redis哨兵模式没有切换主机_Redis哨兵(Sentinel)模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沈阳钻石山公寓有停车位吗
- 下一篇: 京朝系统门窗好不好 佛山品牌吗?