為什么代理架構(gòu)常作為緩存實(shí)現(xiàn)方案
一、Redis集群模式的故障發(fā)現(xiàn)
Redis集群模式故障發(fā)現(xiàn)過程有主觀下線與客觀下線。
主觀下線簡單來說就是我這個(gè)節(jié)點(diǎn)認(rèn)為你故障了。
客觀下線則是集群中大多數(shù)節(jié)點(diǎn)認(rèn)為你故障了。
這些判定與狀態(tài)的同步均通過Gossip協(xié)議PING/PONG來通信。
主觀下線流程
- @1 定時(shí)向集群中其他節(jié)點(diǎn)發(fā)送PING消息
- @2 超過時(shí)間(cluster-node-timeout)未收到接受節(jié)點(diǎn)PONG響應(yīng)消息
- @3 認(rèn)為該接受節(jié)點(diǎn)存在故障,標(biāo)記為主觀下線狀態(tài)pfail
客觀下線流程
- @1 Gossip協(xié)議PING/PONG通信
攜帶集群1/10的其他節(jié)點(diǎn)狀態(tài)
當(dāng)然也包含主觀下線節(jié)點(diǎn)的信息
- @2 接受節(jié)點(diǎn)維護(hù)故障節(jié)點(diǎn)下線報(bào)告
只處理發(fā)送為主節(jié)點(diǎn)的請(qǐng)求,從節(jié)點(diǎn)不處理
不存在故障節(jié)點(diǎn)下線報(bào)告,新增下線報(bào)告
已存在故障節(jié)點(diǎn)下線報(bào)告,更新報(bào)告時(shí)間
- @3 嘗試故障節(jié)點(diǎn)的客觀下線邏輯
每次收到其他節(jié)點(diǎn)的故障狀態(tài)pfail時(shí),均會(huì)嘗試客觀下線
監(jiān)測故障下線報(bào)告是否過期,過期的報(bào)告將被刪除
報(bào)告時(shí)間超過cluster-node-timeout*2未被更新將被移除
下線報(bào)告數(shù)量小于持有槽主節(jié)點(diǎn)的數(shù)量的二分之一,退出客觀下線
下線報(bào)告數(shù)量大于持有槽主節(jié)點(diǎn)的數(shù)量的二分之一,標(biāo)記客觀下線
向集群廣播一條fail消息(標(biāo)記客觀下線立即生效、故障從節(jié)點(diǎn)發(fā)起故障轉(zhuǎn)移流程)
二、Redis集群模式的故障轉(zhuǎn)移
Redis集群模式從節(jié)點(diǎn)的作用用于災(zāi)備,主節(jié)點(diǎn)故障時(shí)能夠替換頂上去。
- Redis的從節(jié)點(diǎn)當(dāng)然也不例外。
- 多個(gè)從節(jié)點(diǎn)誰去替換主節(jié)點(diǎn)?
選舉邏輯以及選舉失效是怎么樣的?
故障轉(zhuǎn)移流程
從節(jié)點(diǎn)中復(fù)制的偏移量越大,替換主節(jié)點(diǎn)的優(yōu)先級(jí)越高。
從節(jié)點(diǎn)獲得持有槽的主節(jié)點(diǎn)一半以上的選票,可替換為主節(jié)點(diǎn)。
從節(jié)點(diǎn)向集群廣播PONG消息,通知該變更。
三、常見緩存代理架構(gòu)方案簡述
Redis的集群模式客戶端直連集群,不需要額外的組件,運(yùn)維難度較低。
由于集群中每個(gè)實(shí)例都需要保存路由信息,彼此不斷傳播通信更新,也造成通信成本進(jìn)而影響集群規(guī)模。
Redis的集群模式也會(huì)造成客戶端需要重定向,帶來復(fù)雜性。
因此,緩存代理模式可以解決這種復(fù)雜性,當(dāng)然組件也會(huì)增多。
客服端:兼容RESP協(xié)議的輕量級(jí)客戶端。
集群代理:負(fù)責(zé)域客戶端建立連接,以及轉(zhuǎn)發(fā)請(qǐng)求到對(duì)應(yīng)的槽位和實(shí)例節(jié)點(diǎn)。
元數(shù)據(jù)中心:主要負(fù)責(zé)存儲(chǔ)槽位與實(shí)例對(duì)應(yīng)路由信息以及健康檢查心跳探測。
集群模式一:集群部署主從架構(gòu),需要元數(shù)中心負(fù)責(zé)心跳的健康監(jiān)測,主從節(jié)點(diǎn)的HA,當(dāng)主節(jié)點(diǎn)故障切換從節(jié)點(diǎn)接管。
集群模式二:集群部署Raft組,不需要額外的HA心跳監(jiān)測,集群自閉環(huán),三個(gè)節(jié)點(diǎn)一組成本較高。
模式一
模式二
兼容RESP協(xié)議的輕量級(jí)客戶端與代理建立長鏈接。
發(fā)送讀寫請(qǐng)求到代理層,代理根據(jù)路由規(guī)則將key路由到對(duì)應(yīng)集群的槽位。
管理平臺(tái)可對(duì)元數(shù)據(jù)信息、槽位分配、代理以及集群部署運(yùn)維等進(jìn)行管理。
可視化白屏化對(duì)整個(gè)集群的監(jiān)控、告警、大key等水位監(jiān)控告警。