(七)Redis的集群

思維導(dǎo)圖

si

什么是Redis的集群?

??我們先了解下什么是集群?
??當(dāng)單個(gè)服務(wù)器處理到達(dá)瓶頸的時(shí)候,將其復(fù)制幾份,這樣就構(gòu)成了一個(gè)“集群”。集群中每臺(tái)服務(wù)器就叫做這個(gè)集群的一個(gè)“節(jié)點(diǎn)”,所有節(jié)點(diǎn)構(gòu)成了一個(gè)集群。每個(gè)節(jié)點(diǎn)都提供相同的服務(wù),那么這樣系統(tǒng)的處理能力就提升了好幾倍(有瓶頸)。
??Redis的集群是Redis提供的分布式數(shù)據(jù)庫(kù)方案,集群通過(guò)分片來(lái)進(jìn)行數(shù)據(jù)共享,并提供復(fù)制故障轉(zhuǎn)移功能,Redis集群至少需要6臺(tái)Redis服務(wù)器。

節(jié)點(diǎn)與集群

??一個(gè)節(jié)點(diǎn)就是一個(gè)普通的Redis服務(wù)器,一個(gè)Redis集群通常由多個(gè)節(jié)點(diǎn)組成,開(kāi)始每個(gè)節(jié)點(diǎn)都是相互獨(dú)立的,它們都處于一個(gè)只包含自己的集群當(dāng)中。要組建一個(gè)真正可以工作的集群,必須將各個(gè)獨(dú)立的節(jié)點(diǎn)連接起來(lái),構(gòu)成一個(gè)包含多個(gè)節(jié)點(diǎn)的集群。
??節(jié)點(diǎn)的信息都保存在自身的一個(gè)數(shù)據(jù)結(jié)構(gòu)clusterNode當(dāng)中,clusterNode結(jié)構(gòu)保存了一個(gè)節(jié)點(diǎn)的當(dāng)前狀態(tài),比如節(jié)點(diǎn)的創(chuàng)建時(shí)間、節(jié)點(diǎn)名字、節(jié)點(diǎn)當(dāng)前的配置紀(jì)元、節(jié)點(diǎn)的IP地址和端口號(hào)、節(jié)點(diǎn)處理的槽等等信息。

啟動(dòng)節(jié)點(diǎn)

??普通的Redis服務(wù)器配置沒(méi)有開(kāi)啟集群功能,自然也就不能說(shuō)它是一個(gè)節(jié)點(diǎn)。既然這樣,那我們就去配置文件開(kāi)啟集群開(kāi)關(guān),配置文件加入內(nèi)容:

cluster-enabled yes  //打開(kāi)集群模式
cluster-config-file nodes.conf  //設(shè)定節(jié)點(diǎn)配置文件名
cluster-node-timeout 5000  //設(shè)定節(jié)點(diǎn)超時(shí)時(shí)間,超過(guò)該時(shí)間集群自動(dòng)進(jìn)行主從切換

??下面為例子redis6380.conf文件的配置內(nèi)容:

include /usr/local/etc/redis.conf
port 6380
pidfile "/var/run/redis_6380.pid"
dbfilename "dump6380.rdb"

cluster-enabled yes
cluster-config-file nodes6380.conf
cluster-node-timeout 5000

??配置完成后指定這個(gè)配置文件啟動(dòng)即可:

$ redis-server /usr/local/etc/redis6380.conf 
34342:C 13 Apr 2019 10:11:29.949 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
34342:C 13 Apr 2019 10:11:29.949 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=34342, just started
34342:C 13 Apr 2019 10:11:29.949 # Configuration loaded

??查看一下該進(jìn)程,發(fā)現(xiàn)后面多了個(gè)[cluster]的標(biāo)識(shí),即說(shuō)明該Redis服務(wù)器開(kāi)啟了集群模式(如果要連接該節(jié)點(diǎn)需要使用redis-cli -c - p <port>命令,表示該節(jié)點(diǎn)開(kāi)啟了集群)。

$ ps -ef|grep redis
  501 34343     1   0 10:11上午 ??         0:00.09 redis-server *:6380 [cluster] 

節(jié)點(diǎn)組成集群

??集群由多個(gè)節(jié)點(diǎn)組成,所以需要先將各個(gè)節(jié)點(diǎn)連接起來(lái),連接各個(gè)節(jié)點(diǎn)的工作可以使用cluster meet命令來(lái)完成:

127.0.0.1:6379>cluster meet <IP> <Port>

??客戶端連接節(jié)點(diǎn)后向另一個(gè)節(jié)點(diǎn)發(fā)送該命令可以讓這兩個(gè)節(jié)點(diǎn)進(jìn)行握手,握手成功后,另一個(gè)節(jié)點(diǎn)就會(huì)被添加到發(fā)起命令節(jié)點(diǎn)所在的集群中,過(guò)程如下圖:


節(jié)點(diǎn)的握手過(guò)程

??舉個(gè)例子,啟動(dòng)3臺(tái)Redis服務(wù)器(當(dāng)前電腦6380、6381、6382、)后(注意正常集群至少需要6臺(tái)Redis服務(wù)器,3主3從,此處只是實(shí)驗(yàn)),6380節(jié)點(diǎn)將6381和6382節(jié)點(diǎn)加入進(jìn)自身集群中:

//啟動(dòng)完的6個(gè)節(jié)點(diǎn)
  501 32901     1   0 10:04下午 ??         0:00.09 redis-server *:6380 [cluster] 
  501 32910     1   0 10:04下午 ??         0:00.07 redis-server *:6381 [cluster] 
  501 32918     1   0 10:04下午 ??         0:00.07 redis-server *:6382 [cluster] 
//將6381和6382節(jié)點(diǎn)加入自身集群
$ redis-cli -c -p 6380
127.0.0.1:6380> cluster meet 127.0.0.1 6381
OK
127.0.0.1:6380> cluster meet 127.0.0.1 6382
OK

??具體過(guò)程如下圖(名字不同,意思了解即可):


節(jié)點(diǎn)握手

節(jié)點(diǎn)通信消息

??集群中的各個(gè)節(jié)點(diǎn)通過(guò)發(fā)送和接收消息來(lái)進(jìn)行通信,發(fā)送消息的節(jié)點(diǎn)為發(fā)送者,接收消息的節(jié)點(diǎn)為接收者。
??節(jié)點(diǎn)發(fā)送的消息主要為以下五種:

  • MEET消息:當(dāng)發(fā)送者接到客戶端發(fā)送的cluster meet命令時(shí),發(fā)送者會(huì)向接收者發(fā)送MEET消息,請(qǐng)求接收者加入到發(fā)送者當(dāng)前所處集群里;
  • PING消息:集群的每個(gè)節(jié)點(diǎn)默認(rèn)每隔1秒鐘就會(huì)從已知節(jié)點(diǎn)列表隨機(jī)挑選5個(gè)節(jié)點(diǎn),然后對(duì)這5個(gè)節(jié)點(diǎn)中最長(zhǎng)時(shí)間沒(méi)有發(fā)送過(guò)PING消息的節(jié)點(diǎn)發(fā)送PING消息,以此來(lái)檢測(cè)被選中節(jié)點(diǎn)是否在線,其他特殊情況也會(huì)發(fā)送該消息;
  • PONG消息:接收者確認(rèn)MEETPING消息已到達(dá)時(shí),會(huì)向發(fā)送者發(fā)送該消息告知。特殊情況如故障轉(zhuǎn)移成功后會(huì)向集群廣播一條該消息;
  • FALL消息:當(dāng)一個(gè)主節(jié)點(diǎn)A判斷另一個(gè)主節(jié)點(diǎn)B已經(jīng)進(jìn)入FALL狀態(tài)時(shí),節(jié)點(diǎn)A會(huì)向集群廣播B的FALL消息,所有收到這條消息的節(jié)點(diǎn)都會(huì)立即將節(jié)點(diǎn)B標(biāo)記為已下線;
  • PUBLISH消息:當(dāng)節(jié)點(diǎn)接收到一個(gè)publish命令時(shí),節(jié)點(diǎn)會(huì)執(zhí)行這個(gè)命令,并向集群廣播一條PUBLISH消息,所有接收到這條消息的節(jié)點(diǎn)都會(huì)執(zhí)行相同的publish命令。

槽(slot)

??Redis集群通過(guò)分片的方式來(lái)保存數(shù)據(jù)庫(kù)中的鍵值對(duì),集群的整個(gè)數(shù)據(jù)庫(kù)被分為16384個(gè)可用插槽(slot),數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這16834個(gè)插槽中的一個(gè),集群中的每個(gè)節(jié)點(diǎn)可以處理0個(gè)或最多16834個(gè)插槽。
??當(dāng)數(shù)據(jù)庫(kù)中的16834個(gè)槽都有節(jié)點(diǎn)在處理時(shí),集群處于上線狀態(tài)(ok),相反地,如果數(shù)據(jù)庫(kù)中有任何一個(gè)槽沒(méi)有得到處理,集群處于下線狀態(tài)(fail).
??前面我們搭建的集群極為下線狀態(tài),因?yàn)榧褐械?個(gè)節(jié)點(diǎn)都沒(méi)有處理任何槽,我們可以通過(guò)cluster info命令查看其信息:

127.0.0.1:6380> cluster info
cluster_state:fail  //集群未上線
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:0
cluster_current_epoch:2
cluster_my_epoch:0
cluster_stats_messages_ping_sent:24
cluster_stats_messages_pong_sent:25
cluster_stats_messages_meet_sent:2
cluster_stats_messages_sent:51
cluster_stats_messages_ping_received:25
cluster_stats_messages_pong_received:26
cluster_stats_messages_received:51

指派槽給不同節(jié)點(diǎn)

??既然集群未上線,需要指派所有槽給不同節(jié)點(diǎn),那么我們指派就好了,通過(guò)redis-cli -h <IP> -p <Port> cluster addslots {0..5460}命令可以指派相應(yīng)槽給指定節(jié)點(diǎn):

$ redis-cli -h 127.0.0.1 -p 6380 cluster addslots {0..5460}
OK

# wksky @ localhost in ~ [10:47:57] 
$ redis-cli -h 127.0.0.1 -p 6381 cluster addslots {5461..11111}
OK

# wksky @ localhost in ~ [10:48:29] 
$ redis-cli -h 127.0.0.1 -p 6382 cluster addslots {11112..16383}
OK

??因?yàn)?6384個(gè)槽都分配完畢,所以現(xiàn)在集群處于上線狀態(tài):

$ redis-cli -c -p 6380
127.0.0.1:6380> cluster info
cluster_state:ok  //集群上線
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:2
cluster_my_epoch:1
cluster_stats_messages_ping_sent:106
cluster_stats_messages_pong_sent:108
cluster_stats_messages_meet_sent:2
cluster_stats_messages_sent:216
cluster_stats_messages_ping_received:108
cluster_stats_messages_pong_received:108
cluster_stats_messages_received:216
127.0.0.1:6380> cluster nodes
f661beaff3b734caa56c8e92a62c0e4e7f661c2d 127.0.0.1:6381@16381 master - 0 1555130707063 0 connected 5461-11111
d033f0bde8d29441ea01ba275ad93714a80219ba 127.0.0.1:6382@16382 master - 0 1555130708072 2 connected 11112-16383
ab8516a5f78a700fb982b03db954fb0946ee7489 127.0.0.1:6380@16380 myself,master - 0 1555130705000 1 connected 0-5460

節(jié)點(diǎn)中的槽信息(可跳過(guò))

??前面說(shuō)過(guò),不同的節(jié)點(diǎn)都保存了一個(gè)clusterNode結(jié)構(gòu),該結(jié)構(gòu)中的slotsnumslot屬性記錄了節(jié)點(diǎn)復(fù)制處理哪些槽。slots屬性是一個(gè)二進(jìn)制數(shù)組,長(zhǎng)度2048字節(jié),包含16384個(gè)二進(jìn)制位,將二進(jìn)制位編號(hào)為索引,根據(jù)索引上的二進(jìn)制位的值判斷節(jié)點(diǎn)是否負(fù)責(zé)處理槽i,numslot即位處理槽的數(shù)量(所有值相加,下圖數(shù)量為7),如下圖:

slots數(shù)組

??一個(gè)節(jié)點(diǎn)除了會(huì)將自己負(fù)責(zé)除了的槽信息記錄在2個(gè)屬性當(dāng)中,還會(huì)將自己的slots數(shù)組通過(guò)消息發(fā)送給集群中的其他節(jié)點(diǎn),以此來(lái)告知其他節(jié)點(diǎn)自己目前負(fù)責(zé)處理哪些槽,如下圖:
消息發(fā)送

在集群中執(zhí)行命令

??在對(duì)數(shù)據(jù)庫(kù)中的16384個(gè)槽都進(jìn)行了指派之后,集群就會(huì)進(jìn)入上線狀態(tài),這時(shí)客戶端就可以向集群中的節(jié)點(diǎn)發(fā)送數(shù)據(jù)命令了。
??當(dāng)客戶端向節(jié)點(diǎn)發(fā)送與數(shù)據(jù)庫(kù)鍵有關(guān)的命令時(shí)(如set username lucy),接受命令的節(jié)點(diǎn)會(huì)計(jì)算出命令要處理的數(shù)據(jù)庫(kù)鍵屬于哪個(gè)槽,并檢查這個(gè)槽是否指派給了自己,如下圖:

判斷客戶端是否需要轉(zhuǎn)向的流程

??比如我們?cè)谥?380、6381、6382三個(gè)節(jié)點(diǎn)組成的集群中,用客戶端連接節(jié)點(diǎn)6380,執(zhí)行下面的命令:

127.0.0.1:6380> set date 2019-4-13
OK

??因?yàn)殒Idate所在的槽正是節(jié)點(diǎn)6380負(fù)責(zé)處理的,所以執(zhí)行命令成功,如果不是呢?比如鍵username不是當(dāng)前節(jié)點(diǎn)能處理的,它會(huì)說(shuō)該鍵由14315槽處理,而該槽需要在節(jié)點(diǎn)6382才能處理,所以重定向到6382節(jié)點(diǎn)進(jìn)行處理,代碼如下:

127.0.0.1:6380> set username lucy
-> Redirected to slot [14315] located at 127.0.0.1:6382
OK
127.0.0.1:6382> 

鍵所在槽位置計(jì)算

??不同鍵所屬槽可以通過(guò)它給定的算法(CRC)計(jì)算,此處不再介紹。

節(jié)點(diǎn)數(shù)據(jù)庫(kù)

??集群節(jié)點(diǎn)保存鍵值對(duì)以及鍵值對(duì)過(guò)期時(shí)間的方式和單機(jī)Redis服務(wù)器保存鍵值對(duì)以及鍵值對(duì)過(guò)期時(shí)間的方式完全相同,此處不再介紹。
??節(jié)點(diǎn)和單機(jī)數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)方面的一個(gè)區(qū)別是:節(jié)點(diǎn)只能使用0號(hào)數(shù)據(jù)庫(kù),而單機(jī)Redis服務(wù)器則沒(méi)有這一限制。

重新分片

??Redis集群的重新分片操作可以將任意數(shù)量已經(jīng)指派給某個(gè)節(jié)點(diǎn)(源節(jié)點(diǎn))的槽指派給另一個(gè)節(jié)點(diǎn)(目標(biāo))節(jié)點(diǎn),并且相關(guān)槽所屬的鍵值對(duì)也會(huì)從源節(jié)點(diǎn)被移動(dòng)到目標(biāo)節(jié)點(diǎn)。
??重新分片操作可以在線進(jìn)行,該操作集群不需要下線,并且源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)都可以繼續(xù)處理命令請(qǐng)求。
??舉個(gè)例子,對(duì)之前包含6380、6381、6382三個(gè)節(jié)點(diǎn)的集群來(lái)說(shuō),我們可以向這個(gè)集群添加一個(gè)IP為127.0.0.1,端口號(hào)為6390的節(jié)點(diǎn)(請(qǐng)先啟動(dòng)該節(jié)點(diǎn)):

127.0.0.1:6380> cluster meet 127.0.0.1 6390
OK
127.0.0.1:6380> cluster nodes
f661beaff3b734caa56c8e92a62c0e4e7f661c2d 127.0.0.1:6381@16381 master - 0 1555130814019 0 connected 5461-11111
a6e9d00dc85f274259ed9e21417885d1085f4f33 127.0.0.1:6390@16390 master - 0 1555130813009 3 connected
d033f0bde8d29441ea01ba275ad93714a80219ba 127.0.0.1:6382@16382 master - 0 1555130812000 2 connected 11112-16383
ab8516a5f78a700fb982b03db954fb0946ee7489 127.0.0.1:6380@16380 myself,master - 0 1555130812000 1 connected 0-5460

??從節(jié)點(diǎn)信息可以很明顯的看到6390節(jié)點(diǎn)沒(méi)有指派任何一個(gè)槽,現(xiàn)在我們將6382指派過(guò)的槽中的11112槽指派給6390節(jié)點(diǎn):

127.0.0.1:6390> cluster delslots 11112
OK
127.0.0.1:6390> cluster addslots 11112
OK
a6e9d00dc85f274259ed9e21417885d1085f4f33 127.0.0.1:6390@16390 myself,master - 0 1555133779000 3 connected 11112
d033f0bde8d29441ea01ba275ad93714a80219ba 127.0.0.1:6382@16382 master - 0 1555133780877 2 connected 11113-16383
f661beaff3b734caa56c8e92a62c0e4e7f661c2d 127.0.0.1:6381@16381 master - 0 1555133780574 0 connected 5461-11111
ab8516a5f78a700fb982b03db954fb0946ee7489 127.0.0.1:6380@16380 master - 0 1555133780000 1 connected 0-5460

??這樣分片十分麻煩,所以一般使用Redis的集群管理軟件redis-trib來(lái)進(jìn)行分片,介紹見(jiàn)一篇文章

注意:重新分片過(guò)程中可能出現(xiàn)ASK錯(cuò)誤,即客戶端發(fā)送獲取鍵的命令的時(shí)候,該鍵所處的槽正在從一個(gè)節(jié)點(diǎn)遷移到另一個(gè)節(jié)點(diǎn),就會(huì)報(bào)ASK錯(cuò)誤,不過(guò)節(jié)點(diǎn)會(huì)根據(jù)這個(gè)錯(cuò)誤提供的IP和端口號(hào)轉(zhuǎn)向目標(biāo)節(jié)點(diǎn)發(fā)送ASKING命令,之后在重新發(fā)送原本想要執(zhí)行的命令,所以沒(méi)啥事。。。

節(jié)點(diǎn)復(fù)制與故障轉(zhuǎn)移

??Redis集群中的節(jié)點(diǎn)分為主節(jié)點(diǎn)(master)和從節(jié)點(diǎn)(slave),其中主節(jié)點(diǎn)用于處理槽,從節(jié)點(diǎn)用于復(fù)制某個(gè)主節(jié)點(diǎn)(從節(jié)點(diǎn)不含槽),并在被復(fù)制的主節(jié)點(diǎn)下線時(shí),代替下線主節(jié)點(diǎn)繼續(xù)處理命令請(qǐng)求.
??舉個(gè)例子,對(duì)于包含7000、7001、7002、7003、7004、7005的六個(gè)主節(jié)點(diǎn)集群來(lái)說(shuō),我們可以將7004和7005設(shè)定為節(jié)點(diǎn)7000的從節(jié)點(diǎn),如下圖:

7004和7005為節(jié)點(diǎn)7000的從節(jié)點(diǎn)

??設(shè)定各個(gè)節(jié)點(diǎn)狀態(tài)即它們工作如下圖:
各節(jié)點(diǎn)狀態(tài)

??當(dāng)節(jié)點(diǎn)7000進(jìn)入下線狀態(tài),集群經(jīng)過(guò)一段時(shí)間后將進(jìn)行故障轉(zhuǎn)移工作,仍在運(yùn)行的幾個(gè)主節(jié)點(diǎn)就會(huì)將節(jié)點(diǎn)7000的兩個(gè)從節(jié)點(diǎn)之一挑選出一個(gè)新的作為新的主節(jié)點(diǎn),其接管原來(lái)節(jié)點(diǎn)7000負(fù)責(zé)處理的槽,并繼續(xù)處理客戶端發(fā)送的命令請(qǐng)求:
7004成為新的主節(jié)點(diǎn)

之后各節(jié)點(diǎn)狀態(tài)

??故障轉(zhuǎn)移之后,下線的7000節(jié)點(diǎn)重新上線成為節(jié)點(diǎn)7004的從節(jié)點(diǎn),如下圖:
7000節(jié)點(diǎn)重新上線成為節(jié)點(diǎn)7004的從節(jié)點(diǎn)

之后各節(jié)點(diǎn)工作狀態(tài)

??當(dāng)然這些工作并沒(méi)有這么簡(jiǎn)單就完成,要經(jīng)過(guò)下面3個(gè)步驟:
??①設(shè)置從節(jié)點(diǎn);
??②故障檢測(cè);
??③故障轉(zhuǎn)移。

設(shè)置從節(jié)點(diǎn)

??通過(guò)向一個(gè)節(jié)點(diǎn)發(fā)送命令cluster replicate <node_id>即可讓當(dāng)前節(jié)點(diǎn)成為node_id節(jié)點(diǎn)的從節(jié)點(diǎn),并開(kāi)始對(duì)node_id節(jié)點(diǎn)進(jìn)行復(fù)制:

127.0.0.1:7004> cluster replicate f661beaff3b734caa56c8e92a62c0e4e7f661c2d
OK
127.0.0.1:7005> cluster replicate f661beaff3b734caa56c8e92a62c0e4e7f661c2d
OK

故障檢測(cè)

??集群中的每個(gè)節(jié)點(diǎn)都會(huì)定期地向集群中的其他節(jié)點(diǎn)發(fā)送PING消息,以此來(lái)檢測(cè)對(duì)方是否在線,如果接收PING消息的節(jié)點(diǎn)沒(méi)有在規(guī)定時(shí)間內(nèi)向發(fā)送PING的節(jié)點(diǎn)返回PONG消息,接收節(jié)點(diǎn)就會(huì)被發(fā)送節(jié)點(diǎn)標(biāo)記為疑似下線。
??如果在一個(gè)集群里面,半數(shù)以上的負(fù)責(zé)處理槽的主節(jié)點(diǎn)都將某個(gè)主節(jié)點(diǎn)標(biāo)記為疑似下線,那么這個(gè)主節(jié)點(diǎn)將被標(biāo)記為已下線,并向集群廣播一條關(guān)于該節(jié)點(diǎn)的FALL消息。

故障轉(zhuǎn)移

??當(dāng)一個(gè)從節(jié)點(diǎn)發(fā)現(xiàn)自己正在復(fù)制的主節(jié)點(diǎn)進(jìn)入了已下線狀態(tài)時(shí),從節(jié)點(diǎn)將開(kāi)始對(duì)下線主節(jié)點(diǎn)進(jìn)行故障轉(zhuǎn)移,執(zhí)行下面步驟:
1)從下線主節(jié)點(diǎn)的所有從節(jié)點(diǎn)基于一定規(guī)則選中一個(gè)執(zhí)行slaveof no one命令,成為新的主節(jié)點(diǎn);
2)新的主節(jié)點(diǎn)會(huì)撤銷(xiāo)所有對(duì)已下線主節(jié)點(diǎn)的槽指派,并將這些槽全部指派給自己;
3)新的主節(jié)點(diǎn)會(huì)向集群廣播一條PONG消息,讓其他節(jié)點(diǎn)立即知道當(dāng)前節(jié)點(diǎn)由從節(jié)點(diǎn)變?yōu)榱酥鞴?jié)點(diǎn),并且新主已接管所有舊主負(fù)責(zé)處理的槽;
4)新的主節(jié)點(diǎn)開(kāi)始接收和自己負(fù)責(zé)處理的槽有關(guān)的命令請(qǐng)求,故障轉(zhuǎn)移完成。
??

快速搭建集群

??如果節(jié)點(diǎn)多的話手動(dòng)組建集群很麻煩,所以我們可以一次性指定多個(gè)節(jié)點(diǎn)為一個(gè)集群(前提是所有節(jié)點(diǎn)之間未曾握手構(gòu)成小集群):

redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381  127.0.0.1:6382 127.0.0.1:6390 127.0.0.1:6391 127.0.0.1:6392 --cluster-replicas 1
//--cluster-replicas 1意味著我們希望每個(gè)創(chuàng)建的主服務(wù)器都有一個(gè)從服務(wù)器

??

>>> 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:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6392 to 127.0.0.1:6381
Adding replica 127.0.0.1:6390 to 127.0.0.1:6382
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: b6477a2b03d54a3e5fda45f4939c971724a80346 127.0.0.1:6380
   slots:[0-5460] (5461 slots) master
M: e355801e186e02f9a0b7cbb989914a564c104721 127.0.0.1:6381
   slots:[5461-10922] (5462 slots) master
M: 886791bf33ad1dc49463a992e5ff28305f1b02e5 127.0.0.1:6382
   slots:[10923-16383] (5461 slots) master
S: 129888f320539c541599359765536e85280b96a0 127.0.0.1:6390
   replicates 886791bf33ad1dc49463a992e5ff28305f1b02e5
S: 04b64979a1ae62144bb6f0474a181ec4832e517d 127.0.0.1:6391
   replicates b6477a2b03d54a3e5fda45f4939c971724a80346
S: 6761ca00082ebdf75cfd1101189e2cfcde064755 127.0.0.1:6392
   replicates e355801e186e02f9a0b7cbb989914a564c104721
Can I set the above configuration? (type 'yes' to accept): 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:6380)
M: b6477a2b03d54a3e5fda45f4939c971724a80346 127.0.0.1:6380
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 129888f320539c541599359765536e85280b96a0 127.0.0.1:6390
   slots: (0 slots) slave
   replicates 886791bf33ad1dc49463a992e5ff28305f1b02e5
M: e355801e186e02f9a0b7cbb989914a564c104721 127.0.0.1:6381
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 04b64979a1ae62144bb6f0474a181ec4832e517d 127.0.0.1:6391
   slots: (0 slots) slave
   replicates b6477a2b03d54a3e5fda45f4939c971724a80346
M: 886791bf33ad1dc49463a992e5ff28305f1b02e5 127.0.0.1:6382
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 6761ca00082ebdf75cfd1101189e2cfcde064755 127.0.0.1:6392
   slots: (0 slots) slave
   replicates e355801e186e02f9a0b7cbb989914a564c104721
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

??顯然,我們要求的唯一設(shè)置是創(chuàng)建一個(gè)包含3個(gè)主服務(wù)器和3個(gè)從服務(wù)器的集群。
??當(dāng)你輸入完命令后,Redis會(huì)給你一份配置清單(將決定哪個(gè)服務(wù)器是主服務(wù)器,哪個(gè)服務(wù)器是從服務(wù)器),之后會(huì)提示你是否希望這樣配置,輸入yes接受建議的配置,執(zhí)行配置將給定所有節(jié)點(diǎn)加入集群,這意味著節(jié)點(diǎn)將被引導(dǎo)為彼此通信。最后,如果一切順利,你會(huì)看到這樣的消息:

[OK] All 16384 slots covered

??這意味著至少有一個(gè)主實(shí)例為16384個(gè)可用插槽提供服務(wù)。

??現(xiàn)在我們來(lái)看一下集群的信息:

$ redis-cli -p 6380
127.0.0.1:6380> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1826
cluster_stats_messages_pong_sent:1872
cluster_stats_messages_sent:3698
cluster_stats_messages_ping_received:1867
cluster_stats_messages_pong_received:1826
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:3698

參考資料

《redis設(shè)計(jì)與實(shí)現(xiàn)》(第二版)

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • redis集群分為服務(wù)端集群和客戶端分片,redis3.0以上版本實(shí)現(xiàn)了集群機(jī)制,即服務(wù)端集群,3.0以下使用客戶...
    hadoop_null閱讀 1,676評(píng)論 0 6
  • 1. 集群概述 Redis集群是Redis提供的分布式數(shù)據(jù)庫(kù)方案,集群通過(guò)分片進(jìn)行數(shù)據(jù)共享,提供復(fù)制和故障轉(zhuǎn)移功能...
    孤塵F閱讀 4,696評(píng)論 0 0
  • 《超級(jí)個(gè)體-伽藍(lán)214》307/365,9.14打卡,明媚的光 【三件事】 1. [ ] 非公醫(yī)療項(xiàng)目開(kāi)始進(jìn)行50...
    伽藍(lán)214閱讀 249評(píng)論 0 0
  • 上次見(jiàn)你的時(shí)候 墻外的花開(kāi)得正艷 多日不見(jiàn) 現(xiàn)已凋謝 光禿禿的枝干有些丑
    夸我是狗閱讀 236評(píng)論 0 0
  • 長(zhǎng)平之戰(zhàn)后,趙都邯鄲被秦所圍。平原君出使六國(guó)尋求救援。毛遂自薦“臣乃今日請(qǐng)?zhí)幠抑卸∈顾煸榈锰幠抑?,乃穎脫而出,非...
    南鄰先生閱讀 402評(píng)論 4 4

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