Redis集群

一蜜唾、摘要

看完本文你將掌握如下知識點:

  • redis集群的構(gòu)建方法【redis-5.0.2】
  • redis早期的版本中使用基于ruby的redis-trib.rb命令進(jìn)行集群創(chuàng)建端盆,新版本推薦使用 redis-cli --cluster结榄,本文就是通過redis-cli --cluster命令實現(xiàn)集群構(gòu)建。

二悟衩、快速創(chuàng)建集群

redis為我們提供了快速創(chuàng)建集群的工具惨篱,安裝好redis后筒饰,在其/redis-5.0.2/utils/create-cluster/目錄下存在一個create-cluster命令狼纬,通過該命令可以快速創(chuàng)建一個基于本機(jī)端口30001~30006的三主三從的redis集群,可以通過修改端口號及服務(wù)數(shù)量來改變集群的配置骂际。
1.啟動6個redis服務(wù)疗琉,./create-cluster start
2.創(chuàng)建集群,./create-cluster create
3.關(guān)閉集群服務(wù)歉铝,./create-cluster stop
4.清除數(shù)據(jù)及日志文件盈简,./create-cluster clean

三、源碼分析

通過看源碼可以很清楚其創(chuàng)建過程
1.啟動6個reids服務(wù)太示,通過參數(shù)的方式進(jìn)行啟動柠贤,在生產(chǎn)環(huán)境中建議通過配置文件啟動

if [ "$1" == "start" ]
then
    while [ $((PORT < ENDPORT)) != "0" ]; do
        PORT=$((PORT+1))
        echo "Starting $PORT"
        ../../src/redis-server --port $PORT --cluster-enabled yes --cluster-config-file nodes-${PORT}.conf --cluster-node-timeout $TIMEOUT --appendonly yes --appendfilename appendonly-${PORT}.aof --dbfilename dump
-${PORT}.rdb --logfile ${PORT}.log --daemonize yes
    done
    exit 0
fi

參數(shù)說明:

#端口:
port $PORT
#是否啟用集群:
cluster-enabled yes
#集群關(guān)聯(lián)文件路徑,創(chuàng)建redis集群時自動創(chuàng)建
cluster-config-file nodes-${PORT}.conf
#集群節(jié)點間通信的超時時間类缤,毫秒臼勉,建議2000,默認(rèn)15000
cluster-node-timeout $TIMEOUT
#開啟aof
appendonly yes
#aof文件名稱餐弱,注意這里只能是文件名稱宴霸,若要修改路徑需要設(shè)置dir屬性 ,如dir /home/hanqf/redis-dir/redis-5.0.2/cluster-conf/files/
appendfilename appendonly-${PORT}.aof
#rdb文件名稱膏蚓,同樣只能是文件名稱瓢谢,同上路徑共用dir屬性
dbfilename dump-${PORT}.rdb
#日志文件路徑
logfile ${PORT}.log
#后臺運(yùn)行模式啟動
daemonize yes

2.構(gòu)建集群,這里使用的就是redis-cli --cluster命令驮瞧,可以看出與redis-trib.rb命令類似

if [ "$1" == "create" ]
then
    HOSTS=""
    while [ $((PORT < ENDPORT)) != "0" ]; do
        PORT=$((PORT+1))
        HOSTS="$HOSTS 127.0.0.1:$PORT"
    done
    ../../src/redis-cli --cluster create $HOSTS --cluster-replicas $REPLICAS
    exit 0
fi

create后根的$HOSTS就是redis服務(wù)列表

127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

--cluster-replicas $REPLICAS氓扛,這里$REPLICAS值為1,表示為每一個master節(jié)點分配一個slave節(jié)點

四论笔、實際應(yīng)用

這里我們使用2臺服務(wù)器采郎,分別啟動3個redis服務(wù),來構(gòu)建一個三主三從的redis集群翅楼。

1.服務(wù)器IP

  • 10.211.55.15
  • 10.211.55.16

2.端口設(shè)置

分別開啟倆臺服務(wù)器的如下端口尉剩,前面是redis服務(wù)端口真慢,后面是集群通信端口(默認(rèn)服務(wù)端口+10000)

6379毅臊,16379
6380,16380
6381黑界,16381

3.redis-{port}.conf

這里需要按照上面的參數(shù)說明進(jìn)行配置管嬉,如我們配置號redis-6379.conf后,可以通過如下命令進(jìn)行復(fù)制

more redis-6379.conf | sed 's/6379/6380/g' > redis-6380.conf
more redis-6379.conf | sed 's/6379/6381/g' > redis-6381.conf

4.啟動服務(wù)

#10.211.55.15
./redis-server redis-6379.conf
./redis-server redis-6380.conf
./redis-server redis-6381.conf


#10.211.55.16
./redis-server redis-6379.conf
./redis-server redis-6380.conf
./redis-server redis-6381.conf

5.構(gòu)建集群

./redis-cli --cluster create 10.211.55.15:6379 10.211.55.15:6380 10.211.55.15:6381 10.211.55.16:6379 10.211.55.16:6380 10.211.55.16:6381  --cluster-replicas 1

五朗鸠、集群相關(guān)命令

1.健康檢查

# 后面可以是集群中任意節(jié)點
./redis-cli --cluster check 10.211.55.15:6380

輸出如下蚯撩,可以看到集群中的主從關(guān)系,以及每個master中含有key的數(shù)量:

10.211.55.15:6380 (c39c1e8a...) -> 2 keys | 5461 slots | 1 slaves.
10.211.55.16:6380 (3edc1dae...) -> 5 keys | 5461 slots | 1 slaves.
10.211.55.16:6379 (4dd31f17...) -> 2 keys | 5462 slots | 1 slaves.
[OK] 9 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.211.55.15:6380)
M: c39c1e8aa6e07e337aaab03eab3727f739201cd2 10.211.55.15:6380
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: a83903f50621d7627f3ce59f1210af4938b8acc4 10.211.55.15:6381
   slots: (0 slots) slave
   replicates 4dd31f17e83ef7aa6c7a36474f7f54d842e0ed64
M: 3edc1daeaf3a848156ad8cc601b1374dd0459d9c 10.211.55.16:6380
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 4dd31f17e83ef7aa6c7a36474f7f54d842e0ed64 10.211.55.16:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: cb6a94201d6f5a4e016b1549afc8c976a1a3dda4 10.211.55.15:6379
   slots: (0 slots) slave
   replicates 3edc1daeaf3a848156ad8cc601b1374dd0459d9c
S: 3f41a95296cb2681ea599f47aaff9c662b3338ad 10.211.55.16:6381
   slots: (0 slots) slave
   replicates c39c1e8aa6e07e337aaab03eab3727f739201cd2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

說明:此時如果關(guān)閉其中一個master節(jié)點烛占,那么其對應(yīng)的從節(jié)點就會升級為主節(jié)點胎挎,當(dāng)重新啟動原master節(jié)點后沟启,則該節(jié)點會自動加入集群,并作為從節(jié)點犹菇。

2.集群擴(kuò)容德迹,即為集群添加新的主機(jī)和從機(jī)

2.1通過如下命令添加新的node

說明:10.211.55.15:6382 是新的服務(wù)地址,10.211.55.16:6380 是集群中任意一個的服務(wù)地址,添加后的服務(wù)類型為master揭芍。

此時我們通過健康檢查可以看到新加入的服務(wù)沒有分配槽點:

./redis-cli --cluster check 10.211.55.15:6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 10.211.55.15:6379: Connection refused
10.211.55.15:6380 (a5f63b8e...) -> 2 keys | 5461 slots | 1 slaves.
10.211.55.16:6379 (15506850...) -> 2 keys | 5462 slots | 1 slaves.
10.211.55.15:6382 (316e068f...) -> 0 keys | 0 slots | 0 slaves.   #注意胳搞,這里新添加的主機(jī)沒有分配槽(slot),需要先進(jìn)行分配才能使用
10.211.55.16:6380 (d944c0b1...) -> 5 keys | 5461 slots | 0 slaves.
[OK] 9 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.211.55.15:6380)
M: a5f63b8e4f24a73d36da9e0bbf84988d7c5558d3 10.211.55.15:6380
  slots:[10923-16383] (5461 slots) master
  1 additional replica(s)
M: 15506850b235f4277306368533cacf4a5ec1bbd1 10.211.55.16:6379
  slots:[5461-10922] (5462 slots) master
  1 additional replica(s)
M: 316e068fd71ee228299198a271efd839d3493835 10.211.55.15:6382
  slots: (0 slots) master
S: b3c0e06da5b5d694c3a68408fb4c8f7607d7e9e0 10.211.55.16:6381
  slots: (0 slots) slave
  replicates a5f63b8e4f24a73d36da9e0bbf84988d7c5558d3
M: d944c0b19e92af325b882e3a86ff09c2b6b53f47 10.211.55.16:6380
  slots:[0-5460] (5461 slots) master
S: 4bce4c24959bda55d087296e86f58ec03186d3ae 10.211.55.15:6381
  slots: (0 slots) slave
  replicates 15506850b235f4277306368533cacf4a5ec1bbd1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.2分配槽

./redis-cli --cluster reshard 10.211.55.15:6382

執(zhí)行命令后會有如下設(shè)置:
1.問你是否從原有的1-16384個槽中分配多少到新的主節(jié)點称杨,我們這里分配4000為例肌毅,回車
2:然后緊接著會詢問你給id為誰的主節(jié)點分配,這里就是新加的節(jié)點10.211.55.15:6382姑原,其對應(yīng)的Id為:316e068fd71ee228299198a271efd839d3493835
3:詢問你是從所有的空間去給這個節(jié)點分配空間還是從某一個節(jié)點分配悬而,我這里輸入all 回車?yán)^續(xù)
4:然后會給你分配出一個分配計劃,輸入yes開始分配锭汛。完成ok

此時再次運(yùn)行健康檢查可以看到槽點已經(jīng)分配成功

./redis-cli --cluster check localhost:6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
localhost:6380 (a5f63b8e...) -> 1 keys | 4128 slots | 1 slaves.
10.211.55.16:6379 (15506850...) -> 2 keys | 4128 slots | 1 slaves.
10.211.55.15:6382 (316e068f...) -> 2 keys | 4000 slots | 0 slaves.
10.211.55.16:6380 (d944c0b1...) -> 4 keys | 4128 slots | 1 slaves.
[OK] 9 keys in 4 masters.
0.00 keys per slot on average.
………………………………

2.3平衡槽摊滔,就是均勻分配集群中的所有槽到所有的節(jié)點,該步非必須店乐,只是看著好看點

./redis-cli --cluster rebalance --cluster-threshold 1 10.211.55.15:6382
./redis-cli --cluster info localhost:6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
localhost:6380 (a5f63b8e...) -> 1 keys | 4096 slots | 1 slaves.
10.211.55.16:6379 (15506850...) -> 2 keys | 4096 slots | 1 slaves.
10.211.55.15:6382 (316e068f...) -> 2 keys | 4096 slots | 0 slaves.
10.211.55.16:6380 (d944c0b1...) -> 4 keys | 4096 slots | 1 slaves.
[OK] 9 keys in 4 masters.
0.00 keys per slot on average.

2.4為新加入的master添加slave

同樣需要先加入集群

 ./redis-cli --cluster add-node 10.211.55.16:6382 10.211.55.16:6380

之后不需要做分配和平衡槽的操作
登錄這個redis艰躺, ./redis-cli -h 10.211.55.16 -p 6382

127.0.0.1:6382> cluster replicate 316e068fd71ee228299198a271efd839d3493835 #主節(jié)點的id
OK

3.刪除節(jié)點

3.1刪除主節(jié)點

刪除節(jié)點前,節(jié)點上的槽要被清空

./redis-cli --cluster reshard 10.211.55.15:6382 #集群中任意ip即可

1.問你是否從原有的1-16384個槽中分配多少到新的主節(jié)點我們這里分配4096眨八,即該節(jié)點上的槽數(shù)
2:然后緊接著會詢問你給id為誰的主節(jié)點分配腺兴,這里我們分配給10.211.55.16:6379,即15506850b235f4277306368533cacf4a5ec1bbd1
3:詢問你是從所有的空間去給這個節(jié)點分配空間還是從某一個節(jié)點分配
我這里輸入要移出的節(jié)點ID ,即316e068fd71ee228299198a271efd839d3493835 回車?yán)^續(xù) 輸入 done
4:然后會給你分配出一個分配計劃廉侧,輸入yes開始分配页响。完成ok

執(zhí)行刪除節(jié)點命令

./redis-cli --cluster del-node 10.211.55.16:6379 316e068fd71ee228299198a271efd839d3493835
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 316e068fd71ee228299198a271efd839d3493835 from cluster 10.211.55.16:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

說明:
刪除節(jié)點會自動關(guān)閉被移出的redis服務(wù),此時段誊,該主節(jié)點的從節(jié)點會自動轉(zhuǎn)為其它主節(jié)點的從節(jié)點闰蚕,而不會升級為主節(jié)點

3.2刪除從節(jié)點

直接執(zhí)行節(jié)點刪除命令

./redis-cli --cluster del-node 10.211.55.16:6379 從節(jié)點ID
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市连舍,隨后出現(xiàn)的幾起案子没陡,更是在濱河造成了極大的恐慌,老刑警劉巖索赏,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盼玄,死亡現(xiàn)場離奇詭異,居然都是意外死亡潜腻,警方通過查閱死者的電腦和手機(jī)埃儿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來融涣,“玉大人童番,你說我怎么就攤上這事精钮。” “怎么了剃斧?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵杂拨,是天一觀的道長。 經(jīng)常有香客問我悯衬,道長弹沽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任筋粗,我火速辦了婚禮策橘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娜亿。我一直安慰自己丽已,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布买决。 她就那樣靜靜地躺著沛婴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪督赤。 梳的紋絲不亂的頭發(fā)上嘁灯,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音躲舌,去河邊找鬼丑婿。 笑死,一個胖子當(dāng)著我的面吹牛没卸,可吹牛的內(nèi)容都是我干的羹奉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼约计,長吁一口氣:“原來是場噩夢啊……” “哼诀拭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煤蚌,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤耕挨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铺然,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俗孝,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年魄健,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片插勤。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡沽瘦,死狀恐怖革骨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情析恋,我是刑警寧澤良哲,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站助隧,受9級特大地震影響筑凫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜并村,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一巍实、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哩牍,春花似錦棚潦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荚孵,卻和暖如春妹窖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背收叶。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工嘱吗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滔驾。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓谒麦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哆致。 傳聞我的和親對象是個殘疾皇子绕德,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容