亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    Redis哨兵原理,我忍你很久了!

    ?

    redis主從復(fù)制的作用中有這么一句話“主從復(fù)制是高可用的基石”,那什么是高可用呢!高可用就是減少系統(tǒng)不能提供的時間,也就是常聽到的以6個9為基準(zhǔn)。實(shí)現(xiàn)高可用必不可少的就是哨兵和集群。本文主要介紹哨兵機(jī)制。

    ?

    前言

    ?

    咔咔整理了一個路線圖,打造一份面試寶典,準(zhǔn)備按照這樣的路線圖進(jìn)行編寫文章,后期發(fā)現(xiàn)沒有補(bǔ)充到的知識點(diǎn)在進(jìn)行添加。也期待各位伙伴一起來幫助補(bǔ)充一下。評論區(qū)見哦!

    ?

    Redis哨兵原理,我忍你很久了!
    在這里插入圖片描述

    本文主要圍繞如下幾個方面介紹哨兵

    • 哨兵介紹
    • 哨兵配置
    • 哨兵工作原理

    本文實(shí)現(xiàn)環(huán)境

    • centos7.3 redis4.0
    • redis工作目錄 /usr/local/redis
    • 在虛擬機(jī)進(jìn)行模擬操作

    一、什么是哨兵

    先簡單說幾句我們在配置主從復(fù)制時有一種情況就是主節(jié)點(diǎn)宕機(jī)了,誰來提供服務(wù)呢!

    當(dāng)主節(jié)點(diǎn)宕機(jī)后主從復(fù)制就沒有存在的意義了,數(shù)據(jù)為王的時代沒有了數(shù)據(jù)何談什么高可用。

    Redis哨兵原理,我忍你很久了!這個時候就橫空出世了一位老大哥名叫哨兵,老大哥說這個問題我來幫你們處理。

    既然主節(jié)點(diǎn)master作為老大不領(lǐng)你們玩了。我就從你們四個中間再挑選出來一位老大,然后你們跟著他玩。

    等不帶你們玩的那個老大回來后他的身份就失效了,就不在是你們的老大了。他只能跟著我挑選出來的老大玩。

    上邊這段對話過程就是我們配置哨兵的意義到底在哪,跟誰玩就是誰給誰數(shù)據(jù),知道了哨兵的作用我們就在繼續(xù)。

    「最后我們用專業(yè)術(shù)語來解釋一下什么是哨兵。」

    哨兵,英文名sentinel,是一個分布式系統(tǒng),用于對主從結(jié)構(gòu)中的每一臺服務(wù)器進(jìn)行監(jiān)控,當(dāng)主節(jié)點(diǎn)出現(xiàn)故障后通過投票機(jī)制來挑選新的主節(jié)點(diǎn),并且將所有的從節(jié)點(diǎn)連接到新的主節(jié)點(diǎn)上。

    二、哨兵的作用

    上文中我們談到的對話過程就是哨兵的作用之一自動故障轉(zhuǎn)移。

    談到作用肯定就是這個哨兵到底在工作中到底干了什么事情。我們先用比較干巴的概念描述一下,然后在下文的工作原理會一一談到。

    哨兵的三個作用監(jiān)控、通知、自動轉(zhuǎn)移故障

    • 監(jiān)控

      • 監(jiān)控誰?支持主從結(jié)構(gòu)的工作一個是主節(jié)點(diǎn)一個是從節(jié)點(diǎn),那肯定就是監(jiān)控這倆個了。
      • 監(jiān)控主節(jié)點(diǎn)和從節(jié)點(diǎn)是否正常運(yùn)行
      • 檢測主節(jié)點(diǎn)是否存活,主節(jié)點(diǎn)和從節(jié)點(diǎn)運(yùn)行情況
    • 通知

      • 哨兵檢測的服務(wù)器出現(xiàn)問題時,會向其他的哨兵發(fā)送通知,哨兵之間就相當(dāng)于一個微信群,每個哨兵發(fā)現(xiàn)的問題都會發(fā)在這個群里。
    • 自動故障轉(zhuǎn)移

      • 當(dāng)檢測到主節(jié)點(diǎn)宕機(jī)后,斷開與宕機(jī)主節(jié)點(diǎn)連接的所有從節(jié)點(diǎn),在從節(jié)點(diǎn)中選取一個作為主節(jié)點(diǎn),然后將其他的從節(jié)點(diǎn)連接到這個最新主節(jié)點(diǎn)的上。并且告知客戶端最新的服務(wù)器地址。

    這里有一個注意點(diǎn),哨兵也是一臺redis服務(wù)器,只是不對外提供任何服務(wù)。

    配置哨兵時配置為單數(shù)。那么為什么配置哨兵服務(wù)器的數(shù)量為單數(shù)呢?帶著這個疑問你會在下文看到你想要的答案。

    二、如何配置哨兵

    1. 準(zhǔn)備工作

    這一章我們就開始配置哨兵,前期工作準(zhǔn)備。下圖就是咔咔的準(zhǔn)備工作。開啟8個客戶端,三個哨兵、一個主節(jié)點(diǎn)、倆個從節(jié)點(diǎn)、一個主節(jié)點(diǎn)客戶端、一個從節(jié)點(diǎn)客戶端。Redis哨兵原理,我忍你很久了!

    2. sentinel.conf配置解讀

    哨兵使用的配置文件是sentinel.confRedis哨兵原理,我忍你很久了!我們來對sentinel.conf配置信息進(jìn)行解讀Redis哨兵原理,我忍你很久了!但是大多數(shù)都是注釋,這里咔咔給大家提供一個命令來過濾這些無用信息 cat sentinel.conf | grep -v '#' | grep -v '^$'Redis哨兵原理,我忍你很久了!

    • port 26379 :對外服務(wù)端口號
    • dir /tmp:存儲哨兵的工作信息
    • sentinel monitor mymaster 127.0.0.1 6379 2:監(jiān)控的是誰,名字可以自定義,后邊的2代表的是,如果有倆個哨兵判斷這個主節(jié)點(diǎn)掛了那這個主節(jié)點(diǎn)就掛了,通常設(shè)置為哨兵個數(shù)一半加一。
    • sentinel down-after-milliseconds mymaster 30000:哨兵連接主節(jié)點(diǎn)多長時間沒有響應(yīng)就代表掛了。后邊30000是毫秒,也就是30秒。
    • sentinel parallel-syncs mymaster 1:這個配置項是指在故障轉(zhuǎn)移時,最多有多少個從節(jié)點(diǎn)對新的主節(jié)點(diǎn)進(jìn)行同步。這個值越小完成故障轉(zhuǎn)移的時間就越長,這個值越大就意味著越 多的從節(jié)點(diǎn)因為同步數(shù)據(jù)而不可用。
    • sentinel failover-timeout mymaster 180000:在進(jìn)行同步的過程中,多長時間完成算有效,系統(tǒng)默認(rèn)值是3分鐘。

    3. 開始配置

    使用命令cat sentinel.conf | grep -v '#' | grep -v '^$' > ./data/sentinel-26379.conf把sentinel.conf過濾后的信息移到/usr/local/redis/confRedis哨兵原理,我忍你很久了!然后打開sentinel-26379.conf修改信息存放目錄Redis哨兵原理,我忍你很久了!然后快速的復(fù)制倆個哨兵配置文件,端口為26380和26381。sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf

    Redis哨兵原理,我忍你很久了!
    在這里插入圖片描述

    測試主從復(fù)制處于正常工作狀態(tài),啟動三臺redis服務(wù)器,端口分別為6379、6380、6381Redis哨兵原理,我忍你很久了!查看主節(jié)點(diǎn)信息,是有倆臺從節(jié)點(diǎn)在連接著,端口分別為6380、6381。

    這里有一個小小的點(diǎn)就是lag怎么一個是1一個是0呢!lag是延遲時間,我這里是本地測試所以會出現(xiàn)0的情況,使用云服務(wù)器是很少出現(xiàn)的。lag的值為0和1都屬于正常。Redis哨兵原理,我忍你很久了!測試主節(jié)點(diǎn)添加一個hash值,hset kaka name kakaRedis哨兵原理,我忍你很久了!分別從slave1和slave2獲取kaka的值,檢測主從復(fù)制是否正常運(yùn)行。

    經(jīng)過測試我們的主從結(jié)構(gòu)是正常運(yùn)行的。Redis哨兵原理,我忍你很久了!Redis哨兵原理,我忍你很久了!啟動一個哨兵redis-sentinel 26379-sentinel.confRedis哨兵原理,我忍你很久了!連接26379哨兵,主要是最后一行,監(jiān)控的主節(jié)點(diǎn)名為mymaster,狀態(tài)正常,從節(jié)點(diǎn)有倆個,哨兵數(shù)量為1個Redis哨兵原理,我忍你很久了!在來查看一下26379的哨兵配置信息,這個時候已經(jīng)改動了Redis哨兵原理,我忍你很久了!在啟動一個26380的哨兵,redis-sentinel 26380-sentinel.conf,這里注意一下最后一行多了一條信息,這個id就是我們26379配置文件新增的idRedis哨兵原理,我忍你很久了!然后我們來到哨兵26379的客戶端,同樣也是新增的26380哨兵的idRedis哨兵原理,我忍你很久了!這個時候我們在查看一下26379哨兵的配置文件,第一次查看配置文件是沒有配置26380哨兵的,第二次查看時配置了26380哨兵后添加的信息。Redis哨兵原理,我忍你很久了!最后我們需要把哨兵客戶端3啟動起來,端口號為26381。啟動起來之后,我們的配置信息和服務(wù)端的信息也會改動,添加哨兵26380有的信息,哨兵26381也會有。

    直到這里我們對哨兵的配置就結(jié)束了,接下來我們把主節(jié)點(diǎn)master給宕掉Redis哨兵原理,我忍你很久了!等待30秒后我們來到26379哨兵的客戶端,這里新增了一些信息,那么這些信息都做了什么呢!讓我們細(xì)細(xì)道來。

    Redis哨兵原理,我忍你很久了!這里邊的信息我們先需要知道幾個

    • +sdown :這個信息后是指三個哨兵里邊有一個認(rèn)為主節(jié)點(diǎn)宕機(jī)了
    • +odown:這個信息是指其他倆個哨兵去連接了一下主節(jié)點(diǎn),發(fā)現(xiàn)確實(shí)是主節(jié)點(diǎn)宕機(jī)了
    • 然后發(fā)起了一輪投票,這里咔咔使用的是redis4.0,版本之間這塊信息有點(diǎn)差異
    • +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380:直到這里是哨兵發(fā)起投票的結(jié)果,推選端口為6380的redis為主節(jié)點(diǎn)
    • +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380:這里就把端口為6381與6379和新的主節(jié)點(diǎn)6380做了一個連接
    • +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380:最后一句是端口為6379的還是沒有上線,于是給踢下線

    當(dāng)我們在重新把6379的redis服務(wù)器上線后,就可以看到哨兵服務(wù)端響應(yīng)了倆句。一句是去除6379的下線。最后一句就是重連6379到新的主節(jié)點(diǎn)上。Redis哨兵原理,我忍你很久了!Redis哨兵原理,我忍你很久了!這個時候主節(jié)點(diǎn)就是6380了,在6380的redis客戶端設(shè)置值,檢測主從復(fù)制是否正常工作。

    在新的主節(jié)點(diǎn)6380添加list類型Redis哨兵原理,我忍你很久了!在6379和6381獲取這個值,至此呢!我們的哨兵模式就配置完成了。Redis哨兵原理,我忍你很久了!Redis哨兵原理,我忍你很久了!

    三、哨兵工作原理

    配置完哨兵后,就需要對其工作原理進(jìn)行解析了,只有知道其工作流程,才能對哨兵有更好的理解。

    本文講解原理沒有那么干巴!讓你可以把一篇技術(shù)文章當(dāng)故事去看。

    進(jìn)入正題,哨兵作用是監(jiān)控、通知、故障轉(zhuǎn)移。那么工作原理也是圍繞這三點(diǎn)來講的。

    1. 監(jiān)控工作流程

    Redis哨兵原理,我忍你很久了!
    在這里插入圖片描述
    1. 哨兵發(fā)送info指令,并且保存所有哨兵狀態(tài),主節(jié)點(diǎn)和從節(jié)點(diǎn)的信息
    2. 主節(jié)點(diǎn)會記錄redis實(shí)例的信息,主節(jié)點(diǎn)記錄的信息跟哨兵記錄的信息看起來是一樣的,實(shí)際上還是有點(diǎn)區(qū)別哈。
    3. 哨兵會根據(jù)在主節(jié)點(diǎn)拿到的從節(jié)點(diǎn)信息,給對應(yīng)的從節(jié)點(diǎn)也發(fā)送info指令
    4. 接著哨兵2來了,同樣的也會改主節(jié)點(diǎn)發(fā)送info指令,并且建立cmd連接
    5. 這個時候哨兵2也會保存跟哨兵1一樣的信息,只不過是保存的哨兵信息是2個。
    6. 這個時候為了每個哨兵的信息都一致它們之間建立了一個發(fā)布訂閱。為了哨兵之間的信息長期對稱它們之間也會互發(fā)ping命令。
    7. 當(dāng)再來一個哨兵3時,也會做同樣的事情,給主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送info。并且跟哨兵1和哨兵2建立連接。

    2. 通知工作流程

    Sentinel會給主從的所有節(jié)點(diǎn)發(fā)送命令獲取其狀態(tài),并且會把信息發(fā)布到哨兵的訂閱里。Redis哨兵原理,我忍你很久了!

    3. 故障轉(zhuǎn)移原理(本文重點(diǎn))

    Redis哨兵原理,我忍你很久了!
    在這里插入圖片描述
    • 哨兵會一直給主節(jié)點(diǎn)發(fā)送publish sentinel :hello,直到哨兵報出sdown,這個詞這會是有不是有點(diǎn)熟悉了。沒錯就是我們上文中把主節(jié)點(diǎn)斷開后哨兵服務(wù)端報出的信息。哨兵報出主節(jié)點(diǎn)sdown后還沒有完,哨兵還會往內(nèi)網(wǎng)里發(fā)布消息說明這個主節(jié)點(diǎn)掛了。發(fā)送的指令是sentinel is-master-down-by-address-port
    • 其余的哨兵接收到指令后,主節(jié)點(diǎn)掛了嗎?讓我去看看到底掛沒掛。發(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的哨兵說你說的對,這個家伙確實(shí)掛了。當(dāng)所有人都認(rèn)為主節(jié)點(diǎn)掛了后就會修改其狀態(tài)為odown。當(dāng)一個哨兵認(rèn)為主節(jié)點(diǎn)掛了標(biāo)記的是sdown,當(dāng)半數(shù)哨兵都認(rèn)為掛了其標(biāo)記的狀態(tài)是odown。這也就是配置哨兵為什么配置單數(shù)的原因。
    • 對于一個哨兵認(rèn)為主節(jié)點(diǎn)掛了稱之為主觀下線,半數(shù)哨兵認(rèn)為主節(jié)點(diǎn)掛了稱之為客官下線。
    • 一旦被認(rèn)為主節(jié)點(diǎn)客官下線后,哨兵就會進(jìn)行下一步操作

    ?

    這時哨兵已經(jīng)檢測到問題所在了,那么到底是那個哨兵去負(fù)責(zé)推選新的主節(jié)點(diǎn)呢!不能是張三也去,李四也去,王五也去,這樣就亂套了、于是就需要在所有的哨兵里選出領(lǐng)頭的,那么是如何選的呢!請看下圖。

    ?

    這個時候呢!五個sentinel就在一起開會了,所有的哨兵都在一個內(nèi)網(wǎng)中,然后他們會做一件事情就是五個sentinel會同時發(fā)送指令sentinel is-master-down-by-address-port并且攜帶上自己競選次數(shù)和runid。Redis哨兵原理,我忍你很久了!每個sentinel既是參選者也是投票者,每個sentinel都有一票,信封就代表自己的投票權(quán)。Redis哨兵原理,我忍你很久了!當(dāng)sentinel1和sentinel4同時把指令發(fā)送到群里準(zhǔn)備競選時,sentinel2這個時候就說我先接到誰的指令就把票投給誰。假如sentinel1發(fā)的早,那么sentinel2的票就會投給sentinel1。Redis哨兵原理,我忍你很久了!按照這樣的規(guī)則一直發(fā)起投票直到有一個sentinel的票數(shù)為總sentinel數(shù)量的一半之多。假設(shè)說是sentinel1的票數(shù)滿足總哨兵數(shù)量的一半之多后,sentinel1就會當(dāng)選。這個時候就進(jìn)行到了下一個階段。Redis哨兵原理,我忍你很久了!在上邊哨兵已經(jīng)選出了sentinel1為代表去所有的從節(jié)點(diǎn)找出一個作為主節(jié)點(diǎn)。這個挑選主節(jié)點(diǎn)不是隨便拿一個是有一定的規(guī)則的。

    先把不在線的干掉

    Redis哨兵原理,我忍你很久了!響應(yīng)慢的干掉,sentinel會給所有的redis發(fā)送信息,響應(yīng)速度慢的就會被干掉Redis哨兵原理,我忍你很久了!與原主節(jié)點(diǎn)斷開時間最久的干掉,這里由于演示不夠用了,所有新增了一個slave5,沒有任何意義哈!Redis哨兵原理,我忍你很久了!以上三個點(diǎn)都判斷結(jié)束后還有salve4和slave5,就會根據(jù)優(yōu)先原則來進(jìn)行篩選。

    • 首先會根據(jù)優(yōu)先級,如果優(yōu)先級一樣在進(jìn)行其他判斷
    • 判斷offset偏移量,判斷數(shù)據(jù)同步性,假如說slave4的offset為90 slave5偏移量為100 那么哨兵就會認(rèn)為slave4的網(wǎng)絡(luò)是不是有問題?。∮谑蔷蜁xslave5為新的主節(jié)點(diǎn)。那如果說是slave4和slave5的offset相同呢!還有最后一個判斷
    • 最后一步就是判斷runid了,也就是職場中的論資排輩了,也就說根據(jù)runid的創(chuàng)建時間來判斷,時間早的上位。

    Redis哨兵原理,我忍你很久了!選出新的主節(jié)點(diǎn)后就要對所有的節(jié)點(diǎn)發(fā)送指令了。Redis哨兵原理,我忍你很久了!

    四、總結(jié)

    關(guān)于哨兵的所有知識點(diǎn)就已經(jīng)說完了,本文最重要的就是哨兵的工作原理了。我們在簡單的梳理一下其工作原理。

    • 首先進(jìn)行監(jiān)控,并且所有的哨兵同步信息

    • 哨兵向訂閱里邊發(fā)布信息

    • 故障轉(zhuǎn)移

      • 哨兵發(fā)現(xiàn)主節(jié)點(diǎn)下線
      • 哨兵開啟投票競選負(fù)責(zé)人
      • 由負(fù)責(zé)人推選新的主節(jié)點(diǎn)
      • 新的主節(jié)點(diǎn)斷開原主節(jié)點(diǎn),并且其他的從節(jié)點(diǎn)連接新的主節(jié)點(diǎn),原主節(jié)點(diǎn)上線后作為從節(jié)點(diǎn)連接。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號