Redis集群功能概述
在單機(jī)Redis中介紹過Redis的復(fù)制特性以及Redis Sentinel和twemproxy,其中:
復(fù)制:可以創(chuàng)建指定服務(wù)器的復(fù)制品,這些復(fù)制品可以用戶擴(kuò)展系統(tǒng)處理讀請(qǐng)求的能力;
Redis Sentinel:可以在復(fù)制特性的基礎(chǔ)上,通過監(jiān)視主從服務(wù)器并在主服務(wù)器故障時(shí)執(zhí)行自動(dòng)故障轉(zhuǎn)移來保證系統(tǒng)的可用性;
twemproxy:使用分片策略來講數(shù)據(jù)庫(kù)劃分到多個(gè)不同的服務(wù)器,以此來擴(kuò)展系統(tǒng)存儲(chǔ)的數(shù)據(jù)量,并通過將命令請(qǐng)求分散給不同的服務(wù)器來處理,以此來擴(kuò)展系統(tǒng)處理命令請(qǐng)求的能力;
但是以上的特性都是獨(dú)立的,如果我們需要一個(gè)完整地包含復(fù)制、高可用和分片特性的Redis服務(wù)器集群,那么就需要用到Redis的集群(Cluster)特性;
?
Redis集群
Redis的分布式數(shù)據(jù)庫(kù)實(shí)現(xiàn)
分布式
Redis集群是一個(gè)由多個(gè)Redis服務(wù)器組成的分布式網(wǎng)絡(luò)服務(wù)器群,集群中的各個(gè)服務(wù)器被稱為節(jié)點(diǎn)(Node),這些節(jié)點(diǎn)會(huì)相互連接并進(jìn)行通信;
分布式的Redis集群沒有中心節(jié)點(diǎn),所以用戶不必當(dāng)心某個(gè)節(jié)點(diǎn)會(huì)成為整個(gè)集群的性能瓶頸;
復(fù)制
Redis集群的每個(gè)節(jié)點(diǎn)都有兩種角色可選:主節(jié)點(diǎn)(master node)和從節(jié)點(diǎn)(slave node),其中主節(jié)點(diǎn)用于存儲(chǔ)數(shù)據(jù),而從節(jié)點(diǎn)則是某個(gè)主節(jié)點(diǎn)的復(fù)制品;
當(dāng)用戶需要處理更多的請(qǐng)求時(shí),添加從節(jié)點(diǎn)可以擴(kuò)展系統(tǒng)的讀性能。因?yàn)镽edis集群重用了單機(jī)Redis復(fù)制特性,所以集群的復(fù)制行為和單機(jī)復(fù)制行為是完全一樣的;
下圖展示了為每個(gè)主節(jié)點(diǎn)各添加一個(gè)從節(jié)點(diǎn):
節(jié)點(diǎn)故障檢測(cè)和自動(dòng)故障轉(zhuǎn)移
Redis集群的主節(jié)點(diǎn)內(nèi)置了類似Redis Sentinel的節(jié)點(diǎn)故障檢測(cè)和自動(dòng)故障轉(zhuǎn)移功能,當(dāng)集群中的某個(gè)主節(jié)點(diǎn)下線時(shí),集群中的其他在線主節(jié)點(diǎn)會(huì)注意到這一點(diǎn),并對(duì)已下線的主節(jié)點(diǎn)進(jìn)行故障轉(zhuǎn)移;
集群進(jìn)行故障轉(zhuǎn)移的方法和Redis Sentinel進(jìn)行故障轉(zhuǎn)移的方法基本一樣,不同的是,在集群里面,故障轉(zhuǎn)移是由集群中其他在線的主節(jié)點(diǎn)負(fù)責(zé)進(jìn)行的,所以集群不必另外使用Redis Sentinel。
舉個(gè)栗子:當(dāng)7000下線時(shí),7001和7002會(huì)覺察到這一點(diǎn),并對(duì)7000進(jìn)行故障轉(zhuǎn)移。
分片
集群使用分片來擴(kuò)展數(shù)據(jù)庫(kù)的容量,并將命令請(qǐng)求的負(fù)載交給不同的節(jié)點(diǎn)來分擔(dān);
集群將使用這個(gè)數(shù)據(jù)庫(kù)分為16384個(gè)槽(slot),所有鍵都屬于這16384個(gè)槽的其中一個(gè),計(jì)算鍵key屬于哪個(gè)槽的公式:slot_number = crc16(key)%16384,其中crc16為16位的循環(huán)冗余校驗(yàn)和函數(shù);
集群中的每個(gè)主節(jié)點(diǎn)都可以處理0到16384個(gè)槽,當(dāng)16384個(gè)槽都有某個(gè)節(jié)點(diǎn)在負(fù)責(zé)處理時(shí),集群進(jìn)入上線狀態(tài),并開始處理客戶端發(fā)送的數(shù)據(jù)命令請(qǐng)求;
舉個(gè)栗子:
有三個(gè)主節(jié)點(diǎn)7000,7001和7002,那么:
將槽0到5460指派給節(jié)點(diǎn)7000負(fù)責(zé)處理;
將槽5461到10922指派給節(jié)點(diǎn)7001負(fù)責(zé)處理;
將槽10923到16383指派給節(jié)點(diǎn)7002復(fù)制處理;
這樣就可以將16384個(gè)槽平均地指派給三個(gè)節(jié)點(diǎn)負(fù)責(zé)處理;
轉(zhuǎn)向
對(duì)于一個(gè)被指派了槽的主節(jié)點(diǎn)來說,這個(gè)主節(jié)點(diǎn)只會(huì)處理屬于指派給自己的槽的命令請(qǐng)求;
如果一個(gè)節(jié)點(diǎn)接收到了和自己處理的槽無關(guān)的命令,那么節(jié)點(diǎn)會(huì)向客戶端反饋一個(gè)轉(zhuǎn)向錯(cuò)誤(redirection error),告訴客戶端,哪個(gè)節(jié)點(diǎn)才是負(fù)責(zé)處理這條命令的,之后客戶端需要根據(jù)錯(cuò)誤中包含的地址和端口號(hào)重新向正確的節(jié)點(diǎn)發(fā)送命令請(qǐng)求;
?
總結(jié)
以上是生活随笔為你收集整理的Redis集群功能概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java抓取网页数据(原网页+Javas
- 下一篇: Sizeof与Strlen的区别与联系