redis三種集群方式主從/哨兵/Cluster

redis的集群方式主要有以下三種:

1、 主從模式

master掛掉之后,slave仍能正常讀,但redis不再提供寫服務(wù),直到master重新啟動(dòng)
slave掛掉之后不影響其他slave的讀和master的讀寫,slave重啟后重新同步master數(shù)據(jù)

主寫從讀:

主庫(kù)寫,從庫(kù)讀,從庫(kù)掛掉之后從主庫(kù)讀。
主讀寫從備份:
主庫(kù)讀寫,從庫(kù)只做備份。主庫(kù)掛掉之后,redis不再工作

主從一致:

從庫(kù)啟動(dòng)后,主動(dòng)向master發(fā)送SYNC命令,master將保存快照(RDB持久化數(shù)據(jù))和 保存快照到當(dāng)前時(shí)間的緩存命令 發(fā)送給slave。slave接收消息后加載快照和執(zhí)行緩存命令

slave上線后,master每次接收寫命令都會(huì)發(fā)給slave,保證主從一致。

缺點(diǎn):

master掛掉之后不能再提供寫服務(wù)。單點(diǎn)故障

優(yōu)點(diǎn):

簡(jiǎn)單,易維護(hù)。省資源

2、哨兵模式

監(jiān)控redis集群的狀態(tài),在master掛掉之后,重新選擇新的master。選擇機(jī)制:

  • 使用如下條件篩選備選node:
  1. slave節(jié)點(diǎn)狀態(tài)處于S_DOWN,O_DOWN,DISCONNECTED的除外
  2. 最近一次ping應(yīng)答時(shí)間不超過(guò)5倍ping的間隔(假如ping的間隔為1秒,則最近一次應(yīng)答延遲不應(yīng)超過(guò)5秒,redis sentinel默認(rèn)為1秒)
  3. info_refresh應(yīng)答不超過(guò)3倍info_refresh的間隔(原理同2,redis sentinel默認(rèn)為10秒)
  4. slave節(jié)點(diǎn)與master節(jié)點(diǎn)失去聯(lián)系的時(shí)間不能超過(guò)( (now - master->s_down_since_time) + (master->down_after_period * 10))。總體意思是說(shuō),slave節(jié)點(diǎn)與master同步太不及時(shí)的(比如新啟動(dòng)的節(jié)點(diǎn)),不應(yīng)該參與被選舉。
  5. Slave priority不等于0(這個(gè)是在配置文件中指定,默認(rèn)配置為100)。
  • 從備選node中,按照如下順序選擇新的master
  1. 較低的slave_priority(這個(gè)是在配置文件中指定,默認(rèn)配置為100)
  2. 較大的replication offset(每個(gè)slave在與master同步后offset自動(dòng)增加)
  3. 較小的runid(每個(gè)redis實(shí)例,都會(huì)有一個(gè)runid,通常是一個(gè)40位的隨機(jī)字符串,在redis啟動(dòng)時(shí)設(shè)置,重復(fù)概率非常小)
  4. 如果以上條件都不足以區(qū)別出唯一的節(jié)點(diǎn),則會(huì)看哪個(gè)slave節(jié)點(diǎn)處理之前master發(fā)送的command多,就選誰(shuí)。

哨兵也是有集群的,哨兵之前也是互相監(jiān)控的,哨兵和redis集群之前是多對(duì)多的關(guān)系。

哨兵監(jiān)控master流程:
  1. 哨兵每秒向master、slave發(fā)送一次ping命令,每10s發(fā)送一次info命令。
  2. 如果實(shí)例回復(fù)的時(shí)間比設(shè)置的時(shí)間要晚,則實(shí)例會(huì)被標(biāo)記為主觀下線
  3. 如果master被標(biāo)記為主觀下線,則監(jiān)控該master的所有哨兵會(huì)向該master每秒發(fā)送一次ping,確認(rèn)其下線。
  4. 當(dāng)有足夠多的哨兵確認(rèn)了該master的下線狀態(tài),則該master就會(huì)被標(biāo)記為客觀下線。
  5. 如果master被標(biāo)記為客觀下線,則哨兵向所有slave發(fā)送INFO命令每s一次。
  6. 若沒(méi)有足夠多的哨兵同意master下線則master客觀下線狀態(tài)會(huì)被解除。若master重新向哨兵相應(yīng),則master主觀下線狀態(tài)解除。

3、集群模式

可以說(shuō)是哨兵模式和主從模式的結(jié)合。cluster模式有多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有主從。主要解決單機(jī)redis內(nèi)存不夠的問(wèn)題。
redis集群通過(guò)哈希槽將redis數(shù)據(jù)分布式存儲(chǔ)到集群的master節(jié)點(diǎn)中,slave節(jié)點(diǎn)不工作,僅在master節(jié)點(diǎn)掛掉之后替換master繼續(xù)提供服務(wù)。
redis每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分哈希槽位。

集群節(jié)點(diǎn)的擴(kuò)展/收縮方式:
  1. 首先啟動(dòng)一個(gè) Redis 節(jié)點(diǎn),記為 M4。
  2. 使用 cluster meet 命令,讓新 Redis 節(jié)點(diǎn)加入到集群中。新節(jié)點(diǎn)剛開(kāi)始都是主節(jié)點(diǎn)狀態(tài),由于沒(méi)有負(fù)責(zé)的>槽,所以不能接受任何讀寫操作,后續(xù)我們就給他遷移槽和填充數(shù)據(jù)。
  3. 對(duì) M4 節(jié)點(diǎn)發(fā)送 cluster setslot { slot } importing { sourceNodeId } 命令,讓目標(biāo)節(jié)點(diǎn)準(zhǔn)備導(dǎo)入槽的數(shù)據(jù)。 >4) 對(duì)源節(jié)點(diǎn),也就是 M1,M2,M3 節(jié)點(diǎn)發(fā)送 cluster setslot { slot } migrating { targetNodeId } 命令,讓源節(jié)>點(diǎn)準(zhǔn)備遷出槽的數(shù)據(jù)。
  4. 源節(jié)點(diǎn)執(zhí)行 cluster getkeysinslot { slot } { count } 命令,獲取 count 個(gè)屬于槽 { slot } 的鍵,然后執(zhí)行步驟>六的操作進(jìn)行遷移鍵值數(shù)據(jù)。
  5. 在源節(jié)點(diǎn)上執(zhí)行 migrate { targetNodeIp} " " 0 { timeout } keys { key... } 命令,把獲取的鍵通過(guò) pipeline 機(jī)制>批量遷移到目標(biāo)節(jié)點(diǎn),批量遷移版本的 migrate 命令在 Redis 3.0.6 以上版本提供。
  6. 重復(fù)執(zhí)行步驟 5 和步驟 6 直到槽下所有的鍵值數(shù)據(jù)遷移到目標(biāo)節(jié)點(diǎn)。
  7. 向集群內(nèi)所有主節(jié)點(diǎn)發(fā)送 cluster setslot { slot } node { targetNodeId } 命令,通知槽分配給目標(biāo)節(jié)點(diǎn)。為了>保證槽節(jié)點(diǎn)映射變更及時(shí)傳播,需要遍歷發(fā)送給所有主節(jié)點(diǎn)更新被遷移的槽執(zhí)行新節(jié)點(diǎn)。
客戶端路由:
  1. smart集群客戶端維護(hù)了一張哈希槽對(duì)應(yīng)節(jié)點(diǎn)的關(guān)系列表。
  2. 客戶端根據(jù)本地 slot 緩存發(fā)送命令到源節(jié)點(diǎn),如果存在鍵對(duì)應(yīng)則直接執(zhí)行并返回結(jié)果給客戶端。
  3. 如果節(jié)點(diǎn)返回 MOVED 錯(cuò)誤,更新本地的 slot 到 Redis 節(jié)點(diǎn)的映射關(guān)系,然后重新發(fā)起請(qǐng)求。
  4. 如果數(shù)據(jù)正在遷移中,節(jié)點(diǎn)會(huì)回復(fù) ASK 重定向異常。格式如下: ( error ) ASK { slot } { targetIP } : { targetPort }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容