Redis主從復(fù)制模式可以將主節(jié)點(diǎn)的數(shù)據(jù)同步給從節(jié)點(diǎn),從而保障當(dāng)主節(jié)點(diǎn)不可達(dá)的情況下,從節(jié)點(diǎn)可以作為
后備頂上來,并且可以保障數(shù)據(jù)盡量不丟失(主從復(fù)制可以保障最終一致性)。第二,從節(jié)點(diǎn)可以擴(kuò)展主節(jié)點(diǎn)的讀
能力,一旦主節(jié)點(diǎn)不能支持大規(guī)模并發(fā)量的讀操作,從節(jié)點(diǎn)可以在一定程度上分擔(dān)主節(jié)點(diǎn)的壓力。
主從復(fù)制面臨的問題:
1.當(dāng)主節(jié)點(diǎn)發(fā)生故障的時(shí)候,需要手動(dòng)的將一個(gè)從節(jié)點(diǎn)晉升為主節(jié)點(diǎn),同時(shí)通知應(yīng)用方修改主節(jié)點(diǎn)地址并重啟
應(yīng)用,同時(shí)需要命令其它從節(jié)點(diǎn)復(fù)制新的主節(jié)點(diǎn),整個(gè)過程需要人工干預(yù)。
2.主節(jié)點(diǎn)的寫能力受到單機(jī)的限制。
3.主節(jié)點(diǎn)的存儲(chǔ)能力受到單機(jī)的限制。
1.主節(jié)點(diǎn)發(fā)生故障后,客戶端連接主節(jié)點(diǎn)失敗,兩個(gè)從節(jié)點(diǎn)與主節(jié)點(diǎn)連接失敗造成復(fù)制中斷。
2.如果主節(jié)點(diǎn)無(wú)法正常啟動(dòng),需要選出一個(gè)從節(jié)點(diǎn)(slave-1),對(duì)其執(zhí)行slaveof no one命令使其成為新的主節(jié)
3.原來的從節(jié)點(diǎn)(slave-1)成為新的主節(jié)點(diǎn)后,更新應(yīng)用方的主節(jié)點(diǎn)信息,重新啟動(dòng)應(yīng)用方。
4.客戶端命令另一個(gè)從節(jié)點(diǎn)(slave-2)去復(fù)制新的主節(jié)點(diǎn)
5.待原來的主節(jié)點(diǎn)恢復(fù)后,讓它去復(fù)制新的主節(jié)點(diǎn)
當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),Redis Sentinel能自動(dòng)完成故障發(fā)現(xiàn)和故障轉(zhuǎn)移,并通知應(yīng)用方,從而實(shí)現(xiàn)真正的高可用。
RedisSentine是一個(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)來完
成自動(dòng)故障轉(zhuǎn)移的工作,同時(shí)會(huì)將這個(gè)變化實(shí)時(shí)通知給Redis應(yīng)用方。整個(gè)過程是自動(dòng)的,不需要人工干預(yù),解決了
Redis的高可用問題。
Redis Sentinel包含了若干個(gè)Sentinel節(jié)點(diǎn),這樣做也帶來了兩個(gè)好處:
1. 對(duì)節(jié)點(diǎn)的故障判斷是由多個(gè)Sentinel節(jié)點(diǎn)共同完成,這樣可以有效的防止誤判。
2. Sentinel節(jié)點(diǎn)集合是由若干個(gè)Sentinel節(jié)點(diǎn)組成的,這樣即使個(gè)別Sentinel節(jié)點(diǎn)不可用,整個(gè)Sentinel節(jié)點(diǎn)集合依
然是健壯的。
Redis Sentinel具有以下幾個(gè)功能:
1.監(jiān)控:Sentinel會(huì)定期檢測(cè)Redis數(shù)據(jù)節(jié)點(diǎn)、其余Sentinel節(jié)點(diǎn)是否可到達(dá)
2.通知:Sentinel會(huì)將故障轉(zhuǎn)移的結(jié)果通知給應(yīng)用方。
3.主節(jié)點(diǎn)故障轉(zhuǎn)移:實(shí)現(xiàn)從節(jié)點(diǎn)晉升為主節(jié)點(diǎn)并維護(hù)后續(xù)正確的主從關(guān)系。
4.配置提供者:在RedisSentinel結(jié)構(gòu)中,客戶端在初始化的時(shí)候連接的是Sentinel節(jié)點(diǎn)集合,從中獲取主節(jié)點(diǎn)信息。
Redis Sentinel通過三個(gè)定時(shí)監(jiān)控任務(wù)完成對(duì)各個(gè)節(jié)點(diǎn)的發(fā)現(xiàn)和監(jiān)控:
1.每隔10秒,每個(gè)Sentinel會(huì)向主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送info命令獲取最新的拓?fù)浣Y(jié)構(gòu)。
2.每隔2秒,每個(gè)Sentinel節(jié)點(diǎn)會(huì)向Redis數(shù)據(jù)節(jié)點(diǎn)的_sentinel_:hello頻道上發(fā)送該Senitnel節(jié)點(diǎn)對(duì)于主節(jié)點(diǎn)的判斷。
以及當(dāng)前Sentinel節(jié)點(diǎn)的信息,同時(shí)每個(gè)Sentinel節(jié)點(diǎn)也會(huì)訂閱該頻道,來了解其他Sentinel節(jié)點(diǎn)以及他們對(duì)主節(jié)
點(diǎn)的判斷。這個(gè)定時(shí)任務(wù)可以完成以下兩個(gè)工作:
(1)發(fā)現(xiàn)新的Sentinel節(jié)點(diǎn):通過訂閱主節(jié)點(diǎn)的_Sentinel_:hello了解其他Sentinel節(jié)點(diǎn)信息。如果是新加入的
Sentinel節(jié)點(diǎn),將該Sentinel節(jié)點(diǎn)信息保存起來,并與改Sentinel節(jié)點(diǎn)創(chuàng)建連接
(2)Sentinel節(jié)點(diǎn)之間交換主節(jié)點(diǎn)狀態(tài),作為后面客觀下線以及領(lǐng)導(dǎo)者選舉的依據(jù)
3.每隔1秒,每個(gè)Sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)、從節(jié)點(diǎn)、其余Sentinel節(jié)點(diǎn)發(fā)送一條ping命令做一次心跳檢測(cè),來確認(rèn)
當(dāng)前節(jié)點(diǎn)是否可達(dá)。與主節(jié)點(diǎn),從節(jié)點(diǎn),其余Sentinel都建立起連接,實(shí)現(xiàn)了對(duì)每個(gè)節(jié)點(diǎn)的監(jiān)控。這個(gè)定時(shí)任務(wù)
是節(jié)點(diǎn)失敗判定的重要依據(jù)。
1.Sentinel節(jié)點(diǎn)不應(yīng)該部署在一臺(tái)物理機(jī)上。
2.部署至少三個(gè)且奇數(shù)個(gè)的Sentinel節(jié)點(diǎn)
3.只有一套Sentinel,還是每個(gè)主節(jié)點(diǎn)配置一套Sentinel的討論的建議方案是如果Sentinel節(jié)點(diǎn)集合監(jiān)控的是同一個(gè)
業(yè)務(wù)的多個(gè)主節(jié)點(diǎn)集合,那么使用方案一,否則使用方案2.
Redis數(shù)據(jù)分區(qū):RedisCluster采用虛擬槽分區(qū),所有的鍵根據(jù)哈希函數(shù)映射到0-16383整數(shù)槽內(nèi),
計(jì)算公式:slot=CRC16(key) &16383。每一個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù)。
Redis虛擬槽分區(qū)的特點(diǎn):
1.解耦數(shù)據(jù)和節(jié)點(diǎn)之間的關(guān)系,簡(jiǎn)化了節(jié)點(diǎn)擴(kuò)容和收縮的難度
2.節(jié)點(diǎn)自身維護(hù)槽的映射關(guān)系,不需要客戶端或者代理服務(wù)維護(hù)槽分區(qū)元數(shù)據(jù)
3.支持節(jié)點(diǎn)、槽、鍵之間的映射查詢,用于數(shù)據(jù)路由、在線伸縮等場(chǎng)景。
1.Key批量操作支持有限。目前只支持同slot內(nèi)的key執(zhí)行批量操作(如mget,mset)。
2.Key事務(wù)操作支持有限。只支持多key在同一個(gè)節(jié)點(diǎn)上的事務(wù)操作,多個(gè)key分布在不同節(jié)點(diǎn)上時(shí)無(wú)法使用事務(wù)功能。
3.Key作為數(shù)據(jù)分區(qū)的最小粒度,因此不能將一個(gè)大的鍵值對(duì)象如hash,list等映射到不同節(jié)點(diǎn)。
4.不支持多數(shù)據(jù)庫(kù)空間,集群模式下只能使用db0空間。
5.復(fù)制結(jié)構(gòu)只支持一層,從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn),不支持嵌套樹狀復(fù)制結(jié)構(gòu)。
Redis集群提供了靈活的節(jié)點(diǎn)擴(kuò)容和收縮方案,在不影響集群對(duì)外服務(wù)的情況下,可以為集群添加節(jié)點(diǎn)進(jìn)行
擴(kuò)容也可以下線部分節(jié)點(diǎn)進(jìn)行縮容。
擴(kuò)容集群的步驟:
1.準(zhǔn)備新節(jié)點(diǎn)
2.加入集群
3.遷移槽和數(shù)據(jù)
縮容集群的步驟:
1.首先要確定下線節(jié)點(diǎn)是否有負(fù)責(zé)的槽,如果是,需要把槽遷移到其他節(jié)點(diǎn),保證節(jié)點(diǎn)下線后真?zhèn)€集群槽節(jié)點(diǎn)映射的完整性
2.當(dāng)下線節(jié)點(diǎn)不再負(fù)責(zé)槽或者本身是從節(jié)點(diǎn)時(shí),就可以通知集群內(nèi)其他節(jié)點(diǎn)忘記下線節(jié)點(diǎn),就可以通知集群內(nèi)其他節(jié)點(diǎn)忘記下線節(jié)點(diǎn)當(dāng)所有的節(jié)點(diǎn)忘記該節(jié)點(diǎn)后可以正常關(guān)閉。
Redis集群自身實(shí)現(xiàn)了高可用。高可用首先需要解決集群部分失敗的場(chǎng)景:當(dāng)少數(shù)節(jié)點(diǎn)出現(xiàn)故障時(shí),可以通過
自動(dòng)故障轉(zhuǎn)移保證集群可以正常對(duì)外提供服務(wù)。
故障發(fā)現(xiàn)的類型:
1.主觀下線:指某個(gè)節(jié)點(diǎn)認(rèn)為另一個(gè)節(jié)點(diǎn)不可用,即下線狀態(tài),這個(gè)狀態(tài)并不是最終的故障判定,只能代表一個(gè)節(jié)點(diǎn)的意見,可能存在誤判情況。
2.客觀下線:指標(biāo)記一個(gè)節(jié)點(diǎn)真正的下線,集群內(nèi)多個(gè)節(jié)點(diǎn)都認(rèn)為該節(jié)點(diǎn)不可用,從而達(dá)成共識(shí)的結(jié)果。如果持有槽的主節(jié)點(diǎn)故障,需要為該節(jié)點(diǎn)進(jìn)行故障轉(zhuǎn)移。
故障節(jié)點(diǎn)變?yōu)榭陀^下線后,如果下線節(jié)點(diǎn)是持有槽的主節(jié)點(diǎn),則需要在它的從節(jié)點(diǎn)中選出一個(gè)替換它。從而保證集群高可用。下線主節(jié)點(diǎn)的所有從節(jié)點(diǎn)承擔(dān)故障恢復(fù)的義務(wù),當(dāng)從節(jié)點(diǎn)通過內(nèi)部定時(shí)任務(wù)發(fā)現(xiàn)自身復(fù)制的主節(jié)點(diǎn)進(jìn)入客觀下線時(shí),將會(huì)觸發(fā)故障恢復(fù)流程。
聯(lián)系客服