和所有的數(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é)果通知到客戶端。
哨兵是如何完成主從集群選主的

哨兵模式主要分為哨兵節(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ù)的