Redis哨兵原理是什么?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
先簡單說幾句我們在配置主從復(fù)制時(shí)有一種情況就是主節(jié)點(diǎn)宕機(jī)了,誰來提供服務(wù)呢!
當(dāng)主節(jié)點(diǎn)宕機(jī)后主從復(fù)制就沒有存在的意義了,數(shù)據(jù)為王的時(shí)代沒有了數(shù)據(jù)何談什么高可用。
這個(gè)時(shí)候就橫空出世了一位老大哥名叫
哨兵
,老大哥說這個(gè)問題我來幫你們處理。
既然主節(jié)點(diǎn)master作為老大不領(lǐng)你們玩了。我就從你們四個(gè)中間再挑選出來一位老大,然后你們跟著他玩。
等不帶你們玩的那個(gè)老大回來后他的身份就失效了,就不在是你們的老大了。他只能跟著我挑選出來的老大玩。
上邊這段對(duì)話過程就是我們配置哨兵的意義到底在哪,跟誰玩就是誰給誰數(shù)據(jù),知道了哨兵的作用我們就在繼續(xù)。
「最后我們用專業(yè)術(shù)語來解釋一下什么是哨兵?!?/strong>
哨兵,英文名sentinel,是一個(gè)分布式系統(tǒng),用于對(duì)主從結(jié)構(gòu)中的每一臺(tái)服務(wù)器進(jìn)行監(jiān)控
,當(dāng)主節(jié)點(diǎn)出現(xiàn)故障后通過投票機(jī)制來挑選新的主節(jié)點(diǎn),并且將所有的從節(jié)點(diǎn)連接到新的主節(jié)點(diǎn)上。
上文中我們談到的對(duì)話過程就是哨兵的作用之一自動(dòng)故障轉(zhuǎn)移。
談到作用肯定就是這個(gè)哨兵到底在工作中到底干了什么事情。我們先用比較干巴的概念描述一下,然后在下文的工作原理會(huì)一一談到。
哨兵的三個(gè)作用監(jiān)控、通知、自動(dòng)轉(zhuǎn)移故障
這里有一個(gè)注意點(diǎn),哨兵也是一臺(tái)redis服務(wù)器,只是不對(duì)外提供任何服務(wù)。
配置哨兵時(shí)配置為單數(shù)。那么為什么配置哨兵服務(wù)器的數(shù)量為單數(shù)呢?帶著這個(gè)疑問你會(huì)在下文看到你想要的答案。
這一章我們就開始配置哨兵,前期工作準(zhǔn)備。下圖就是咔咔的準(zhǔn)備工作。開啟8個(gè)客戶端,三個(gè)哨兵、一個(gè)主節(jié)點(diǎn)、倆個(gè)從節(jié)點(diǎn)、一個(gè)主節(jié)點(diǎn)客戶端、一個(gè)從節(jié)點(diǎn)客戶端。
哨兵使用的配置文件是sentinel.conf
我們來對(duì)sentinel.conf配置信息進(jìn)行解讀
但是大多數(shù)都是注釋,這里咔咔給大家提供一個(gè)命令來過濾這些無用信息
cat sentinel.conf | grep -v '#' | grep -v '^$'
使用命令cat sentinel.conf | grep -v '#' | grep -v '^$' > ./data/sentinel-26379.conf
把sentinel.conf過濾后的信息移到/usr/local/redis/conf
下然后打開
sentinel-26379.conf
修改信息存放目錄然后快速的復(fù)制倆個(gè)哨兵配置文件,端口為26380和26381。
sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf
測試主從復(fù)制處于正常工作狀態(tài),啟動(dòng)三臺(tái)redis服務(wù)器,端口分別為6379、6380、6381
查看主節(jié)點(diǎn)信息,是有倆臺(tái)從節(jié)點(diǎn)在連接著,端口分別為6380、6381。
這里有一個(gè)小小的點(diǎn)就是lag怎么一個(gè)是1一個(gè)是0呢!lag是延遲時(shí)間,我這里是本地測試所以會(huì)出現(xiàn)0的情況,使用云服務(wù)器是很少出現(xiàn)的。lag的值為0和1都屬于正常。測試主節(jié)點(diǎn)添加一個(gè)hash值,
hset kaka name kaka
分別從slave1和slave2獲取kaka的值,檢測主從復(fù)制是否正常運(yùn)行。
經(jīng)過測試我們的主從結(jié)構(gòu)是正常運(yùn)行的。啟動(dòng)一個(gè)哨兵
redis-sentinel 26379-sentinel.conf
連接26379哨兵,主要是最后一行,監(jiān)控的主節(jié)點(diǎn)名為mymaster,狀態(tài)正常,從節(jié)點(diǎn)有倆個(gè),哨兵數(shù)量為1個(gè)
在來查看一下26379的哨兵配置信息,這個(gè)時(shí)候已經(jīng)改動(dòng)了
在啟動(dòng)一個(gè)
26380
的哨兵,redis-sentinel 26380-sentinel.conf
,這里注意一下最后一行多了一條信息,這個(gè)id就是我們26379
配置文件新增的id然后我們來到哨兵26379的客戶端,同樣也是新增的26380哨兵的id
這個(gè)時(shí)候我們在查看一下26379哨兵的配置文件,第一次查看配置文件是沒有配置26380哨兵的,第二次查看時(shí)配置了26380哨兵后添加的信息。
最后我們需要把哨兵客戶端3啟動(dòng)起來,端口號(hào)為26381。啟動(dòng)起來之后,我們的配置信息和服務(wù)端的信息也會(huì)改動(dòng),添加哨兵26380有的信息,哨兵26381也會(huì)有。
直到這里我們對(duì)哨兵的配置就結(jié)束了,接下來我們把主節(jié)點(diǎn)master給宕掉等待30秒后我們來到26379哨兵的客戶端,這里新增了一些信息,那么這些信息都做了什么呢!讓我們細(xì)細(xì)道來。
這里邊的信息我們先需要知道幾個(gè)
當(dāng)我們在重新把6379的redis服務(wù)器上線后,就可以看到哨兵服務(wù)端響應(yīng)了倆句。一句是去除6379的下線。最后一句就是重連6379到新的主節(jié)點(diǎn)上。這個(gè)時(shí)候主節(jié)點(diǎn)就是6380了,在6380的redis客戶端設(shè)置值,檢測主從復(fù)制是否正常工作。
在新的主節(jié)點(diǎn)6380添加list類型在6379和6381獲取這個(gè)值,至此呢!我們的哨兵模式就配置完成了。
配置完哨兵后,就需要對(duì)其工作原理進(jìn)行解析了,只有知道其工作流程,才能對(duì)哨兵有更好的理解。
本文講解原理沒有那么干巴!讓你可以把一篇技術(shù)文章當(dāng)故事去看。
進(jìn)入正題,哨兵作用是監(jiān)控、通知、故障轉(zhuǎn)移。那么工作原理也是圍繞這三點(diǎn)來講的。
Sentinel會(huì)給主從的所有節(jié)點(diǎn)發(fā)送命令獲取其狀態(tài),并且會(huì)把信息發(fā)布到哨兵的訂閱里。
sentinel is-master-down-by-address-port
sentinel is-master-down-by-address-port
到自己的內(nèi)網(wǎng),確認(rèn)一下第一個(gè)發(fā)送sentinel is-master-down-by-address-port
的哨兵說你說的對(duì),這個(gè)家伙確實(shí)掛了。當(dāng)所有人都認(rèn)為主節(jié)點(diǎn)掛了后就會(huì)修改其狀態(tài)為odown
。當(dāng)一個(gè)哨兵認(rèn)為主節(jié)點(diǎn)掛了標(biāo)記的是sdown
,當(dāng)半數(shù)哨兵都認(rèn)為掛了其標(biāo)記的狀態(tài)是odown
。這也就是配置哨兵為什么配置單數(shù)的原因。?這時(shí)哨兵已經(jīng)檢測到問題所在了,那么到底是那個(gè)哨兵去負(fù)責(zé)推選新的主節(jié)點(diǎn)呢!不能是張三也去,李四也去,王五也去,這樣就亂套了、于是就需要在所有的哨兵里選出領(lǐng)頭的,那么是如何選的呢!請看下圖。
?
這個(gè)時(shí)候呢!五個(gè)sentinel就在一起開會(huì)了,所有的哨兵都在一個(gè)內(nèi)網(wǎng)中,然后他們會(huì)做一件事情就是五個(gè)sentinel會(huì)同時(shí)發(fā)送指令sentinel is-master-down-by-address-port
并且攜帶上自己競選次數(shù)和runid。每個(gè)sentinel既是參選者也是投票者,每個(gè)sentinel都有一票,信封就代表自己的投票權(quán)。
當(dāng)sentinel1和sentinel4同時(shí)把指令發(fā)送到群里準(zhǔn)備競選時(shí),sentinel2這個(gè)時(shí)候就說我先接到誰的指令就把票投給誰。假如sentinel1發(fā)的早,那么sentinel2的票就會(huì)投給sentinel1。
按照這樣的規(guī)則一直發(fā)起投票直到有一個(gè)sentinel的票數(shù)為總sentinel數(shù)量的一半之多。假設(shè)說是sentinel1的票數(shù)滿足總哨兵數(shù)量的一半之多后,sentinel1就會(huì)當(dāng)選。這個(gè)時(shí)候就進(jìn)行到了下一個(gè)階段。
在上邊哨兵已經(jīng)選出了sentinel1為代表去所有的從節(jié)點(diǎn)找出一個(gè)作為主節(jié)點(diǎn)。這個(gè)挑選主節(jié)點(diǎn)不是隨便拿一個(gè)是有一定的規(guī)則的。
先把不在線的干掉
響應(yīng)慢的干掉,sentinel會(huì)給所有的redis發(fā)送信息,響應(yīng)速度慢的就會(huì)被干掉
與原主節(jié)點(diǎn)斷開時(shí)間最久的干掉,這里由于演示不夠用了,所有新增了一個(gè)slave5,沒有任何意義哈!
以上三個(gè)點(diǎn)都判斷結(jié)束后還有salve4和slave5,就會(huì)根據(jù)優(yōu)先原則來進(jìn)行篩選。
選出新的主節(jié)點(diǎn)后就要對(duì)所有的節(jié)點(diǎn)發(fā)送指令了。
關(guān)于哨兵的所有知識(shí)點(diǎn)就已經(jīng)說完了,本文最重要的就是哨兵的工作原理了。我們在簡單的梳理一下其工作原理。
首先進(jìn)行監(jiān)控,并且所有的哨兵同步信息
哨兵向訂閱里邊發(fā)布信息
故障轉(zhuǎn)移
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)Redis哨兵原理是什么大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。