一蜜唾、摘要
看完本文你將掌握如下知識點:
- 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