溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis哨兵機(jī)制講解

發(fā)布時間:2021-08-31 18:18:20 來源:億速云 閱讀:213 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“Redis哨兵機(jī)制講解”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Redis哨兵機(jī)制講解”吧!

哨兵作用

哨兵是Redis集群架構(gòu)中非常重要的一個組件,主要功能如下:

  • 集群監(jiān)控:負(fù)責(zé)監(jiān)控redis master和slave進(jìn)程是否正常

  • 消息通知:如果某個redis實(shí)例有故障,那么哨兵負(fù)責(zé)發(fā)送消息作為報警通知給管理員

  • 故障轉(zhuǎn)移:如果master節(jié)點(diǎn)掛掉了,會自動轉(zhuǎn)移到slave節(jié)點(diǎn)上

  • 配置中心:如果故障轉(zhuǎn)移發(fā)生了,通知client客戶端新的master地址

哨兵的核心知識

  • 故障轉(zhuǎn)移時,判斷一個master節(jié)點(diǎn)是否宕機(jī)了,需要大部分的哨兵都同意才行,涉及到了分布式選舉的問題

  • 哨兵至少需要3個實(shí)例,來保證自己的健壯性

  • 哨兵+redis主從的部署架構(gòu),是不會保證數(shù)據(jù)零丟失的,只能保證redis集群的高可用性

sdown和odown

  • sdown和odown兩種失敗的狀態(tài)

  • sdown是主觀宕機(jī),就一個哨兵如果自己覺得一個master宕機(jī)了,那么就是主觀宕機(jī)

  • odown是客觀宕機(jī),如果quorum數(shù)量的哨兵都覺得一個master宕機(jī)了,那么就是客觀宕機(jī)

  • sdown達(dá)成的條件:如果一個哨兵ping一個master,超過了is-master-down-after-milliseconds指定的毫秒數(shù)之后,就認(rèn)為master宕機(jī)

  • odown達(dá)成條件:如果一個哨兵在指定的時間內(nèi),收到了quorum指定數(shù)量的其他哨兵也認(rèn)為那個master是宕機(jī)了,那么就認(rèn)為是odown了,客觀認(rèn)為master宕機(jī)了

quorum和majority

  1. quorum:確認(rèn)odown的最少哨兵數(shù)量

  2. majority:授權(quán)進(jìn)行主從切換的最少哨兵數(shù)量

  3. 每一個哨兵要做主備切換,首先需要quorum數(shù)量的哨兵認(rèn)為odown,然后選舉出一個哨兵來做切換,這個哨兵還得得到majority哨兵的特權(quán),才能進(jìn)行切換。

  4. 如果quorum<majority,比如5個哨兵,majority就是3,quorum·設(shè)置為2,那么3個哨兵授權(quán)可以執(zhí)行切換,但是如果quorum>majority,那么必須quorum數(shù)量的哨兵都授權(quán),比如5個哨兵,quorum是5,那么必須5個哨兵都同意授權(quán)才能執(zhí)行。(誰多聽誰的)

為什么哨兵至少3個節(jié)點(diǎn)?

哨兵集群必須部署兩個以上節(jié)點(diǎn)。如果哨兵集群僅僅部署了2個哨兵實(shí)例,那么它的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),如果其中一個哨兵宕機(jī)了,就無法滿足majority>=2這個條件,那么master發(fā)生故障時也就無法進(jìn)行主從切換了。

工作原理

Redis哨兵機(jī)制講解

  1. 每個Sentienl以每秒鐘一次的頻率向他所知的Master,Slave以及其他的Sentinel實(shí)例發(fā)送一個ping命令

  2. 如果一個實(shí)例距離最后一次有效回復(fù)ping命令的時間超過了down-after-milliseconds選項(xiàng)所指的值,則這個實(shí)例會被Sentinel標(biāo)記為主觀宕機(jī)

  3. 如果一個master被標(biāo)記為主觀宕機(jī),則正在監(jiān)視這個master的所有sentinel要以每一秒一次的頻率確認(rèn)Master的確進(jìn)入了主觀宕機(jī)狀態(tài)

  4. 當(dāng)有足夠數(shù)量的Sentinel(大于等于配置文件所指的值)在指定的時間范圍內(nèi)確認(rèn)master的確進(jìn)入了主觀宕機(jī)狀態(tài),則master會被標(biāo)記為客觀狀態(tài)

  5. 在一般情況下,每個Sentinel會以1次/10秒的頻率向他一致的所有master,slave發(fā)送INFO命令

  6. 當(dāng)master被Sentinel標(biāo)記為客觀宕機(jī)是,Sentinel向下線的master的所有slave發(fā)送INFO命令的頻率會從1次/10秒改為1次/秒

  7. 若沒有足夠數(shù)量的Sentinel同意master已經(jīng)下線,master的客觀宕機(jī)狀態(tài)就會被移除;若master重新想Sentinel的ping命令返回有效回復(fù),master的主觀宕機(jī)狀態(tài)就會被移除。

哨兵模式的配置

首先配置redis的主從服務(wù)器,修改redis.conf文件如下

# 使得Redis服務(wù)器可以跨網(wǎng)絡(luò)訪問
bind 0.0.0.0
# 設(shè)置密碼
requirepass "123456"
# 指定主服務(wù)器,注意:有關(guān)slaveof的配置只是配置從服務(wù)器,主服務(wù)器不需要配置
slaveof 192.168.11.128 6379
# 主服務(wù)器密碼,注意:有關(guān)slaveof的配置只是配置從服務(wù)器,主服務(wù)器不需要配置
masterauth 123456

上述內(nèi)容主要是配置Redis服務(wù)器,從服務(wù)器比主服務(wù)器多了一個slaveof的配置和密碼

配置3個哨兵,每個哨兵都是一樣的。在Redis安裝目錄下有一個sentinel.conf文件,copy一份進(jìn)行修改

# 禁止保護(hù)模式
protected-mode no
# 配置監(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 192.168.11.128 6379 2
# sentinel author-pass定義服務(wù)的密碼,mymaster是服務(wù)名稱,123456是Redis服務(wù)器密碼
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

啟動服務(wù)器和哨兵,進(jìn)入Redis安裝目錄的src目錄

# 啟動Redis服務(wù)器進(jìn)程
./redis-server ../redis.conf
# 啟動哨兵進(jìn)程
./redis-sentinel ../sentinel.conf
注意啟動順序:  首先是主機(jī)(192.168.11.128)的Redis服務(wù)進(jìn)程,然后啟動叢機(jī)的服務(wù)進(jìn)程,最后啟動3個哨兵的服務(wù)進(jìn)程  

Java中使用哨兵模式

/**
* 測試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("192.168.11.128:26379",
               "192.168.11.129:26379","192.168.11.130: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);
   }
}

感謝各位的閱讀,以上就是“Redis哨兵機(jī)制講解”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Redis哨兵機(jī)制講解這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI