1 集群模式
????????Redis集群是一個(gè)提供在多個(gè)Redis節(jié)點(diǎn)之間共享數(shù)據(jù)的程序集。它并不像Redis主從復(fù)制模式那樣只提供一個(gè)master節(jié)點(diǎn)提供寫服務(wù),而是會(huì)提供多個(gè)master節(jié)點(diǎn)提供寫服務(wù),每個(gè)master節(jié)點(diǎn)中存儲(chǔ)的數(shù)據(jù)都不一樣,這些數(shù)據(jù)通過數(shù)據(jù)分片的方式被自動(dòng)分割到不同的master節(jié)點(diǎn)上。
1.1 集群的優(yōu)點(diǎn)
- 負(fù)載均衡(降低單臺(tái)Redis服務(wù)器的訪問壓力)
- 可拓展性(降低單臺(tái)Redis服務(wù)器的存儲(chǔ)壓力)
- 容災(zāi)處理
1.2 集群模式實(shí)現(xiàn)的三種方式
????????我們一般要實(shí)現(xiàn)一個(gè)Redis集群,可以有三種方式:客戶端實(shí)現(xiàn)、Proxy代理層、服務(wù)端實(shí)現(xiàn)。
1.2.1 客戶端實(shí)現(xiàn)
我們通過代碼的實(shí)現(xiàn)方式,實(shí)現(xiàn)集群訪問,如下圖所示:
這樣的訪問方式都通過代碼來(lái)維護(hù)集群以及訪問路徑,可是這樣的方式?維護(hù)難度大,也不支持動(dòng)態(tài)擴(kuò)容,因?yàn)橐磺卸家源a實(shí)現(xiàn)訪問規(guī)劃。
1.2.2 Proxy代理層
如圖所示:
? 我們?cè)赗edis和我們的客戶端之間新加了一層Proxy,我們通過Proxy去規(guī)劃訪問,這樣我們?cè)诖a層面以及Redis部署層面就無(wú)需處理,而且市面上也提供了這樣的中間件,如Codis(國(guó)產(chǎn))、Twemproxy。我們看下Codis的架構(gòu)圖,就可以知道這個(gè)插件是如何工作的,如圖所示:
? 可見Codis是一個(gè)很完善的集群管理實(shí)現(xiàn),我們可以不關(guān)心具體分片規(guī)則,程序開發(fā)容易簡(jiǎn)單,可是這樣也有它的一些缺點(diǎn):
- 相對(duì)單機(jī)、主從、哨兵可以看到,原先可以直接訪問Redis,現(xiàn)在由于多了一層Proxy,所有訪問要經(jīng)過Proxy中轉(zhuǎn),性能下降。
- 我們需要依賴以及配置額外的插件(中間件),增加了系統(tǒng)復(fù)雜度。
Codis的GitHub地址:https://github.com/CodisLabs/codis
1.2.3服務(wù)端實(shí)現(xiàn)
服務(wù)端的實(shí)現(xiàn)方式就是標(biāo)準(zhǔn)的集群(分區(qū)分片)模式,RedisCluster是Redis在3.0版本后推出的分布式解決方案。
1.2.3.1 集群結(jié)構(gòu)
Cluster模式實(shí)現(xiàn)了Redis的分布式存儲(chǔ),即每臺(tái)節(jié)點(diǎn)存儲(chǔ)不同的內(nèi)容,來(lái)解決在線擴(kuò)容的問題。如圖:
RedisCluster采用無(wú)中心結(jié)構(gòu),它的特點(diǎn)如下:
- 所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。
- 節(jié)點(diǎn)的fail是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效。
- 客戶端與redis節(jié)點(diǎn)直連,不需要中間代理層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可。
1.2.3.2 集群部署架構(gòu)
????????為了保證集群的高可用,每個(gè)master節(jié)點(diǎn)下面還需要添加至少1個(gè)slave節(jié)點(diǎn),這樣當(dāng)某個(gè)master節(jié)點(diǎn)發(fā)生故障后,可以從它的slave節(jié)點(diǎn)中選舉一個(gè)作為新的master節(jié)點(diǎn)繼續(xù)提供服務(wù)。不過當(dāng)某個(gè)master節(jié)點(diǎn)和它下面所有的slave節(jié)點(diǎn)都發(fā)生故障時(shí),整個(gè)集群就不可用了。這樣就組成了下圖中的結(jié)構(gòu)模式:
為什么需要三主三從?
????????因?yàn)閮?nèi)部存在一個(gè)投票機(jī)制,節(jié)點(diǎn)的有效性是需要靠投票的,一個(gè)節(jié)點(diǎn)無(wú)法給自己投票,兩個(gè)節(jié)點(diǎn)互相都連不上,A=>B,B=>A互相都說對(duì)方掛了沒有定論.三個(gè)節(jié)點(diǎn)才能滿足投票的需求。
1.3 Redis集群工作機(jī)制
1.3.1 具體工作機(jī)制
Cluster模式的具體工作機(jī)制:
- Redis集群中引入了哈希槽的概念,在Redis的每個(gè)節(jié)點(diǎn)上,都有一個(gè)插槽(slot),總共16384個(gè)哈希槽,取值范圍為0-16383。如下圖所示,跟前三種模式不同,Redis不再是默認(rèn)有16(0-15)個(gè)庫(kù),也沒有默認(rèn)的0庫(kù)說法,而是采用Slot的設(shè)計(jì)(一個(gè)集群有多個(gè)主從節(jié)點(diǎn),一個(gè)主從節(jié)點(diǎn)上會(huì)分配多個(gè)Slot槽,每個(gè)槽點(diǎn)上存的是Key-Value數(shù)據(jù)): ?
- 當(dāng)我們存取key的時(shí)候,每個(gè)key會(huì)通過CRC16校驗(yàn)后再對(duì)16384取模來(lái)決定放置在哪個(gè)槽,搭建Redis集群時(shí)會(huì)先給集群中每個(gè)master節(jié)點(diǎn)分配一部分哈希槽。比如當(dāng)前集群有3個(gè)master節(jié)點(diǎn),master1節(jié)點(diǎn)包含0~5500號(hào)哈希槽,master2節(jié)點(diǎn)包含5501~11000號(hào)哈希槽,master3節(jié)點(diǎn)包含11001~16384號(hào)哈希槽,當(dāng)我們執(zhí)行“set key value”時(shí),假如 CRC16(key) % 16384 = 777,那么這個(gè)key就會(huì)被分配到master1節(jié)點(diǎn)上,如下圖:
- 為了保證高可用,Cluster模式也引入主從復(fù)制模式,一個(gè)主節(jié)點(diǎn)對(duì)應(yīng)一個(gè)或者多個(gè)從節(jié)點(diǎn),當(dāng)主節(jié)點(diǎn)宕機(jī)的時(shí)候,就會(huì)啟用從節(jié)點(diǎn)。
- 當(dāng)其它主節(jié)點(diǎn)ping一個(gè)主節(jié)點(diǎn)A時(shí),如果半數(shù)以上的主節(jié)點(diǎn)與A通信超時(shí),那么認(rèn)為主節(jié)點(diǎn)A宕機(jī)了。如果主節(jié)點(diǎn)A和它的從節(jié)點(diǎn)都宕機(jī)了,那么該集群就無(wú)法再提供服務(wù)了
Cluster模式集群節(jié)點(diǎn)最小配置6個(gè)節(jié)點(diǎn)(3主3從,因?yàn)樾枰霐?shù)以上),其中主節(jié)點(diǎn)提供讀寫操作,從節(jié)點(diǎn)作為備用節(jié)點(diǎn),不提供請(qǐng)求,只作為故障轉(zhuǎn)移使用。關(guān)于集群中的涉及動(dòng)態(tài)選舉的機(jī)制,請(qǐng)參考地址:Raft
1.3.2 Redis集群中節(jié)點(diǎn)的通信
????????既然Redis集群中的數(shù)據(jù)是通過哈希槽的方式分開存儲(chǔ)的,那么集群中每個(gè)節(jié)點(diǎn)都需要知道其他所有節(jié)點(diǎn)的狀態(tài)信息,包括當(dāng)前集群狀態(tài)、集群中各節(jié)點(diǎn)負(fù)責(zé)的哈希槽、集群中各節(jié)點(diǎn)的master-slave狀態(tài)、集群中各節(jié)點(diǎn)的存活狀態(tài)等。Redis集群中,節(jié)點(diǎn)之間通過建立TCP連接,使用gossip協(xié)議來(lái)傳播集群的信息。如下圖:
????????所謂gossip協(xié)議,指的是一種消息傳播的機(jī)制,類似人們傳遞八卦消息似的,一傳十,十傳百,直至所有人都知道這條八卦內(nèi)容。Redis集群中各節(jié)點(diǎn)之間傳遞消息就是基于gossip協(xié)議,最終達(dá)到所有節(jié)點(diǎn)都會(huì)知道整個(gè)集群完整的信息。gossip協(xié)議有4種常用的消息類型:PING、PONG、MEET、FAIL。
- MEET:當(dāng)需要向集群中加入新節(jié)點(diǎn)時(shí),需要集群中的某個(gè)節(jié)點(diǎn)發(fā)送MEET消息到新節(jié)點(diǎn),通知新節(jié)點(diǎn)加入集群。新節(jié)點(diǎn)收到MEET消息后,會(huì)回復(fù)PONG命令給發(fā)送者。
- PING:集群內(nèi)每個(gè)節(jié)點(diǎn)每秒會(huì)向其他節(jié)點(diǎn)發(fā)送PING消息,用來(lái)檢測(cè)其他節(jié)點(diǎn)是否正常工作,并交換彼此的狀態(tài)信息。PING消息中會(huì)包括自身節(jié)點(diǎn)的狀態(tài)數(shù)據(jù)和其他部分節(jié)點(diǎn)的狀態(tài)數(shù)據(jù)。
- PONG:當(dāng)接收到PING消息和MEET消息時(shí),會(huì)向發(fā)送發(fā)回復(fù)PONG消息,PONG消息中包括自身節(jié)點(diǎn)的狀態(tài)數(shù)據(jù)。節(jié)點(diǎn)也可以通過廣播的方式發(fā)送自身的PONG消息來(lái)通知整個(gè)集群對(duì)自身狀態(tài)的更新。
- FAIL:當(dāng)一個(gè)節(jié)點(diǎn)判定另一個(gè)節(jié)點(diǎn)下線時(shí),會(huì)向集群內(nèi)廣播一個(gè)FAIL消息,其他節(jié)點(diǎn)接收到FAIL消息之后,把對(duì)應(yīng)節(jié)點(diǎn)更新為下線狀態(tài)。
1.3.3 Redis集群的MOVED重定向
????????Redis客戶端可以向Redis集群中的任意master節(jié)點(diǎn)發(fā)送操作指令,可以向所有節(jié)點(diǎn)(包括slave節(jié)點(diǎn))發(fā)送查詢指令。當(dāng)Redis節(jié)點(diǎn)接收到相關(guān)指令時(shí),會(huì)先計(jì)算key落在哪個(gè)哈希槽上(對(duì)key進(jìn)行CRC16校驗(yàn)后再對(duì)16384取模),如果key計(jì)算出的哈希槽恰好在自己節(jié)點(diǎn)上,那么就直接處理指令并返回結(jié)果,如果key計(jì)算出的哈希槽不在自己節(jié)點(diǎn)上,那么當(dāng)前節(jié)點(diǎn)就會(huì)查看它內(nèi)部維護(hù)的哈希槽與節(jié)點(diǎn)ID之間的映射關(guān)系,然后給客戶端返回一個(gè)MOVED錯(cuò)誤:MOVED [哈希槽] [節(jié)點(diǎn)IP:端口]。這個(gè)錯(cuò)誤包含操作的key所屬的哈希槽和能處理這個(gè)請(qǐng)求的Redis節(jié)點(diǎn)的IP和端口號(hào),例如“MOVED 3999 127.0.0.1:6379”,客戶端需要根據(jù)這個(gè)信息重新發(fā)送查詢指令到給定的IP和端口的Redis節(jié)點(diǎn)。
1.4 集群模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 無(wú)中心架構(gòu);
- 數(shù)據(jù)按照slot存儲(chǔ)分布在多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)間數(shù)據(jù)共享,可動(dòng)態(tài)調(diào)整數(shù)據(jù)分布;
- 可擴(kuò)展性:可線性擴(kuò)展到1000多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)可動(dòng)態(tài)添加或刪除;
- 高可用性:部分節(jié)點(diǎn)不可用時(shí),集群仍可用。通過增加Slave做standby數(shù)據(jù)副本,能夠?qū)崿F(xiàn)故障自動(dòng)failover,節(jié)點(diǎn)之間通過gossip協(xié)議交換狀態(tài)信息,用投票機(jī)制完成Slave到Master的角色提升;
- 降低運(yùn)維成本,提高系統(tǒng)的擴(kuò)展性和可用性。
缺點(diǎn):
- Client實(shí)現(xiàn)復(fù)雜,驅(qū)動(dòng)要求實(shí)現(xiàn)Smart Client,緩存slots mapping信息并及時(shí)更新,提高了開發(fā)難度,客戶端的不成熟影響業(yè)務(wù)的穩(wěn)定性。目前僅JedisCluster相對(duì)成熟,異常處理部分還不完善,比如常見的“max redirect exception”。
- 節(jié)點(diǎn)會(huì)因?yàn)槟承┰虬l(fā)生阻塞(阻塞時(shí)間大于clutser-node-timeout),被判斷下線,這種failover是沒有必要的。
- 數(shù)據(jù)通過異步復(fù)制,不保證數(shù)據(jù)的強(qiáng)一致性。
- 多個(gè)業(yè)務(wù)使用同一套集群時(shí),無(wú)法根據(jù)統(tǒng)計(jì)區(qū)分冷熱數(shù)據(jù),資源隔離性較差,容易出現(xiàn)相互影響的情況。
- Slave在集群中充當(dāng)“冷備”,不能緩解讀壓力,當(dāng)然可以通過SDK的合理設(shè)計(jì)來(lái)提高Slave資源的利用率。
- Key批量操作限制,如使用mset、mget目前只支持具有相同slot值的Key執(zhí)行批量操作。對(duì)于映射為不同slot值的Key由于Keys不支持跨slot查詢,所以執(zhí)行mset、mget、sunion等操作支持不友好。
- Key事務(wù)操作支持有限,只支持多key在同一節(jié)點(diǎn)上的事務(wù)操作,當(dāng)多個(gè)Key分布于不同的節(jié)點(diǎn)上時(shí)無(wú)法使用事務(wù)功能。
- Key作為數(shù)據(jù)分區(qū)的最小粒度,不能將一個(gè)很大的鍵值對(duì)象如hash、list等映射到不同的節(jié)點(diǎn)。
- 不支持多數(shù)據(jù)庫(kù)空間,單機(jī)下的redis可以支持到16個(gè)數(shù)據(jù)庫(kù),集群模式下只能使用1個(gè)數(shù)據(jù)庫(kù)空間,即db 0。
- 復(fù)制結(jié)構(gòu)只支持一層,從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn),不支持嵌套樹狀復(fù)制結(jié)構(gòu)。
- 避免產(chǎn)生hot-key,導(dǎo)致主庫(kù)節(jié)點(diǎn)成為系統(tǒng)的短板。
- 避免產(chǎn)生big-key,導(dǎo)致網(wǎng)卡撐爆、慢查詢等。
- 重試時(shí)間應(yīng)該大于cluster-node-time時(shí)間。
- Redis Cluster不建議使用pipeline和multi-keys操作,減少max redirect產(chǎn)生的場(chǎng)景。
1.5 Cluster模式的常見問題
????????集群內(nèi)部采用Gossip協(xié)議(謠言傳播)協(xié)同自動(dòng)化修復(fù)集群的狀態(tài),但Gossip有消息延時(shí)和消息冗余的問題,在集群節(jié)點(diǎn)數(shù)量過多的時(shí)候,節(jié)點(diǎn)之間需要不斷進(jìn)行PING/PANG通訊,不必須要的流量占用了大量的網(wǎng)絡(luò)資源。
????????Redis Cluster可以進(jìn)行節(jié)點(diǎn)的動(dòng)態(tài)擴(kuò)容縮容,在擴(kuò)縮容的時(shí)候,就需要進(jìn)行數(shù)據(jù)遷移。而Redis 為了保證遷移的一致性, 遷移所有操作都是同步操作,執(zhí)行遷移時(shí),兩端的 Redis 均會(huì)進(jìn)入時(shí)長(zhǎng)不等的 阻塞狀態(tài)。對(duì)于小 Key,該時(shí)間可以忽略不計(jì),但如果一旦 Key 的內(nèi)存使用過大,嚴(yán)重的時(shí)候會(huì)接觸發(fā)集群內(nèi)的故障轉(zhuǎn)移,造成不必要的切換.
????????Gossip 的缺陷 - 消息的延遲 由于 Gossip 協(xié)議中,節(jié)點(diǎn)只會(huì)隨機(jī)向少數(shù)幾個(gè)節(jié)點(diǎn)發(fā)送消息,消息最終是通過多 個(gè)輪次的散播而到達(dá)全網(wǎng)的。 因此使用 Gossip 協(xié)議會(huì)造成不可避免的消息延遲。不適合用在對(duì)實(shí)時(shí)性要求較高 的場(chǎng)景下。
????????消息冗余 Gossip 協(xié)議規(guī)定,節(jié)點(diǎn)會(huì)定期隨機(jī)選擇周圍節(jié)點(diǎn)發(fā)送消息,而收到消息的節(jié)點(diǎn)也會(huì)重復(fù)該步驟。 因此存在消息重復(fù)發(fā)送給同一節(jié)點(diǎn)的情況,造成了消息的冗余,同時(shí)也增加了收到消息的節(jié)點(diǎn)的處理壓力。 而且,由于是定期發(fā)送而且不反饋,因此即使節(jié)點(diǎn)收到了消息,還是會(huì)反復(fù)收到重復(fù)消息,加重了消息的冗余。
2 Redis集群安裝與配置
2.1 集群部署
2.1.1 集群安裝
首先我們復(fù)制6份redis.conf配置文件,分別命名為redis7001.conf、redis7002.conf、redis7003.conf、redis7004.conf、redis7005.conf、redis7006conf,存放在自己想要放的地方。
并按照下列配置信息修改配置文件:
#修改成自己對(duì)應(yīng)的端口號(hào)
port
#指定了記錄日志的文件。
logfile
#數(shù)據(jù)目錄,數(shù)據(jù)庫(kù)的寫入會(huì)在這個(gè)目錄。rdb、aof文件也會(huì)寫在這個(gè)目錄
dir
#是否開啟集群
cluster-enabled
#集群配置文件的名稱,每個(gè)節(jié)點(diǎn)都有一個(gè)集群相關(guān)的配置文件,持久化保存集群的信息。
#這個(gè)文件并不需要手動(dòng)配置,這個(gè)配置文件由Redis生成并更新,每個(gè)Redis集群節(jié)點(diǎn)需要一個(gè)單獨(dú)的配置文件,請(qǐng)確保與實(shí)例運(yùn)行的系統(tǒng)中配置文件名稱不沖突(建議配對(duì)應(yīng)端口號(hào))
cluster-config-file nodes-6379.conf
#節(jié)點(diǎn)互連超時(shí)的閥值。集群節(jié)點(diǎn)超時(shí)毫秒數(shù)
cluster-node-timeout 5000
#默認(rèn)redis使用的是rdb方式持久化,這種方式在許多應(yīng)用中已經(jīng)足夠用了。
#但是redis如果中途宕機(jī),會(huì)導(dǎo)致可能有幾分鐘的數(shù)據(jù)丟失,根據(jù)save來(lái)策略進(jìn)行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性。
#Redis會(huì)把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件,每次啟動(dòng)時(shí)Redis都會(huì)先把這個(gè)文件的數(shù)據(jù)讀入內(nèi)存里,先忽略RDB文件。
appendonly
appendonly yes
protected-mode no #保護(hù)模式 yes改為no
#bind 127.0.0.1 #注釋或者去掉這個(gè)
daemonize yes #用來(lái)指定redis是否要用守護(hù)線程的方式啟動(dòng),yes表示后臺(tái)啟動(dòng)
執(zhí)行命令分別啟動(dòng)所有節(jié)點(diǎn),如:
/Volumes/work/redis-5.0.8/src/redis-server
/Volumes/work/redis-5.0.8/conf/7001/redis7001.conf
/Volumes/work/redis-5.0.8/src/redis-server
/Volumes/work/redis-5.0.8/conf/7002/redis7002.conf
/Volumes/work/redis-5.0.8/src/redis-server
/Volumes/work/redis-5.0.8/conf/7003/redis7003.conf
/Volumes/work/redis-5.0.8/src/redis-server
/Volumes/work/redis-5.0.8/conf/7004/redis7004.conf
/Volumes/work/redis-5.0.8/src/redis-server
/Volumes/work/redis-5.0.8/conf/7005/redis7005.conf
/Volumes/work/redis-5.0.8/src/redis-server
/Volumes/work/redis-5.0.8/conf/7006/redis7006.conf
可以查看到進(jìn)程:
192:conf houjing$ ps -ef |grep redis
501 43005 1 0 5:46上午 ?? 0:00.20 /Volumes/work/redis-5.0.8/src/redis-server *:7001 [cluster]
501 43018 1 0 5:47上午 ?? 0:00.02 /Volumes/work/redis-5.0.8/src/redis-server *:7002 [cluster]
501 43020 1 0 5:47上午 ?? 0:00.02 /Volumes/work/redis-5.0.8/src/redis-server *:7003 [cluster]
501 43022 1 0 5:47上午 ?? 0:00.02 /Volumes/work/redis-5.0.8/src/redis-server *:7004 [cluster]
501 43024 1 0 5:47上午 ?? 0:00.02 /Volumes/work/redis-5.0.8/src/redis-server *:7005 [cluster]
501 43026 1 0 5:47上午 ?? 0:00.01 /Volumes/work/redis-5.0.8/src/redis-server *:7006 [cluster]
執(zhí)行命令創(chuàng)建集群:
/Volumes/work/redis-5.0.8/src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
--cluster-replicas 1 # 1表示每個(gè)主節(jié)點(diǎn)至少一個(gè)備份
可以得到如下結(jié)果:
192:conf houjing$ /Volumes/work/redis-5.0.8/src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 4c7fcd06c55ceec27b5bbc450b99159282e7783e 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
M: d7a0d77d2f0fa05ccf4a14e379b52044b212607e 127.0.0.1:7002
slots:[5461-10922] (5462 slots) master
M: 6494df31d4ed564d80947c9d39369cc7cfb6c0e6 127.0.0.1:7003
slots:[10923-16383] (5461 slots) master
S: 9d6d78888e579442b209fca95af13b6ece4810b6 127.0.0.1:7004
replicates 6494df31d4ed564d80947c9d39369cc7cfb6c0e6
S: 8891bfe505da42298be048364ed003b83dc52139 127.0.0.1:7005
replicates 4c7fcd06c55ceec27b5bbc450b99159282e7783e
S: 981ad9769245c140c0bd9ee239472dc6e2cb07eb 127.0.0.1:7006
replicates d7a0d77d2f0fa05ccf4a14e379b52044b212607e
Can I set the above configuration? (type 'yes' to accept): yes 此處輸入yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: 4c7fcd06c55ceec27b5bbc450b99159282e7783e 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 981ad9769245c140c0bd9ee239472dc6e2cb07eb 127.0.0.1:7006
slots: (0 slots) slave
replicates d7a0d77d2f0fa05ccf4a14e379b52044b212607e
M: 6494df31d4ed564d80947c9d39369cc7cfb6c0e6 127.0.0.1:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 9d6d78888e579442b209fca95af13b6ece4810b6 127.0.0.1:7004
slots: (0 slots) slave
replicates 6494df31d4ed564d80947c9d39369cc7cfb6c0e6
M: d7a0d77d2f0fa05ccf4a14e379b52044b212607e 127.0.0.1:7002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 8891bfe505da42298be048364ed003b83dc52139 127.0.0.1:7005
slots: (0 slots) slave
replicates 4c7fcd06c55ceec27b5bbc450b99159282e7783e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
2.1.2 集群檢查
可以執(zhí)行命令?./redis-cli -c -p 7001?進(jìn)行登錄,然后查看集群信息以及slot分配信息:
192:src houjing$ ./redis-cli -c -p 7001
127.0.0.1:7001> cluster nodes
981ad9769245c140c0bd9ee239472dc6e2cb07eb 127.0.0.1:7006@17006 slave d7a0d77d2f0fa05ccf4a14e379b52044b212607e 0 1586210070424 6 connected
4c7fcd06c55ceec27b5bbc450b99159282e7783e 127.0.0.1:7001@17001 myself,master - 0 1586210069000 1 connected 0-5460
6494df31d4ed564d80947c9d39369cc7cfb6c0e6 127.0.0.1:7003@17003 master - 0 1586210071437 3 connected 10923-16383
9d6d78888e579442b209fca95af13b6ece4810b6 127.0.0.1:7004@17004 slave 6494df31d4ed564d80947c9d39369cc7cfb6c0e6 0 1586210069416 4 connected
d7a0d77d2f0fa05ccf4a14e379b52044b212607e 127.0.0.1:7002@17002 master - 0 1586210070000 2 connected 5461-10922
8891bfe505da42298be048364ed003b83dc52139 127.0.0.1:7005@17005 slave 4c7fcd06c55ceec27b5bbc450b99159282e7783e 0 1586210070000 5 connected
可以根據(jù)以上得出總共有3個(gè)master節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有一個(gè)slave節(jié)點(diǎn),三個(gè)master節(jié)點(diǎn)分別分配了0-5460、5461-10922、10923-16383三個(gè)slot范圍,7001這個(gè)master節(jié)點(diǎn)的slave節(jié)點(diǎn)為7005節(jié)點(diǎn),其id為4c7fcd06c55ceec27b5bbc450b99159282e7783e。
添加數(shù)據(jù),可以看到數(shù)據(jù)會(huì)根hash然后存到對(duì)應(yīng)的slot槽,也就是存到slot槽對(duì)應(yīng)的節(jié)點(diǎn)上,如下所示:
127.0.0.1:7001> set 789 789
-> Redirected to slot [11123] located at 127.0.0.1:7003
OK
127.0.0.1:7003> set 123 123
-> Redirected to slot [5970] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set 365 365
-> Redirected to slot [5424] located at 127.0.0.1:7001
OK
當(dāng)然每個(gè)節(jié)點(diǎn)也只有自己的那部分?jǐn)?shù)據(jù):
127.0.0.1:7001> keys *
1) "365"
2.1.3 宕機(jī)測(cè)試
我們通過手動(dòng)殺掉節(jié)點(diǎn)7001的進(jìn)程:
192:bin houjing$ kill 43005
192:bin houjing$ ps -ef|grep redis
501 43018 1 0 5:47上午 ?? 0:03.91 /Volumes/work/redis-5.0.8/src/redis-server *:7002 [cluster]
501 43020 1 0 5:47上午 ?? 0:03.94 /Volumes/work/redis-5.0.8/src/redis-server *:7003 [cluster]
501 43022 1 0 5:47上午 ?? 0:03.95 /Volumes/work/redis-5.0.8/src/redis-server *:7004 [cluster]
501 43024 1 0 5:47上午 ?? 0:03.92 /Volumes/work/redis-5.0.8/src/redis-server *:7005 [cluster]
501 43026 1 0 5:47上午 ?? 0:03.91 /Volumes/work/redis-5.0.8/src/redis-server *:7006 [cluster]
然后查看集群信息:
127.0.0.1:7002> cluster nodes
8891bfe505da42298be048364ed003b83dc52139 127.0.0.1:7005@17005 master - 0 1586210953749 7 connected 0-5460
9d6d78888e579442b209fca95af13b6ece4810b6 127.0.0.1:7004@17004 slave 6494df31d4ed564d80947c9d39369cc7cfb6c0e6 0 1586210953547 4 connected
981ad9769245c140c0bd9ee239472dc6e2cb07eb 127.0.0.1:7006@17006 slave d7a0d77d2f0fa05ccf4a14e379b52044b212607e 0 1586210952000 6 connected
d7a0d77d2f0fa05ccf4a14e379b52044b212607e 127.0.0.1:7002@17002 myself,master - 0 1586210952000 2 connected 5461-10922
6494df31d4ed564d80947c9d39369cc7cfb6c0e6 127.0.0.1:7003@17003 master - 0 1586210952538 3 connected 10923-16383
4c7fcd06c55ceec27b5bbc450b99159282e7783e 127.0.0.1:7001@17001 master,fail - 1586210920633 1586210919825 1 disconnected
可以看到原先7001節(jié)點(diǎn)斷開連接,其slave節(jié)點(diǎn)7005頂替了7001節(jié)點(diǎn),變成了master節(jié)點(diǎn),并繼承了原先7001節(jié)點(diǎn)的slot槽。
當(dāng)我們重新啟動(dòng)7001節(jié)點(diǎn)后,7001節(jié)點(diǎn)便作為7005的slave節(jié)點(diǎn)重新上線:
127.0.0.1:7002> cluster nodes
8891bfe505da42298be048364ed003b83dc52139 127.0.0.1:7005@17005 master - 0 1586211138837 7 connected 0-5460
9d6d78888e579442b209fca95af13b6ece4810b6 127.0.0.1:7004@17004 slave 6494df31d4ed564d80947c9d39369cc7cfb6c0e6 0 1586211138331 4 connected
981ad9769245c140c0bd9ee239472dc6e2cb07eb 127.0.0.1:7006@17006 slave d7a0d77d2f0fa05ccf4a14e379b52044b212607e 0 1586211139548 6 connected
d7a0d77d2f0fa05ccf4a14e379b52044b212607e 127.0.0.1:7002@17002 myself,master - 0 1586211138000 2 connected 5461-10922
6494df31d4ed564d80947c9d39369cc7cfb6c0e6 127.0.0.1:7003@17003 master - 0 1586211139000 3 connected 10923-16383
4c7fcd06c55ceec27b5bbc450b99159282e7783e 127.0.0.1:7001@17001 slave 8891bfe505da42298be048364ed003b83dc52139 0 1586211137522 7 connected
2.1.4 水平擴(kuò)展
由于我們Redis集群是有能力限制的,當(dāng)不能滿足當(dāng)下要求的時(shí)候,就需要進(jìn)行擴(kuò)容,這事就涉及到水平擴(kuò)展,我們先增加兩份配置文件redis7007.conf、redis7008.conf,并創(chuàng)建兩個(gè)節(jié)點(diǎn)并啟動(dòng):
192:conf houjing$ /Volumes/work/redis-5.0.8/src/redis-server /Volumes/work/redis-5.0.8/conf/7007/redis7007.conf
192:conf houjing$ /Volumes/work/redis-5.0.8/src/redis-server /Volumes/work/redis-5.0.8/conf/7008/redis7008.conf
192:conf houjing$ ps -ef |grep redis
501 43018 1 0 5:47上午 ?? 0:06.27 /Volumes/work/redis-5.0.8/src/redis-server *:7002 [cluster]
501 43020 1 0 5:47上午 ?? 0:06.29 /Volumes/work/redis-5.0.8/src/redis-server *:7003 [cluster]
501 43022 1 0 5:47上午 ?? 0:06.29 /Volumes/work/redis-5.0.8/src/redis-server *:7004 [cluster]
501 43024 1 0 5:47上午 ?? 0:06.25 /Volumes/work/redis-5.0.8/src/redis-server *:7005 [cluster]
501 43026 1 0 5:47上午 ?? 0:06.24 /Volumes/work/redis-5.0.8/src/redis-server *:7006 [cluster]
501 43109 1 0 6:12上午 ?? 0:01.31 /Volumes/work/redis-5.0.8/src/redis-server *:7001 [cluster]
501 43141 1 0 6:18上午 ?? 0:00.03 /Volumes/work/redis-5.0.8/src/redis-server *:7007 [cluster]
501 43143 1 0 6:18上午 ?? 0:00.03 /Volumes/work/redis-5.0.8/src/redis-server *:7008 [cluster]
但是我們可以看到雖然進(jìn)程啟動(dòng)了,但是并未加到集群中去:
127.0.0.1:7002> cluster nodes
8891bfe505da42298be048364ed003b83dc52139 127.0.0.1:7005@17005 master - 0 1586211626238 7 connected 0-5460
9d6d78888e579442b209fca95af13b6ece4810b6 127.0.0.1:7004@17004 slave 6494df31d4ed564d80947c9d39369cc7cfb6c0e6 0 1586211626741 4 connected
981ad9769245c140c0bd9ee239472dc6e2cb07eb 127.0.0.1:7006@17006 slave d7a0d77d2f0fa05ccf4a14e379b52044b212607e 0 1586211626036 6 connected
d7a0d77d2f0fa05ccf4a14e379b52044b212607e 127.0.0.1:7002@17002 myself,master - 0 1586211625000 2 connected 5461-10922
6494df31d4ed564d80947c9d39369cc7cfb6c0e6 127.0.0.1:7003@17003 master - 0 1586211626540 3 connected 10923-16383
4c7fcd06c55ceec27b5bbc450b99159282e7783e 127.0.0.1:7001@17001 slave 8891bfe505da42298be048364ed003b83dc52139 0 1586211627751 7 connected
執(zhí)行集群節(jié)點(diǎn)并沒有返現(xiàn)我們的節(jié)點(diǎn)數(shù)據(jù),這個(gè)時(shí)候需要把啟動(dòng)的節(jié)點(diǎn)數(shù)據(jù)增加到集群中去,執(zhí)行命令:./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7005:
192:src houjing$ ./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004
slots: (0 slots) slave
replicates a3b2d4619e3ad17ea86f69a05543b12aa722a864
S: 10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005
slots: (0 slots) slave
replicates de6820c4780a070ac658ee4bdf98c44b46038d81
M: de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006
slots: (0 slots) slave
replicates e83dc175f217148444a07ed367fea54ed6b3e2aa
M: a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster.
[OK] New node added correctly.
127.0.0.1:7005> cluster nodes
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586212133524 3 connected 10923-16383
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 master - 0 1586212134536 1 connected 0-5460
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586212133323 2 connected 5461-10922
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586212133000 4 connected
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 0 1586212134333 0 connected
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 myself,slave de6820c4780a070ac658ee4bdf98c44b46038d81 0 1586212134000 5 connected
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 slave e83dc175f217148444a07ed367fea54ed6b3e2aa 0 1586212134000 6 connected
可以看到7007成功加入到集群節(jié)點(diǎn),但是并未分配slot槽,接下來(lái)使用redis-cli命令為7007分配hash槽,找到集群中的任意一個(gè)主節(jié)點(diǎn)(7001),對(duì)其進(jìn)行重新分片工作。命令:?./redis-cli --cluster reshard 127.0.0.1:7001
192:src houjing$ ./redis-cli --cluster reshard 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004
slots: (0 slots) slave
replicates a3b2d4619e3ad17ea86f69a05543b12aa722a864
S: 10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005
slots: (0 slots) slave
replicates de6820c4780a070ac658ee4bdf98c44b46038d81
M: de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006
slots: (0 slots) slave
replicates e83dc175f217148444a07ed367fea54ed6b3e2aa
M: a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007
slots: (0 slots) master
M: a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? a8236394ddd7f210e4df2036bd73968503283cf8
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all
以上就是要從其余三個(gè)master上劃分1000個(gè)slot到7007節(jié)點(diǎn),7007節(jié)點(diǎn)的ID為a8236394ddd7f210e4df2036bd73968503283cf8。兩種reshard方式如下:
- 一種是all,以將所有節(jié)點(diǎn)用作散列槽的源節(jié)點(diǎn),
- 一種是done,這種是你自己選擇從哪個(gè)節(jié)點(diǎn)上拿出來(lái)節(jié)點(diǎn)分給8007
備注:all是隨機(jī)的,比如說我們要分出1000個(gè),則3個(gè)主節(jié)點(diǎn)分別拿出333個(gè),333個(gè),334個(gè)節(jié)點(diǎn)分別給7007。
此時(shí)查看cluster nodes信息如下:
127.0.0.1:7005> cluster nodes
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586212646000 3 connected 11256-16383
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 master - 0 1586212645158 1 connected 333-5460
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586212646000 2 connected 5795-10922
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586212646572 4 connected
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 0 1586212646372 7 connected 0-332 5461-5794 10923-11255
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 myself,slave de6820c4780a070ac658ee4bdf98c44b46038d81 0 1586212645000 5 connected
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 slave e83dc175f217148444a07ed367fea54ed6b3e2aa 0 1586212645000 6 connected
可以看到7007節(jié)點(diǎn)拿到了3段合計(jì)1000個(gè)slot槽,接下來(lái)我們?yōu)?007增加從節(jié)點(diǎn)7008,依舊是先把7008添加到集群中去:./redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001:
127.0.0.1:7005> cluster nodes
d9daa198ebe389f7c707e6d41c8052e59f29ce0b 127.0.0.1:7008@17008 master - 0 1586212814000 0 connected
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586212814970 3 connected 11256-16383
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 master - 0 1586212815000 1 connected 333-5460
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586212815000 2 connected 5795-10922
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586212814565 4 connected
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 0 1586212815574 7 connected 0-332 5461-5794 10923-11255
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 myself,slave de6820c4780a070ac658ee4bdf98c44b46038d81 0 1586212815000 5 connected
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 slave e83dc175f217148444a07ed367fea54ed6b3e2aa 0 1586212814565 6 connected
可以看到7008添加到了集群,但是目前還是主節(jié)點(diǎn),并且沒有hash槽。接下來(lái)需要讓其變成從節(jié)點(diǎn)。
命令:CLUSTER REPLICATE?a8236394ddd7f210e4df2036bd73968503283cf8(這個(gè)節(jié)點(diǎn)給哪個(gè)主節(jié)點(diǎn))
192:src houjing$ ./redis-cli -c -p 7008
127.0.0.1:7008> CLUSTER REPLICATE a8236394ddd7f210e4df2036bd73968503283cf8
OK
127.0.0.1:7008> cluster nodes
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586213074000 2 connected
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 0 1586213073000 7 connected 0-332 5461-5794 10923-11255
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 slave e83dc175f217148444a07ed367fea54ed6b3e2aa 0 1586213073000 1 connected
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586213074818 3 connected 11256-16383
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 master - 0 1586213074000 1 connected 333-5460
d9daa198ebe389f7c707e6d41c8052e59f29ce0b 127.0.0.1:7008@17008 myself,slave a8236394ddd7f210e4df2036bd73968503283cf8 0 1586213073000 0 connected
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586213074513 2 connected 5795-10922
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 slave a8236394ddd7f210e4df2036bd73968503283cf8 0 1586213074513 7 connected
如上所示,查看cluster nodes信息則可直到成功實(shí)現(xiàn)Redis集群的水平擴(kuò)容。
2.1.5 節(jié)點(diǎn)下線
我們現(xiàn)實(shí)中存在著水平擴(kuò)展,那么當(dāng)服務(wù)使用量下降時(shí),也存在著節(jié)點(diǎn)下線。比如我們要讓剛擴(kuò)容的7007、7008下線,我們先來(lái)刪除從節(jié)點(diǎn)7008:
命令:./redis-cli --cluster del-node 127.0.0.1:7008?d9daa198ebe389f7c707e6d41c8052e59f29ce0b
192:src houjing$ ./redis-cli --cluster del-node 127.0.0.1:7008 d9daa198ebe389f7c707e6d41c8052e59f29ce0b
>>> Removing node d9daa198ebe389f7c707e6d41c8052e59f29ce0b from cluster 127.0.0.1:7008
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
127.0.0.1:7001> cluster nodes
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586213383501 4 connected
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 myself,master - 0 1586213383000 1 connected 333-5460
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 slave a8236394ddd7f210e4df2036bd73968503283cf8 0 1586213383000 7 connected
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586213383000 3 connected 11256-16383
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 slave e83dc175f217148444a07ed367fea54ed6b3e2aa 0 1586213384308 6 connected
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 0 1586213383300 7 connected 0-332 5461-5794 10923-11255
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586213383000 2 connected 5795-10922
接下來(lái)刪除主節(jié)點(diǎn)7007,命令:./redis-cli --cluster reshard 127.0.0.1:7007
192:src houjing$ ./redis-cli --cluster reshard 127.0.0.1:7007
>>> Performing Cluster Check (using node 127.0.0.1:7007)
M: a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007
slots:[172-665],[5461-6128],[10923-11588] (1828 slots) master
1 additional replica(s)
M: a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002
slots:[6542-10922] (4381 slots) master
1 additional replica(s)
S: 4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004
slots: (0 slots) slave
replicates a3b2d4619e3ad17ea86f69a05543b12aa722a864
M: de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003
slots:[12003-16383] (4381 slots) master
S: 9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006
slots: (0 slots) slave
replicates e83dc175f217148444a07ed367fea54ed6b3e2aa
M: e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001
slots:[0-171],[666-5460],[6129-6541],[11589-12002] (5794 slots) master
1 additional replica(s)
S: 10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005
slots: (0 slots) slave
replicates a8236394ddd7f210e4df2036bd73968503283cf8
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1828
What is the receiving node ID? a3b2d4619e3ad17ea86f69a05543b12aa722a864
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: a8236394ddd7f210e4df2036bd73968503283cf8
Source node #2: done
Ready to move 1828 slots.
可以看到我們把7007節(jié)點(diǎn)的1828個(gè)slot全部移到了7002上,再次查看cluster nodes信息如下:
127.0.0.1:7001> cluster nodes
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586214201506 9 connected
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 myself,master - 0 1586214200000 8 connected 0-171 666-5460 6129-6541 11589-12002
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586214201000 9 connected
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586214200000 3 connected 12003-16383
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 slave e83dc175f217148444a07ed367fea54ed6b3e2aa 0 1586214200000 8 connected
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 0 1586214201707 7 connected
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586214201000 9 connected 172-665 5461-6128 6542-11588
7007節(jié)點(diǎn)還在,但是分配的slot沒有了,接下來(lái)關(guān)閉7007節(jié)點(diǎn),命令:./redis-cli -p 7001 shutdown
127.0.0.1:7001> cluster nodes
a8236394ddd7f210e4df2036bd73968503283cf8 127.0.0.1:7007@17007 master - 1586214471239 1586214469000 7 disconnected
4686809f8673bc918f03fd8642c410c1ca647a39 127.0.0.1:7004@17004 slave a3b2d4619e3ad17ea86f69a05543b12aa722a864 0 1586214473159 9 connected
e83dc175f217148444a07ed367fea54ed6b3e2aa 127.0.0.1:7001@17001 myself,slave 9624c69e40a36dd1d67fbd21cae75753735f3f02 0 1586214473000 8 connected
de6820c4780a070ac658ee4bdf98c44b46038d81 127.0.0.1:7003@17003 master - 0 1586214473000 3 connected 12003-16383
9624c69e40a36dd1d67fbd21cae75753735f3f02 127.0.0.1:7006@17006 master - 0 1586214472653 10 connected 0-171 666-5460 6129-6541 11589-12002
a3b2d4619e3ad17ea86f69a05543b12aa722a864 127.0.0.1:7002@17002 master - 0 1586214474073 9 connected 172-665 5461-6128 6542-11588
10eed7c7bbbd7e9e427d0ccf7e2d557607d7467f 127.0.0.1:7005@17005 slave 9624c69e40a36dd1d67fbd21cae75753735f3f02 0 1586214474175 10 connected
于是實(shí)現(xiàn)了7007、7008節(jié)點(diǎn)的下線。
2.2 Redis-Cluster 的配置
2.2.1 redis.conf 配置
需要修改redis.conf 配置文件
cluster-enable yes # 表示這個(gè)Redis 是一個(gè)cluster節(jié)點(diǎn)
cluster-config-file [filename.conf] # cluster的配置文件
cluster-node-timeout 10000 # 節(jié)點(diǎn)服務(wù)超時(shí)時(shí)間,用于判定該節(jié)點(diǎn)是否下線或切換為從節(jié)點(diǎn)
cluster集群中各個(gè)redis依次啟動(dòng)完成后,需要使用
./redis-trib.rb create --replicas 1 ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6
create 代表創(chuàng)建集群
--replicas: 指定內(nèi)部結(jié)構(gòu) 1:代表一個(gè)master連接一個(gè)slave節(jié)點(diǎn) ip1:port1->ip4:port4 ip2:port2->ip5:port5 ip3:port3->ip6:port6
2: 代表一個(gè)master連接兩個(gè)slave節(jié)點(diǎn) ip1:port1->ip3:port3,ip4:port4 ip2:port2->ip5:port5,ip6:port6
cluster集群搭建好之后,需要注意的是要使用 redis-cli -c 來(lái)連接 cluster集群。
2.2.2 Cluster的 slot 槽重分配
Redis-Cluster 支持動(dòng)態(tài)的新增和刪除節(jié)點(diǎn)
新增
./redis-trib.rb add-node [ip1:port1] [ip2:port],新增成功后我們可以通過 cluster nodes 命令查看集群節(jié)點(diǎn)信息,我們可以看到 新增的節(jié)點(diǎn)是沒有被分配 slot槽的。
手動(dòng)分配槽節(jié)點(diǎn)
cluster setslot 5462 node e4fee6a90d5b071ad514cd30f8d5d9a1c13947b3
cluster setslot [槽] node [目標(biāo)id]
自動(dòng)分配槽節(jié)點(diǎn)
./redis-trib.rb reshard ip:port
刪除
對(duì)于已經(jīng)分配了槽區(qū)間的節(jié)點(diǎn),我們是無(wú)法直接刪除的,需要先將槽區(qū)間分配出去,然后再進(jìn)行刪除
將槽區(qū)間分配到其他節(jié)點(diǎn)
./redis-trib.rb reshard ip:port
刪除命令
./redis-trib.rb del-node ip:port 目標(biāo)id
參考鏈接
運(yùn)維:終于不用再背著數(shù)萬(wàn)實(shí)例的Redis集群了!_Cluster
Redis學(xué)習(xí)之4種模式實(shí)踐及機(jī)制解析(單機(jī)、主從、哨兵、集群)
redis架構(gòu)_劍八-的博客-CSDN博客
Redis高可用方案—主從(masterslave)架構(gòu)
Redis高可用架構(gòu)—哨兵(sentinel)機(jī)制詳細(xì)介紹
Redis高可用架構(gòu)—Redis集群(Redis Cluster)詳細(xì)介紹
Redis學(xué)習(xí)之Redis集群模式缺陷及其處理文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-696084.html
- Redis學(xué)習(xí)之4種模式實(shí)踐及機(jī)制解析(單機(jī)、主從、哨兵、集群)
- Redis學(xué)習(xí)之API學(xué)習(xí)及Jedis源碼原理分析
- Redis學(xué)習(xí)之Jedis源碼原理分析探究(BIO手寫Jedis客戶端)
Redis 詳解_王叮咚的博客-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-696084.html
到了這里,關(guān)于【云原生進(jìn)階之PaaS中間件】第一章Redis-2.3.3集群模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!