自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

超全面分布式緩存高可用方案:哨兵機(jī)制

開發(fā) 前端 新聞 分布式
開發(fā)工作中對于分布式緩存高可用方案(搭建Redis緩存高可用方案),Redis主從架構(gòu)下是如何保證高可用的呢?

 開發(fā)工作中對于分布式緩存高可用方案(搭建Redis緩存高可用方案),Redis主從架構(gòu)下是如何保證高可用的呢?

我們知道是應(yīng)用了哨兵機(jī)制來實現(xiàn)。那Redis 服務(wù)部署的哨兵模式主要是什么,又解決了什么問題呢,于是利用周末時間整理了下,相信看完這篇文章,你也可以去給別人做技術(shù)分享了。O(∩_∩)O哈哈~

問題鋪墊

在討論哨兵模式之前,我們先來看一個應(yīng)用問題: Redis服務(wù)主機(jī)宕機(jī)

實際使用過程中,會出現(xiàn)master宕機(jī)的情況(這樣會導(dǎo)致沒有寫服務(wù),只有讀服務(wù))。那我們要保證服務(wù)的可用,就需要從其他salve節(jié)點中選取一個來作為master節(jié)點,來繼續(xù)提供服務(wù)能力。

那主要的動作抽象下:

  • 將宕機(jī)的master下線

  • 找一個slave作為master

  • 通知所有的slave連接新的master

  • 全量數(shù)據(jù)或者部分?jǐn)?shù)據(jù)同步

其中存在幾個問題:

  • 誰來確認(rèn)master宕機(jī)?(假如僅僅是網(wǎng)絡(luò)抖動了一下,就把我宕掉么?)

  • 如何從slave中找一個master代替,誰來找?怎么找?有什么依據(jù)?

  • 修改配置后,原始的主恢復(fù)了怎么辦?

其實引入 哨兵機(jī)制 ,就可以很好的解決上述問題。

哨兵-Redis集群

什么是哨兵?

Sentinel(哨兵)是Redis 的高可用性解決方案:由一個或多個Sentinel 實例組成的Sentinel 系統(tǒng)可以監(jiān)視任意多個主服務(wù),以及這些主服務(wù)器屬下的所有從服務(wù),并在被監(jiān)視的主服務(wù)進(jìn)入下線(不可服務(wù))狀態(tài)時,自動將下線主服務(wù)器屬下的某個從服務(wù)器升級為新的主服務(wù)器。

 

總結(jié)一下哨兵的作用:

  • 集群監(jiān)控

不斷的檢查master和slave是否正常運(yùn)行(master存活檢測、master與slave運(yùn)行情況檢測)

  • 消息通知

當(dāng)被監(jiān)控的服務(wù)器出現(xiàn)問題時,向其他哨兵、客戶端發(fā)送通知

  • 自動故障轉(zhuǎn)移

斷開故障master與slave的連接,選取一個slave作為新master,將其他slave連接到新的master并告知客戶端新的服務(wù)器地址。

注意:哨兵也是一臺Redis服務(wù)器,只是不提供數(shù)據(jù)服務(wù);通常哨兵配置的數(shù)量為單數(shù)。

哨兵的工作原理

下面主要針對哨兵在進(jìn)行故障轉(zhuǎn)移過程中經(jīng)歷的三個階段分別進(jìn)行闡述。

1、集群監(jiān)控

step1:哨兵1連接到Redis集群

  • 發(fā)送info命令到master,并建立cmd連接;

  • 哨兵端保存哨兵狀態(tài)(SentinelStatus),保存所有哨兵狀態(tài),主節(jié)點和從節(jié) 點的信息;master端會記錄 redis 實例的信息(SentinelRedisInstance);

  • 哨兵根據(jù)master中獲取的每個slave信息,去連接每個slave,發(fā)送同樣也是info命令。

集群監(jiān)控

step2:哨兵2加入進(jìn)來后

  • 同樣會發(fā)送info命令到master節(jié)點,并建立cmd連接;

  • 發(fā)現(xiàn)master中存在其他哨兵節(jié)點的信息,哨兵2中保存哨兵信息(區(qū)別與哨兵1的是它保存了哨兵1和哨兵2的2個哨兵節(jié)點信息);

  • 為了每個哨兵的信息都一致它們之間建立了一個發(fā)布訂閱。為了哨兵之間的信息長期對稱它們之間也會互發(fā) ping 命令。

集群監(jiān)控

step3:哨兵3加入后

  • 同樣進(jìn)行哨兵1、2的動作,會發(fā)送info命令到master節(jié)點,并建立cmd連接;

  • 為了保證哨兵1-哨兵2之間的信息是同步的,建立了一個發(fā)布訂閱的一個隊列(可以互發(fā)ping命令)

集群監(jiān)控

小結(jié)一下:

  • Sentinel會向master、slave以及其他Sentinel獲取狀態(tài);

  • Sentinel之間會組建“對應(yīng)頻道”,大家一起發(fā)布信息、訂閱信息、收信息、同步信息等。

2、消息通知

1)Sentinel節(jié)點會通過master/slave 節(jié)點建立的cmd連接獲取其工作狀態(tài)

2)Sentinel收到反饋結(jié)果之后,會在哨兵內(nèi)部進(jìn)行信息的互通

消息通知

3、故障轉(zhuǎn)移

關(guān)于故障轉(zhuǎn)移,嚴(yán)格來講可劃分兩個步驟: 故障判定 、 故障轉(zhuǎn)移 。

Q1:如何判斷一個節(jié)點出現(xiàn)故障?

  • 哨兵會一直給主節(jié)點發(fā)送 publish sentinel:hello

直到主節(jié)點故障,哨兵報出 sdown,同時此哨兵還會向其他哨兵發(fā)布消息說這個主節(jié)點掛了。發(fā)送的指令是 sentinel is-master-down-by-address-port。

  •  其余的哨兵接收到指令后,主節(jié)點掛了嗎?讓我去看看到底掛沒掛。發(fā)送的信息也是 hello。

其余的哨兵也會發(fā)送他們收到的信息并且發(fā)送指令 sentinel is-master-down-by-address-port 到自己的內(nèi)網(wǎng),確認(rèn)一下第一個發(fā)送 sentinel is-master-down-by-address-port 的哨兵說你說的對,這個家伙確實掛了。

  •  當(dāng)所有人都認(rèn)為主節(jié)點掛了后就會修改其狀態(tài)為 odown。

當(dāng)一個哨兵認(rèn)為主節(jié)點掛了標(biāo)記的是 sdown,當(dāng)半數(shù)哨兵都認(rèn)為掛了其標(biāo)記的狀態(tài)是 odown。

 

一個哨兵認(rèn)為master節(jié)點掛了稱為主觀下線(sdown),超半數(shù)哨兵認(rèn)為master節(jié)點掛了則稱為客觀下線(odown)。

Q2:如何進(jìn)行故障轉(zhuǎn)移?

1)首先,哨兵選舉出哨兵Leader去處理故障轉(zhuǎn)移

此時選舉方式應(yīng)用的是Raft協(xié)議,這個之前有過介紹,感興趣的同學(xué)可以移步了解: 一致性算法Raft 簡易入門

2)其次,哨兵Leader從所有的slave節(jié)點找出一個作為master節(jié)點

主要的規(guī)則:

  • 選擇在線的節(jié)點,pass掉已下線的節(jié)點;

  • 選擇響應(yīng)速度快的,pass掉響應(yīng)慢的節(jié)點

  • 選擇與原master斷開時間短的,pass掉斷開時間較長的;

假如以上優(yōu)先級均一致,會考慮其他優(yōu)先原則:

  • 偏移量較大

假如說 slave1 的 offset 為 50,slave2 偏移量為 55,則哨兵就會選擇 slave2 為新的主節(jié)點。

  •  runid偏大的

這點類似于職場中的論資排輩,也就說根據(jù) runid 的創(chuàng)建時間來判斷,時間早的先上位。

 

3)數(shù)據(jù)轉(zhuǎn)移

  • 新master上任:Sentinel向新的master發(fā)送slaveof no one

  • 其他slave周知:向其他slave發(fā)送slaveof 新master IP端口

總結(jié)

Redis 主從復(fù)制的作用中有這么一句話“主從復(fù)制是高可用的基石”,那實現(xiàn)高可用必不可少的就是哨兵和集群。

1、Sentinel的作用

  • 集群監(jiān)控

不斷的檢查master和slave是否正常運(yùn)行(master存活檢測、master與slave運(yùn)行情況檢測)

  • 消息通知

當(dāng)被監(jiān)控的服務(wù)器出現(xiàn)問題時,向其他哨兵、客戶端發(fā)送通知

  • 自動故障轉(zhuǎn)移

斷開故障master與slave的連接,選取一個slave作為新master,將其他slave連接到新的master并告知客戶端新的服務(wù)器地址。

2、Sentinel的工作方式

  • 每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發(fā)送一個 PING 命令 

  • 如果一個實例(Instance)距離最后一次有效回復(fù) PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標(biāo)記為主觀下線。

若 Master 重新向 Sentinel 的 PING 命令返回有效回復(fù), Master 的主觀下線狀態(tài)就會被移除。

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

  • 當(dāng)有足夠數(shù)量的 Sentinel(>=配置文件指定的值)在指定的時間范圍內(nèi)確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài), 則 Master會被標(biāo)記為客觀下線   

若沒有足夠數(shù)量的 Sentinel 同意 Master 已經(jīng)下線, Master 的客觀下線狀態(tài)就會被移除。

  • 在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令 

  • 當(dāng)Master被 Sentinel 標(biāo)記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次

 

責(zé)任編輯:張燕妮 來源: 架構(gòu)精進(jìn)之路
相關(guān)推薦

2021-09-23 12:14:50

Redis分布式優(yōu)化

2019-12-04 14:59:01

分布式緩存高可用

2017-12-12 14:51:15

分布式緩存設(shè)計

2022-05-11 13:55:18

高可用性分布式彈性

2019-10-16 10:34:33

數(shù)據(jù)庫大數(shù)據(jù)腳本語言

2024-05-20 08:08:00

分布式系統(tǒng)緩存C#

2025-04-01 01:04:00

Redis集群緩存

2023-11-12 00:10:07

Redis高可用

2023-05-12 11:52:21

緩存場景性能

2023-02-28 07:01:11

分布式緩存平臺

2013-06-13 11:29:14

分布式分布式緩存

2019-02-18 11:16:12

Redis分布式緩存

2022-01-10 19:45:40

微服務(wù)GO系統(tǒng)

2022-05-09 09:42:24

高可用分布式數(shù)據(jù)庫

2021-08-26 00:23:14

分布式存儲高可用

2018-12-14 10:06:22

緩存分布式系統(tǒng)

2018-02-07 10:46:20

數(shù)據(jù)存儲

2024-01-10 08:02:03

分布式技術(shù)令牌,

2023-01-13 07:39:07

2011-07-08 15:02:07

點贊
收藏

51CTO技術(shù)棧公眾號