python redis 哨兵_Redis哨兵机制
概述
上篇文章主要說(shuō)了Redis 復(fù)制的內(nèi)容,但 Redis 復(fù)制有一個(gè)缺點(diǎn),當(dāng)主機(jī) Master 宕機(jī)以后,我們需要人工解決切換,比如使用slaveof no one 。實(shí)際上主從復(fù)制并沒(méi)有實(shí)現(xiàn),高可用, 高可用側(cè)重備份機(jī)器, 利用集群中系統(tǒng)的冗余,當(dāng)系統(tǒng)中某臺(tái)機(jī)器發(fā)生損壞的時(shí)候,其他后備的機(jī)器可以迅速的接替它來(lái)啟動(dòng)服務(wù)。
主從復(fù)制的問(wèn)題
一旦主節(jié)點(diǎn)宕機(jī),寫(xiě)服務(wù)無(wú)法使用,就需要手動(dòng)去切換,重新選取主節(jié)點(diǎn),手動(dòng)設(shè)置主從關(guān)系。
那么如何解決呢?如果我們有一個(gè)監(jiān)控程序能夠監(jiān)控各個(gè)機(jī)器的狀態(tài)及時(shí)作出調(diào)整,將手動(dòng)的操作變成自動(dòng)的。Sentinel的出現(xiàn)就是為了解決這個(gè)問(wèn)題。
哨兵機(jī)制的原理及實(shí)現(xiàn)
Redis Sentinel
Redis Sentinel 是一個(gè)分布式架構(gòu),其中包含若干個(gè) Sentinel 節(jié)點(diǎn)和 Redis 數(shù)據(jù)節(jié)點(diǎn),每個(gè) Sentinel 節(jié)點(diǎn)會(huì)對(duì)數(shù)據(jù)節(jié)點(diǎn)和其余 Sentinel 節(jié)點(diǎn)進(jìn)行監(jiān)控,當(dāng)它發(fā)現(xiàn)節(jié)點(diǎn)不可達(dá)時(shí),會(huì)對(duì)節(jié)點(diǎn)做下線標(biāo)識(shí)。如果被標(biāo)識(shí)的是主節(jié)點(diǎn),它還會(huì)和其他 Sentinel 節(jié)點(diǎn)進(jìn)行“協(xié)商”,當(dāng)大多數(shù) Sentinel 節(jié)點(diǎn)都認(rèn)為主節(jié)點(diǎn)不可達(dá)時(shí),它們會(huì)選舉出一個(gè) Sentinel 節(jié)點(diǎn)來(lái)完成自動(dòng)故障轉(zhuǎn)移的工作,同時(shí)會(huì)將這個(gè)變化實(shí)時(shí)通知給 Redis 應(yīng)用方。整個(gè)過(guò)程完全是自動(dòng)的,不需要人工來(lái)介入,所以這套方案很有效地解決了 Redis 的高可用問(wèn)題。
如圖所示:
基本的故障轉(zhuǎn)移流程
1)主節(jié)點(diǎn)出現(xiàn)故障,此時(shí)兩個(gè)從節(jié)點(diǎn)與主節(jié)點(diǎn)失去連接,主從復(fù)制失敗。
2)每個(gè) Sentinel 節(jié)點(diǎn)通過(guò)定期監(jiān)控發(fā)現(xiàn)主節(jié)點(diǎn)出現(xiàn)了故障
3)多個(gè) Sentinel 節(jié)點(diǎn)對(duì)主節(jié)點(diǎn)的故障達(dá)成一致會(huì)選舉出其中一個(gè)節(jié)點(diǎn)作為領(lǐng)導(dǎo)者負(fù)責(zé)故障轉(zhuǎn)移。
4)Sentinel 領(lǐng)導(dǎo)者節(jié)點(diǎn)執(zhí)行了故障轉(zhuǎn)移,整個(gè)過(guò)程基本是跟我們手動(dòng)調(diào)整一致的,只不過(guò)是自動(dòng)化完成的。
5)故障轉(zhuǎn)移后整個(gè) Redis Sentinel 的結(jié)構(gòu),重新選舉了新的主節(jié)點(diǎn)。
實(shí)例
redis-sentinel1 172.10.0.9 22530 -> 22530 sentinel
redis-sentinel2 172.10.0.10 22531 -> 6379 sentinel
redis-sentinel3 172.10.0.11 22532 -> 6379 sentinel
redis-master2 172.10.0.5 6383 -> 6379 Master
redis-slave2 172.10.0.6 6384 -> 6379 Slave
redis-slave3 172.10.0.7 6385 -> 6379 Slave
配置
Sentinel 的核心配置
sentinel monitor mymaster 127.0.0.1 7000 2
監(jiān)控的主節(jié)點(diǎn)的名字、IP 和端口,最后一個(gè)2的意思是有幾臺(tái) Sentinel 發(fā)現(xiàn)有問(wèn)題,就會(huì)發(fā)生故障轉(zhuǎn)移,例如 配置為2,代表至少有2個(gè) Sentinel 節(jié)點(diǎn)認(rèn)為主節(jié)點(diǎn)不可達(dá),那么這個(gè)不可達(dá)的判定才是客觀的。對(duì)于設(shè)置的越小,那么達(dá)到下線的條件越寬松,反之越嚴(yán)格。一般建議將其設(shè)置為 Sentinel 節(jié)點(diǎn)的一半加1。
sentinel down-after-millseconds mymaster 30000
這個(gè)是超時(shí)的時(shí)間(單位為毫秒)。打個(gè)比方,當(dāng)你去 ping 一個(gè)機(jī)器的時(shí)候,多長(zhǎng)時(shí)間后仍 ping 不通,那么就認(rèn)為它是有問(wèn)題。
sentinel parallel-syncs mymaster 1
當(dāng) Sentinel 節(jié)點(diǎn)集合對(duì)主節(jié)點(diǎn)故障判定達(dá)成一致時(shí),Sentinel 領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)做故障轉(zhuǎn)移操作,選出新的主節(jié)點(diǎn),原來(lái)的從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作,parallel-syncs 就是用來(lái)限制在一次故障轉(zhuǎn)移之后,每次向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的從節(jié)點(diǎn)個(gè)數(shù),指出 Sentinel 屬于并發(fā)還是串行。1代表每次只能復(fù)制一個(gè),可以減輕 Master 的壓力。
sentinel auth-pass
如果 Sentinel 監(jiān)控的主節(jié)點(diǎn)配置了密碼,sentinel auth-pass 配置通過(guò)添加主節(jié)點(diǎn)的密碼,防止 Sentinel 節(jié)點(diǎn)對(duì)主節(jié)點(diǎn)無(wú)法監(jiān)控。
sentinel failover-timeout mymaster 180000
表示故障轉(zhuǎn)移的時(shí)間。
技巧
1)Sentinel 節(jié)點(diǎn)不應(yīng)該部署在一臺(tái)物理“機(jī)器”上。
這里特意強(qiáng)調(diào)物理機(jī)是因?yàn)橐慌_(tái)物理機(jī)做成了若干虛擬機(jī)或者現(xiàn)今比較流行的容器,它們雖然有不同的 IP 地址,但實(shí)際上它們都是同一臺(tái)物理機(jī),同一臺(tái)物理機(jī)意味著如果這臺(tái)機(jī)器有什么硬件故障,所有的虛擬機(jī)都會(huì)受到影響,為了實(shí)現(xiàn) Sentinel 節(jié)點(diǎn)集合真正的高可用,請(qǐng)勿將 Sentinel 節(jié)點(diǎn)部署在同一臺(tái)物理機(jī)器上。
2)部署至少三個(gè)且奇數(shù)個(gè)的 Sentinel 節(jié)點(diǎn)。
3個(gè)以上是通過(guò)增加 Sentinel 節(jié)點(diǎn)的個(gè)數(shù)提高對(duì)于故障判定的準(zhǔn)確性,因?yàn)轭I(lǐng)導(dǎo)者選舉需要至少一半加1個(gè)節(jié)點(diǎn),奇數(shù)個(gè)節(jié)點(diǎn)可以在滿足該條件的基礎(chǔ)上節(jié)省一個(gè)節(jié)點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的python redis 哨兵_Redis哨兵机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10设置默认输入法_个性化设置技巧
- 下一篇: jpa transaction 回滚_我