跟我一起學(xué)Redis之加個(gè)哨兵讓主從復(fù)制更加高可用

前言

主從復(fù)制的實(shí)現(xiàn)在上一篇已經(jīng)分享過伤柄,雖然主從復(fù)制本身的確讓讀寫分離更加高效顶岸,但是對(duì)于整體高可用存在很大的劣勢:當(dāng)主節(jié)點(diǎn)宕機(jī)了之后還需要人為重新進(jìn)行主從關(guān)系配置械蹋;這不是開玩笑嘛,這樣人為干預(yù),故障恢復(fù)不及時(shí)频丘,損失就難免啦。誰維護(hù)誰不爽,睡個(gè)覺都提心吊膽凭峡。

找個(gè)哨兵站崗,專門用來監(jiān)控主服務(wù)器决记,一旦有變故摧冀,哨兵自動(dòng)處理,這樣故障恢復(fù)及時(shí)且更加智能系宫;接下來就來玩玩索昂。

正文

Redis哨兵(Sentinel)其實(shí)本質(zhì)就是一個(gè)RedisServer節(jié)點(diǎn),通過設(shè)置運(yùn)行模式來開啟哨兵的功能扩借;主要功能如下:

  • 監(jiān)控(Monitoring):哨兵節(jié)點(diǎn)會(huì)不斷的檢查的主服務(wù)和從服務(wù)的運(yùn)行狀態(tài)椒惨;
  • 自動(dòng)故障遷移(Automatic failover):當(dāng)Redis主從模式中的主服務(wù)器發(fā)生故障時(shí),哨兵節(jié)點(diǎn)會(huì)根據(jù)一定的策略自動(dòng)進(jìn)行故障遷移潮罪,即在原有主服務(wù)器下的從服務(wù)器中康谆,自動(dòng)選出一個(gè)從服務(wù)器作為新的主服務(wù)器,及時(shí)處理故障嫉到;
  • 通知(Notification):當(dāng)被監(jiān)控的Redis服務(wù)器故障時(shí)沃暗,哨兵節(jié)點(diǎn)可以向相關(guān)人員或客戶端發(fā)送通知提醒;
  • 配置提供者(Configuration provider):可以通過哨兵節(jié)點(diǎn)為客戶端提供主從模式中的主節(jié)點(diǎn)地址何恶,這里的客戶端指平時(shí)寫的程序孽锥;

老規(guī)矩,還是先不說那么多理論导而,先來實(shí)操一把忱叭,然后再來總結(jié):

哨兵模式搭建

先來個(gè)最基礎(chǔ)的:一個(gè)哨兵監(jiān)控一主二從的環(huán)境;后面小伙伴就知道如何擴(kuò)展啦今艺,如下圖所示(這里通過一臺(tái)機(jī)器演示韵丑,所以通過端口進(jìn)行區(qū)分各個(gè)redis節(jié)點(diǎn)):

image-20210114141345708

Redis哨兵模式是基于Redis主從復(fù)制的,所以先來搭建主從復(fù)制環(huán)境虚缎,這個(gè)過程在上一篇中已經(jīng)詳細(xì)分享撵彻,這里就不細(xì)說,直接動(dòng)手啦实牡;

  1. 搭建主從復(fù)制環(huán)境陌僵,如上圖所示,6377作為主服務(wù)器创坞,6388和6399作為從服務(wù)器碗短,這里是通過配置文件的形式修改,最終效果如下:

    image-20210114142426244
  2. 主從復(fù)制環(huán)境搭建完畢之后题涨,接下來需要有一個(gè)哨兵對(duì)其進(jìn)行監(jiān)控偎谁;之前有說過总滩,Redis的功能通過配置文件就能快速實(shí)現(xiàn),針對(duì)哨兵有一個(gè)單獨(dú)的配置文件巡雨,這里就起名為:sentinel.conf闰渔,內(nèi)容如下:

    sentinel monitor mymaster 127.0.0.1 6377 1

    大概意思就是哨兵要監(jiān)控對(duì)應(yīng)的主服務(wù)器,其他啥都不用配置铐望;

    這里對(duì)于配置文件內(nèi)容先不解釋這么多冈涧,接下來會(huì)專門進(jìn)行介紹,先把環(huán)境搭建起來正蛙,玩一把再說督弓;

  3. 啟動(dòng)哨兵,兩種方式:

    redis-sentinel啟動(dòng)跟畅,redis-sentinel其實(shí)是用redis的一個(gè)代碼分支分離出來的咽筋,安裝完redis就有溶推,命令如下:

    ./redis-sentinel ZoeConfig/sentinel.conf

    redis-server啟動(dòng)徊件,指定為哨兵模式即可,命令如下:

    ./redis-server ZoeConfig/sentinel.conf --sentinel

    啟動(dòng)效果如下:

    image-20210114164300813

    如上圖所示蒜危,Redis哨兵其實(shí)本質(zhì)還是一個(gè)Redis節(jié)點(diǎn)虱痕,只是運(yùn)行模式不一樣而已;

  4. 哨兵模式運(yùn)行起來辐赞,模擬主服務(wù)器宕機(jī)部翘,這里直接將6377服務(wù)器shutdown, 注意看哨兵打印的日志:

    先將主服務(wù)器6377關(guān)掉,如下:

    image-20210114165824631

    由于哨兵定時(shí)對(duì)主服務(wù)器進(jìn)行監(jiān)控响委,如果在30秒內(nèi)(默認(rèn)30秒)發(fā)現(xiàn)主服務(wù)器無法正常通訊時(shí)新思,就開始進(jìn)行投票選舉原主服務(wù)器下的從服務(wù)器作為新主服務(wù)器,哨兵打印日志如下:

    image-20210114170909938

    大概流程如下圖:

    image-20210115105820011

    哨兵最后的狀態(tài)會(huì)持久化到指定的配置文件中赘风,之前只是簡單配置了一條監(jiān)控語句夹囚,現(xiàn)在如下:

    image-20210115122612914
  5. 驗(yàn)證故障轉(zhuǎn)移結(jié)果;

    光說6388變成了主服務(wù)器沒證據(jù)邀窃,連上6388看看荸哟,同時(shí)再看看6399有沒有換新主人,如下圖:

    6388主從信息

    image-20210114171247927

    對(duì)應(yīng)的配置文件中將之前的主從關(guān)系配置已經(jīng)去掉了瞬捕。

    6399主從信息

    image-20210114171516670

    對(duì)應(yīng)的配置文件也已經(jīng)改了鞍历,如下:

    image-20210114171713342

以上就完成了哨兵模式搭建的演示啦,是不是很簡單肪虎,只要稍微改改配置文件即可完成自動(dòng)化故障恢復(fù)劣砍。 到這小伙伴可能會(huì)問,原來故障的主服務(wù)器恢復(fù)了會(huì)怎么樣扇救? 一個(gè)哨兵誤判主服務(wù)器下線或高并發(fā)抗不住怎么辦刑枝?嘿嘿嘿赊淑,接著來搞,接下來邊操作邊總結(jié)仅讽;

原故障的主服務(wù)器恢復(fù)之后只能當(dāng)小兵

原有通訊異常的主服務(wù)器如果恢復(fù)正常陶缺,那它還能恢復(fù)原來的地位嗎?洁灵,還是另有安排呢饱岸?這個(gè)很好演示,直接將之前shutdown的主服務(wù)器重新起來即可徽千;6377啟動(dòng)后查看主從關(guān)系信息如下圖:

image-20210115111608936

如上圖實(shí)操驗(yàn)證苫费,原來異常的主服務(wù)器(6377)恢復(fù)之后就變成新主服務(wù)器(6388)的從服務(wù)器了(原來再屌,現(xiàn)在也只是小弟双抽,重新再混等機(jī)會(huì))百框。

哨兵集群高可用

以上演示就一個(gè)哨兵,這樣有很明顯的兩個(gè)缺點(diǎn)牍汹,如下:

  • 單個(gè)哨兵容易導(dǎo)致誤判主節(jié)點(diǎn)下線铐维,比如主節(jié)點(diǎn)正常,只是在與哨兵之間通訊出現(xiàn)短暫異常慎菲,如果是單個(gè)哨兵嫁蛇,在指定的時(shí)間間隔沒有通訊就認(rèn)為主節(jié)點(diǎn)下線了,但其實(shí)沒有露该;如果哨兵集群睬棚,可以詢問多個(gè)哨兵指定的主節(jié)點(diǎn)是否下線,這樣就顯得更有保障解幼;
  • 哨兵掛了抑党,故障轉(zhuǎn)移就沒法繼續(xù)啦,哨兵集群的話就會(huì)選擇其他哨兵繼續(xù)處理撵摆;

配置哨兵集群超級(jí)簡單底靠,就是增加節(jié)點(diǎn)即可,哨兵節(jié)點(diǎn)會(huì)通過發(fā)布與訂閱功能來自動(dòng)發(fā)現(xiàn)正在監(jiān)視相同主服務(wù)器的其他哨兵 台汇, 這一功能是通過向頻道 sentinel:hello 發(fā)送信息來實(shí)現(xiàn)的苛骨。如下圖再新增一個(gè)哨兵節(jié)點(diǎn),同時(shí)增加一個(gè)配置文件苟呐,由于默認(rèn)端口為26379痒芝,上一個(gè)哨兵已經(jīng)占用,這里在新增的配置文件中指定新哨兵的端口為:26388牵素;

配置文件名為sentinel26388.conf严衬,內(nèi)容如下:

sentinel monitor mymaster 127.0.0.1 6388 1
port 26388

指定配置文件啟動(dòng)第二個(gè)哨兵,啟動(dòng)命令為./redis-sentinel ZoeConfig/sentinel26388.conf笆呆,效果如下:

image-20210115123029803

哨兵如何做到互相交流和監(jiān)控從服務(wù)器的

到這應(yīng)該有小伙伴會(huì)有疑問:在配置哨兵的時(shí)候请琳,只配置監(jiān)控主服務(wù)器粱挡,從服務(wù)器是怎么知道的?哨兵之間的交流是通過什么形式實(shí)現(xiàn)的俄精?

關(guān)于從服務(wù)器: 哨兵會(huì)自動(dòng)詢問主服務(wù)器獲得對(duì)應(yīng)從服務(wù)器的信息询筏,因?yàn)閺姆?wù)器會(huì)在連接主服務(wù)器的時(shí)候把相關(guān)信息給主服務(wù)器,所以哨兵能通過主服務(wù)器拿到從服務(wù)器的信息竖慧;

關(guān)于哨兵之間:哨兵節(jié)點(diǎn)會(huì)通過發(fā)布與訂閱功能來自動(dòng)發(fā)現(xiàn)正在監(jiān)視相同主服務(wù)器的其他哨兵 嫌套, 這一功能是通過向頻道 sentinel:hello 發(fā)送信息來實(shí)現(xiàn)的;

注:一個(gè)哨兵可以同時(shí)監(jiān)控多個(gè)主服務(wù)器圾旨;

哨兵配置文件介紹

以上配置只是為了快速實(shí)現(xiàn)演示踱讨,其實(shí)關(guān)于哨兵還有其他很多配置,接下來都過一遍:

  • **port: **哨兵的端口砍的,默認(rèn)是26379痹筛,可以通過此配置項(xiàng)進(jìn)行修改;

  • dir:哨兵的工作目錄廓鞠;

  • sentinel monitor <master-name> <ip> <redis-port> <quorum>:指定哨兵監(jiān)控的主服務(wù)器帚稠;

    master-name:對(duì)監(jiān)控的節(jié)點(diǎn)進(jìn)行命名,方便后續(xù)根據(jù)名稱獲取信息诫惭;

    ip:主節(jié)點(diǎn)ip;

    redis-port:主節(jié)點(diǎn)的端口翁锡;

    quorum:整數(shù)蔓挖,及設(shè)置有幾個(gè)哨兵統(tǒng)一認(rèn)為主節(jié)點(diǎn)下線為條件夕土,滿足這個(gè)數(shù)量就將主節(jié)點(diǎn)標(biāo)記為客觀下線;

    例:sentinel monitor mymaster 127.0.0.1 6388 2瘟判,意思就是當(dāng)有兩個(gè)哨兵都認(rèn)為監(jiān)控的mymaster主節(jié)點(diǎn)下線了怨绣,就將此主節(jié)點(diǎn)標(biāo)記為客觀下線;則可以進(jìn)行下一步故障轉(zhuǎn)移操作了拷获;

  • sentinel auth-pass <master-name> <password>:設(shè)置主節(jié)點(diǎn)和從節(jié)點(diǎn)的連接密碼篮撑,這里只能統(tǒng)一設(shè)置,所以主節(jié)點(diǎn)和從節(jié)點(diǎn)的密碼要一樣匆瓜;

  • sentinel down-after-milliseconds <master-name> <milliseconds>:設(shè)置失聯(lián)時(shí)間赢笨,單位為毫秒,默認(rèn)為30秒驮吱,如果哨兵在30秒內(nèi)沒有接收到主節(jié)點(diǎn)的應(yīng)答茧妒,就認(rèn)為主節(jié)點(diǎn)異常了,并將其標(biāo)記為主觀下線左冬;

  • sentinel parallel-syncs <master-name> <numslaves>:故障轉(zhuǎn)移之后桐筏,在新的主從關(guān)系下,同時(shí)有多少個(gè)從節(jié)點(diǎn)向主節(jié)點(diǎn)要求進(jìn)行數(shù)據(jù)同步拇砰; 默認(rèn)設(shè)置是1梅忌,即一個(gè)一個(gè)同步狰腌,這樣可以減少主節(jié)點(diǎn)同步壓力;如果主節(jié)點(diǎn)機(jī)器性能允許牧氮,可以適當(dāng)增加數(shù)量琼腔;

  • sentinel failover-timeout <masterName> <milliseconds>:用于故障轉(zhuǎn)移超時(shí)過程判斷,默認(rèn)設(shè)置為180000踱葛,即3分鐘展姐;

  • sentinel notification-script <master-name> <script-path> :設(shè)置腳本路徑; 哨兵有任何警告級(jí)別時(shí)間發(fā)生時(shí)都會(huì)執(zhí)行這個(gè)腳本剖毯,可以通過該腳本實(shí)現(xiàn)郵件等信息通知圾笨;

連接哨兵常用的命令

  • info sentinel:獲取監(jiān)控的主節(jié)點(diǎn)信息;

    image-20210115140646428
  • sentinel masters:獲取監(jiān)控主節(jié)點(diǎn)的詳細(xì)信息逊谋;

    image-20210115141726755
  • sentinel master <監(jiān)控時(shí)設(shè)置的名稱>:上面我們指定的是mymaster擂达,信息和上面類似;

    image-20210115141916304
  • sentinel get-master-addr-by-name <監(jiān)控時(shí)設(shè)置的名稱>:根據(jù)指定的名稱獲取ip地址和端口信息胶滋,上面我們指定的名稱是mymaster板鬓;

    image-20210115142031292
  • sentinel is-master-down-by-addr:查看監(jiān)控的主節(jié)點(diǎn)是否下線,哨兵之間判斷主節(jié)點(diǎn)是否下線原理就是通過此命令究恤;

    image-20210115142406320
  • sentinel slaves <監(jiān)控時(shí)設(shè)置的名稱>:獲取監(jiān)控主節(jié)點(diǎn)的從節(jié)點(diǎn)信息俭令;上面我們指定的是mymaster

    image-20210115142517391
  • sentinel failover <監(jiān)控時(shí)設(shè)置的名稱>:該命令可以強(qiáng)制對(duì)指定監(jiān)控執(zhí)行故障轉(zhuǎn)移,即便當(dāng)前的主節(jié)點(diǎn)運(yùn)行完好也能執(zhí)行部宿;例如抄腔,需要換掉當(dāng)前監(jiān)控的主節(jié)點(diǎn),便可以提前通過failover命令進(jìn)行故障轉(zhuǎn)移理张;上面我們指定的名稱是mymaster赫蛇;

總結(jié)

主從復(fù)制加個(gè)哨兵看似很完美啦,但仔細(xì)想想雾叭,雖然讀寫分離分開了悟耘,但寫還是單節(jié)點(diǎn),如果寫的并發(fā)量特別大怎么辦织狐,那肯定扛不住暂幼,所以這下集群該出山了,下一次聊聊redis集群移迫;

一個(gè)被程序搞丑的帥小伙旺嬉,關(guān)注"Code綜藝圈",跟我一起學(xué)~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末起意,一起剝皮案震驚了整個(gè)濱河市鹰服,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖悲酷,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件套菜,死亡現(xiàn)場離奇詭異,居然都是意外死亡设易,警方通過查閱死者的電腦和手機(jī)逗柴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顿肺,“玉大人戏溺,你說我怎么就攤上這事⊥雷穑” “怎么了旷祸?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讼昆。 經(jīng)常有香客問我托享,道長,這世上最難降的妖魔是什么浸赫? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任闰围,我火速辦了婚禮,結(jié)果婚禮上既峡,老公的妹妹穿的比我還像新娘羡榴。我一直安慰自己,他們只是感情好运敢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布校仑。 她就那樣靜靜地躺著,像睡著了一般者冤。 火紅的嫁衣襯著肌膚如雪肤视。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天涉枫,我揣著相機(jī)與錄音,去河邊找鬼腐螟。 笑死愿汰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乐纸。 我是一名探鬼主播衬廷,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼汽绢!你這毒婦竟也來了吗跋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跌宛,沒想到半個(gè)月后酗宋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆拘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蜕猫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哎迄。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡回右,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漱挚,到底是詐尸還是另有隱情翔烁,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布旨涝,位于F島的核電站租漂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颊糜。R本人自食惡果不足惜哩治,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衬鱼。 院中可真熱鬧业筏,春花似錦、人聲如沸鸟赫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抛蚤。三九已至台谢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岁经,已是汗流浹背朋沮。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀壤,地道東北人樊拓。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像塘慕,于是被迫代替她去往敵國和親筋夏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容