Redis04——五分鐘明白R(shí)edis的哨兵模式

和所有的數(shù)據(jù)庫一樣,Redis也支持集群化,Redis的集群分為分布式集群和主從集群。大部分公司采取的都是主從集群。所以在本篇文章內(nèi),我們將著重介紹Redis的主從集群及哨兵機(jī)制。

由于Redis的主從同步是異步進(jìn)行的,所以Redis主從集群不滿足事務(wù)的一致性,同時(shí)Redis在主從網(wǎng)絡(luò)不可用的情況下,主節(jié)點(diǎn)依舊可以提供服務(wù),所以Redis主從集群滿足事物的可用性。Redis只能保證數(shù)據(jù)的最終一致性。

主從同步

Redis的主從同步主要是通過以下幾種方式來進(jìn)行同步的。

增量同步

增量同步,本質(zhì)上是同步的主節(jié)點(diǎn)的修改指令。即Redis主節(jié)點(diǎn)將所有key的修改指令寫入到一段定長(zhǎng)的內(nèi)存緩沖區(qū)中,然后將修改指令同步到從節(jié)點(diǎn),同時(shí)從節(jié)點(diǎn)將指令執(zhí)行情況(偏移量)反饋到主機(jī)節(jié)點(diǎn),以此來進(jìn)行主從同步。

注意:由于主節(jié)點(diǎn)的指令緩沖區(qū)是定長(zhǎng)的,所以當(dāng)緩沖區(qū)寫滿后,又會(huì)緩沖區(qū)起始位置開始覆蓋寫入新的指令。

快照同步

當(dāng)某種原因(如主從網(wǎng)絡(luò)延遲、從節(jié)點(diǎn)執(zhí)行指令效率過低等)導(dǎo)致增量同步的數(shù)據(jù)不一致的時(shí)候,就需要快照同步來修復(fù)數(shù)據(jù)??煺胀绞紫刃枰獙⒅鞴?jié)點(diǎn)上的數(shù)據(jù)進(jìn)行一次bgsave,將內(nèi)存數(shù)據(jù)全部持久化到磁盤,然后同過網(wǎng)絡(luò)傳輸?shù)綇墓?jié)點(diǎn),寫入從節(jié)點(diǎn)磁盤。從節(jié)點(diǎn)再使用快照加載數(shù)據(jù),當(dāng)數(shù)據(jù)加載完成后,從節(jié)點(diǎn)反饋給主節(jié)點(diǎn),繼續(xù)進(jìn)行增量同步。

注意:當(dāng)主節(jié)點(diǎn)的指令緩沖區(qū)設(shè)置過小時(shí),會(huì)導(dǎo)致快照同步陷入死循環(huán),因此主機(jī)節(jié)點(diǎn)的指令緩沖區(qū)一定要設(shè)置合理。

無盤復(fù)制

本質(zhì)上相當(dāng)于快照同步,只不過少了主節(jié)點(diǎn)數(shù)據(jù)寫入磁盤的步驟,換成主節(jié)點(diǎn)內(nèi)存數(shù)據(jù)直接寫入從節(jié)點(diǎn)的磁盤,然后繼續(xù)快照同步的后續(xù)操作 。

哨兵模式

什么是哨兵

在傳統(tǒng)的Redis主從集群中,主節(jié)點(diǎn)一旦出現(xiàn)故障,需要人工介入干預(yù),切換集群的主從節(jié)點(diǎn),同時(shí)通知應(yīng)用方,這無疑是無法接受的。令人高興的是Redis從2.8版本之后,開始支持哨兵模式了,改變了傳統(tǒng)的人肉運(yùn)維方式。

哨兵的作用是什么

Sentinel(哨兵)主要負(fù)責(zé)持續(xù)監(jiān)控Redis主從集群的健康,并負(fù)責(zé)實(shí)現(xiàn)主從集群的自動(dòng)選主過程,同時(shí)將選主結(jié)果通知到客戶端。

哨兵是如何完成主從集群選主的

哨兵模式.png

哨兵模式主要分為哨兵節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)(圖中的Master 和 Slave節(jié)點(diǎn)),一次完整的選主流程如下:

1. 在該模式下,客戶端首先會(huì)遍歷所有的哨兵,獲取主節(jié)點(diǎn)信息,然后連接到主節(jié)點(diǎn);

2. 在主從集群內(nèi)部其運(yùn)轉(zhuǎn)如下:

2.1. 每個(gè)哨兵節(jié)點(diǎn)向所有數(shù)據(jù)節(jié)點(diǎn)發(fā)送每十秒鐘一次的ping信息;

2.2. 若一個(gè)數(shù)據(jù)節(jié)點(diǎn)距離最后一次ping成功的時(shí)間超過預(yù)設(shè)值,則該節(jié)點(diǎn)被哨兵認(rèn)為是主觀下線;

2.3. 當(dāng)Master節(jié)點(diǎn)被標(biāo)記為主觀下線時(shí),所有哨兵節(jié)點(diǎn)都會(huì)以每秒一次的頻率確認(rèn)Master是否真的進(jìn)入了主觀下線;

2.4. 當(dāng)超過一定數(shù)量的哨兵都確認(rèn)Master進(jìn)入了主觀下線后,Master會(huì)被標(biāo)記為客觀下線;

2.5. 若在此過程中Master恢復(fù)了對(duì)哨兵ping請(qǐng)求的響應(yīng),Master會(huì)被移除主觀下線標(biāo)記;

2.6. 當(dāng)Master被客觀下線后,哨兵會(huì)從新選擇合適的從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn);

2.7. 新的選主完成后,將重新所有節(jié)點(diǎn)的主從配置文件,同時(shí)所有從節(jié)點(diǎn)將從新的主節(jié)點(diǎn)同步數(shù)據(jù);

2.8. 若選主流程的時(shí)間超過預(yù)設(shè)值后,選主將會(huì)失敗;

3. 主從集群內(nèi)部選主完成后,哨兵會(huì)利用Redis是Pub/Sub(發(fā)布/訂閱)功能,通知客戶端重新初始化連接池,連接到新的主節(jié)點(diǎn)。

Redis系列推薦

Redis03——Redis是如何刪除你的數(shù)據(jù)的

Redis02——Redis內(nèi)存數(shù)據(jù)如何保存到磁盤

Redis01——Redis究竟支持哪些數(shù)據(jù)結(jié)構(gòu)

最后編輯于
?著作權(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)容