Redis集群增加節(jié)點(diǎn)與刪除節(jié)點(diǎn)的方法詳解
前言
本文主要是承接上一篇文章Redis集群的離線安裝成功以后,我們?nèi)绾芜M(jìn)行給集群增加新的主從節(jié)點(diǎn)(集群擴(kuò)容)以及如何從集群中刪除節(jié)點(diǎn)(集群縮容),也就是集群的伸縮,集群伸縮的原理是控制虛擬槽和數(shù)據(jù)在節(jié)點(diǎn)之間進(jìn)行移動(dòng),通過(guò)實(shí)際操作來(lái)整理一下集群的伸縮。
上篇文章中搭建好的集群為三主三從,端口號(hào)為7000、7001、7002、7003、7004、7005。
查看集群?jiǎn)?dòng)情況:ps -ef | grep redis

查看集群的slots分配情況以及節(jié)點(diǎn)之間的主從關(guān)系:
首先登陸節(jié)點(diǎn)7000:redis-cli -p 7000 -h 192.168.182.132 -c //注意不要丟了-c
cluster nodes 查看集群節(jié)點(diǎn)信息

在本例中我們先增加兩個(gè)節(jié)點(diǎn):主節(jié)點(diǎn)7006和從節(jié)點(diǎn)7007,并給7006分配4096個(gè)slots,設(shè)置7007為7006的從節(jié)點(diǎn),然后再將這兩個(gè)節(jié)點(diǎn)從集群中刪除,一定要先刪除主節(jié)點(diǎn),再刪除從節(jié)點(diǎn),要不然故障轉(zhuǎn)移會(huì)生效。
一、集群的擴(kuò)容
1.準(zhǔn)備新的節(jié)點(diǎn)
在集群目錄redis_cluster目錄下增加redis7006和redis7007目錄
mkdir redis7006
mkdir redis7007
增加完成后的目錄

復(fù)制端口7000的redis.conf配置文件到redis7006和redis7007目錄下,并修改配置文件中的端口為對(duì)應(yīng)目錄的端口號(hào)。
例如redis7006下的redis.conf文件的內(nèi)容為:
port 7006 bind 192.168.182.132 //本機(jī)IP daemonize yes //設(shè)置為后臺(tái)運(yùn)行 pidfile /var/run/redis-7006.pid cluster-enabled yes //開(kāi)啟集群 cluster-config-file node-7006.conf cluster-node-timeout 15000 appendonly yes
準(zhǔn)備完成后,啟動(dòng)兩個(gè)新的redis節(jié)點(diǎn):
redis-server redis7006/redis.conf redis-server redis7007/redis.conf ps -ef | grep redis //查看新的redis節(jié)點(diǎn)是否啟動(dòng)成功

啟動(dòng)以后登錄7006查看節(jié)點(diǎn)情況:
redis-cli -p 7006 -h 192.168.182.132 -c cluster nodes

2.添加主節(jié)點(diǎn)
?。?)向集群中添加節(jié)點(diǎn)7006,注意一定要保證節(jié)點(diǎn)里面沒(méi)有添加過(guò)任何數(shù)據(jù),不然添加會(huì)報(bào)錯(cuò)。
cd /usr/local/redis/redis/src ./redis-trib.rb add-node 192.168.182.132:7006 192.168.182.132:7000 //第一次節(jié)點(diǎn)為新增的節(jié)點(diǎn) 第二個(gè)節(jié)點(diǎn)為集群中的節(jié)點(diǎn)
添加成功:

可以看到使用addnode命令來(lái)添加節(jié)點(diǎn),第一個(gè)參數(shù)是新節(jié)點(diǎn)的地址,第二個(gè)參數(shù)是任意一個(gè)已經(jīng)存在的節(jié)點(diǎn)的IP和端口. 我們可以看到新的節(jié)點(diǎn)已經(jīng)添加到集群中:

新節(jié)點(diǎn)7006現(xiàn)在已經(jīng)連接上了集群, 成為集群的一份子, 并且可以對(duì)客戶端的命令請(qǐng)求進(jìn)行轉(zhuǎn)向了, 但是和其他主節(jié)點(diǎn)相比, 新節(jié)點(diǎn)還有兩點(diǎn)區(qū)別:
新節(jié)點(diǎn)沒(méi)有包含任何數(shù)據(jù), 因?yàn)樗鼪](méi)有包含任何哈希槽.盡管新節(jié)點(diǎn)沒(méi)有包含任何哈希槽, 但它仍然是一個(gè)主節(jié)點(diǎn), 所以在集群需要將某個(gè)從節(jié)點(diǎn)升級(jí)為新的主節(jié)點(diǎn)時(shí), 這個(gè)新節(jié)點(diǎn)不會(huì)被選中。
接下來(lái), 只要使用 redis-trib 程序, 將集群中的某些哈希桶移動(dòng)到新節(jié)點(diǎn)里面, 新節(jié)點(diǎn)就會(huì)成為真正的主節(jié)點(diǎn)了。
(2)為主節(jié)點(diǎn)7006分配虛擬槽
cd /usr/local/redis/redis/src ./redis-trib.rb reshard 192.168.182.132:7001 //可以為任意的節(jié)點(diǎn) 在此登錄的7001只是作為客戶端去訪問(wèn)的

執(zhí)行后:
因?yàn)槲覀冊(cè)黾?006為主節(jié)點(diǎn)后,一共存在四個(gè)主節(jié)點(diǎn),為了平均分配我們需要給7006分配16384除以4等于4096個(gè)節(jié)點(diǎn),所以我們輸入4096,按enter繼續(xù):

輸入7006的節(jié)點(diǎn)ID,按enter繼續(xù):

從哪些主節(jié)點(diǎn)抽取槽到新節(jié)點(diǎn)中:all為所有主節(jié)點(diǎn),done:指定節(jié)點(diǎn),在這里我們輸入all,按enter繼續(xù):

輸入yes后按enter開(kāi)始給7006分配虛擬槽,分配完成后:

登錄集群查看一下集群的狀態(tài):
redis-cli -p 7000 -h 192.168.182.132 -c cluster nodes

至此主節(jié)點(diǎn)已經(jīng)添加完畢了,我們的集群由三主三從變成了四主三從。
3.添加從節(jié)點(diǎn)7007
(1)使用add-node添加新節(jié)點(diǎn)
cd /usr/local/redis/redis/src ./redis-trib.rb add-node 192.168.182.132:7007 192.168.182.132:7000 //第一次節(jié)點(diǎn)為新增的節(jié)點(diǎn) 第二個(gè)節(jié)點(diǎn)為集群中的節(jié)點(diǎn)
加入集群成功,登錄到集群中查看一下集群狀態(tài):

7007還是一個(gè)Master節(jié)點(diǎn),而且沒(méi)有擁有自己的slot槽。那么我們接下來(lái)要讓它變成從節(jié)點(diǎn)。
(2)將7007變?yōu)?006的 從節(jié)點(diǎn)
使用CLUSTER REPLICATE 命令改變一個(gè)從節(jié)點(diǎn)的主節(jié)點(diǎn)。
redis-cli -p 7007 -h 192.168.182.132 cluster replicate 52d169e7011ccdf10f99c1d83f92409dcc37ab55 //后面的字符串為節(jié)點(diǎn)7006的節(jié)點(diǎn)ID
設(shè)置成功后查看一下:

集群的從節(jié)點(diǎn)7007添加成功。
二、集群的縮容
只要使用del-node命令即可:
./redis-trib del-node 127.0.0.1:7000 <node-id> 第一個(gè)參數(shù)是任意一個(gè)節(jié)點(diǎn)的地址,第二個(gè)節(jié)點(diǎn)是你想要移除的節(jié)點(diǎn)地址。
使用同樣的方法移除主節(jié)點(diǎn),不過(guò)在移除主節(jié)點(diǎn)前,需要確保這個(gè)主節(jié)點(diǎn)是空的. 如果不是空的,需要將這個(gè)節(jié)點(diǎn)的數(shù)據(jù)重新分片到其他主節(jié)點(diǎn)上.
替代移除主節(jié)點(diǎn)的方法是手動(dòng)執(zhí)行故障恢復(fù),被移除的主節(jié)點(diǎn)會(huì)作為一個(gè)從節(jié)點(diǎn)存在,不過(guò)這種情況下不會(huì)減少集群節(jié)點(diǎn)的數(shù)量,也需要重新分片數(shù)據(jù).[/code]
1.刪除從節(jié)點(diǎn)
刪除節(jié)點(diǎn)用del-node命令。此命令需要制定刪除節(jié)點(diǎn)的ip和端口,以及節(jié)點(diǎn)的id。
cd /usr/local/redis/redis/src ./redis-trib.rb del-node 192.168.182.132:7007 7007節(jié)點(diǎn)ID
刪除成功后:

刪除后我們?cè)俅尾榭醇旱墓?jié)點(diǎn)信息,如下所示,7007從節(jié)點(diǎn)已經(jīng)被移除掉。

2.刪除主節(jié)點(diǎn)
(1)將主節(jié)點(diǎn)7006的slots分配到其他主節(jié)點(diǎn)上
cd /usr/local/redis/redis/src ./redis-trib.rb reshard 192.168.182.132:7006

選擇完這幾項(xiàng)以后,回車(chē)?yán)^續(xù):

輸入yes,表示接受這個(gè)計(jì)劃,然后回車(chē),完成7006節(jié)點(diǎn)的槽的移除。
登錄集群查看當(dāng)前集群情況:

節(jié)點(diǎn)7006上沒(méi)有任何槽。
(2)使用del-node命令來(lái)刪除7006主節(jié)點(diǎn)。
cd /usr/local/redis/redis/src ./redis-trib.rb del-node 192.168.182.132:7006 52d169e7011ccdf10f99c1d83f92409dcc37ab55
刪除成功:

最后登錄查看集群又恢復(fù)到了三主三從的結(jié)構(gòu)了,只是從剛開(kāi)始的均勻分配變成了7000端口的主節(jié)點(diǎn)多了4096個(gè)slots。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Redis的11種Web應(yīng)用場(chǎng)景簡(jiǎn)介
一些Redis原語(yǔ)命令比如LPUSH、LTRIM和 LREM等等能夠用來(lái)幫助開(kāi)發(fā)者完成需要的任務(wù)——這些任務(wù)在傳統(tǒng)的數(shù)據(jù)庫(kù)存儲(chǔ)中非常困難或緩慢。這是一篇非常有用并且實(shí)際的文章。那么要如何在你的框架中完成這些任務(wù)呢?2015-09-09
Redis報(bào)錯(cuò):Could not create server TCP 
這篇文章主要介紹了Redis報(bào)錯(cuò):Could not create server TCP listening socket 127.0.0.1:6379: bind:解決方法,是安裝與啟動(dòng)Redis過(guò)程中比較常見(jiàn)的問(wèn)題,需要的朋友可以參考下2023-06-06
Redis事務(wù)涉及的watch、multi等命令詳解
這篇文章主要介紹了Redis事務(wù)涉及的watch、multi等命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-10-10
利用redisson快速實(shí)現(xiàn)自定義限流注解(接口防刷)
利用redis的有序集合即Sorted?Set數(shù)據(jù)結(jié)構(gòu),構(gòu)造一個(gè)令牌桶來(lái)實(shí)施限流,而redisson已經(jīng)幫我們封裝成了RRateLimiter,通過(guò)redisson,即可快速實(shí)現(xiàn)我們的目標(biāo),這篇文章主要介紹了利用redisson快速實(shí)現(xiàn)自定義限流注解,需要的朋友可以參考下2024-07-07
Redis和Lua使用過(guò)程中遇到的小問(wèn)題
這篇文章主要給大家介紹了關(guān)于Redis和Lua使用過(guò)程中遇到的小問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
在Redis數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分布式速率限制的方法
這篇文章主要介紹了在Redis數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分布式速率限制的方法,文中展示了一個(gè)用Python編寫(xiě)的應(yīng)用示例,需要的朋友可以參考下2015-06-06

