Redis Cluster集群安裝配置詳解+集群擴(kuò)容與縮容操作

簡(jiǎn)介

Redis Cluster是一個(gè)高性能高可用的分布式系統(tǒng)褒翰。由多個(gè)Redis實(shí)例組成的整體。
Redis Cluster集群功能在3.0版本后推出号显,Redis具有了真正的分布式能力悼泌,某個(gè)結(jié)點(diǎn)掛了的話(huà)瓶珊,因?yàn)閿?shù)據(jù)在其他結(jié)點(diǎn)上有備份,所以其他結(jié)點(diǎn)頂上來(lái)就可以繼續(xù)提供服務(wù)飘千,保證了Availability堂鲜。集群中nodes負(fù)責(zé)存儲(chǔ)數(shù)據(jù),保持集群的狀態(tài)护奈,包括keys與nodes的對(duì)應(yīng)關(guān)系(內(nèi)部其實(shí)為slots與nodes對(duì)應(yīng)關(guān)系)缔莲。nodes也能夠自動(dòng)發(fā)現(xiàn)其他的nodes,檢測(cè)失效的節(jié)點(diǎn)霉旗,當(dāng)某個(gè)master失效時(shí)還應(yīng)該能將合適的slave提升為master痴奏。

Redis Cluster的安裝

1)環(huán)境準(zhǔn)備

機(jī)器1     centos7                 192.168.0.217
機(jī)器2     centos7                 192.168.0.111
機(jī)器3    centos7                  192.168.0.112
這里采用三臺(tái)機(jī)器,一臺(tái)機(jī)器兩個(gè)節(jié)點(diǎn)一主一從厌秒,通過(guò)6個(gè)不同的端口啟動(dòng)六個(gè)redis读拆,3主3從的模式
也可使用兩臺(tái)機(jī)器,一臺(tái)機(jī)器3個(gè)節(jié)點(diǎn)鸵闪,創(chuàng)建出3 master檐晕、3 salve 環(huán)境

2)下載 Redis 并編譯安裝源碼包

首先在機(jī)器1上部署兩個(gè)不同端口的 Redis:192.168.0.217
步驟:下載-->解壓-->進(jìn)入目錄-->編譯

#  wget http://download.redis.io/releases/redis-4.0.10.tar.gz    
#  tar -xzvf redis-4.0.10.tar.gz -C /usr/local/                              
#  cd /usr/local/redis-4.0.10/                                                     
#  make &&make install                                         

報(bào)錯(cuò)問(wèn)題解決:

問(wèn)題一:
make[3]: gcc: Command not found
make[3]: *** [net.o] Error 127
make[3]: Leaving directory `/usr/local/tmp/redis-4.0.10/deps/hiredis'
make[2]: *** [hiredis] Error 2
make[2]: Leaving directory `/usr/local/tmp/redis-4.0.10/deps'
make[1]: [persist-settings] Error 2 (ignored)
    CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/usr/local/tmp/redis-4.0.10/src'
make: *** [install] Error 2
———————————————
解決:make 編譯 Redis 源碼包時(shí),需要用到 gcc 插件蚌讼,我們安裝上 gcc 插件即可
#yum -y install gcc gcc-c++
問(wèn)題二:
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
                               ^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/tmp/redis-4.0.10/src'
make: *** [install] Error 2
————————————————
解決:原因是 jemalloc 重載了Linux下的 ANSIC 的 malloc 和 free 函數(shù)辟灰。解決辦法:make 時(shí)添加參數(shù)屠列。
#make MALLOC=libc  install

3)創(chuàng)建 Redis 節(jié)點(diǎn)

mkdir  /usr/local/redis-4.0.10/redis_cluster    #創(chuàng)建集群目錄 
cd /usr/local/redis-4.0.10/redis_cluster        #進(jìn)入目錄       
cp ../redis.conf redis-7000.conf                #復(fù)制配置文件  
cp ../redis.conf redis-7000.conf                #復(fù)制配置文件  

4)分別修改配置文件,修改如下內(nèi)容

port  7000                                        //端口7000,7001    
bind 本機(jī)ip                                       //默認(rèn)ip為127.0.0.1 需要改為其他節(jié)點(diǎn)機(jī)器可訪(fǎng)問(wèn)的ip 否則創(chuàng)建集群時(shí)無(wú)法訪(fǎng)問(wèn)對(duì)應(yīng)的端口伞矩,無(wú)法創(chuàng)建集群
daemonize    yes                               //redis后臺(tái)運(yùn)行
pidfile  /var/run/redis_7000.pid          //pidfile文件對(duì)應(yīng)7000,7001
cluster-enabled  yes                           //開(kāi)啟集群  把注釋#去掉
cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次啟動(dòng)自動(dòng)生成 7000,7001
cluster-node-timeout  15000                //請(qǐng)求超時(shí)  默認(rèn)15秒笛洛,可自行設(shè)置
appendonly  yes                           //aof日志開(kāi)啟  有需要就開(kāi)啟,它會(huì)每次寫(xiě)操作都記錄一條日志 

接著在另外兩臺(tái)機(jī)器上(192.168.0.111)(192.168.0.112)乃坤,的操作重復(fù)以上三步苛让,只是把目錄改為7002、7003湿诊、7004狱杰、7005,對(duì)應(yīng)的配置文件也按照這個(gè)規(guī)則修改即可

5)啟動(dòng)各個(gè)節(jié)點(diǎn)

第一臺(tái)機(jī)器上執(zhí)行
redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7000.conf
redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7001.conf

第二臺(tái)機(jī)器上執(zhí)行
redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7002.conf
 redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7003.conf

第三臺(tái)機(jī)器上執(zhí)行
redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7004.conf
redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7005.conf 

6)檢查 redis 啟動(dòng)情況

機(jī)器1:
[root@localhost src]# ps -ef | grep redis
root      79518      1  0 09:36 ?        00:00:00 ./redis-server 192.168.0.217:7000 [cluster]
root      79529      1  0 09:36 ?        00:00:00 ./redis-server 192.168.0.217:7001 [cluster]
root      79871   3174  0 09:42 pts/0    00:00:00 grep --color=auto redis
機(jī)器2:
[root@dev01 src]# ps -ef | grep redis
root       3499      1  0 09:41 ?        00:00:00 ./redis-server 192.168.0.111:7002 [cluster]
root       3504      1  0 09:41 ?        00:00:00 ./redis-server 192.168.0.111:7003 [cluster]
root       3509   1330  0 09:42 pts/1    00:00:00 grep --color=auto redis
機(jī)器3:
[root@dev02 src]# ps -ef | grep redis
root       8426      1  0 09:41 ?        00:00:00 ./redis-server 192.168.0.112:7004 [cluster]
root       8431      1  0 09:41 ?        00:00:00 ./redis-server 192.168.0.112:7005 [cluster]
root       8436   7790  0 09:42 pts/4    00:00:00 grep --color=auto redis

創(chuàng)建集群

Redis 官方提供了 redis-trib.rb 這個(gè)工具厅须,使用下面這個(gè)命令即可完成安裝仿畸。

redis-trib.rb  create  --replicas  1  192.168.0.217:7000 192.168.0.217:7001  192.168.0.111:7002 192.168.0.111:7003  192.168.0.112:7004  192.168.0.112:7005

--replicas參數(shù)指定集群中每個(gè)主節(jié)點(diǎn)配備幾個(gè)從節(jié)點(diǎn),這里設(shè)置為1朗和。
其中错沽,前兩個(gè) ip:port 為第一臺(tái)機(jī)器的節(jié)點(diǎn),中間為第二臺(tái)機(jī)器的ip:port眶拉,最后為第三臺(tái)機(jī)器的ip:port千埃。
這個(gè)工具是用 ruby 實(shí)現(xiàn)的,所以需要安裝 ruby忆植。安裝命令如下:

方法一: yum安裝

yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
發(fā)現(xiàn)報(bào)錯(cuò):
[root@dev01 profile.d]# gem install redis
Fetching: redis-4.1.3.gem (100%)
ERROR:  Error installing redis:
        redis requires Ruby version >= 2.3.0.
因?yàn)镃entOS7 yum庫(kù)中ruby的版本支持到 2.0.0放可,但是gem安裝redis需要最低是2.3.0,采用rvm來(lái)更新ruby (建議采用方法二)
解決方法:
1.安裝curl
yum -y install curl
2.安裝rvm(注意朝刊,過(guò)程可能有點(diǎn)久)
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3  
curl -L get.rvm.io | bash -s stable   
如果遇到以下報(bào)錯(cuò):
gpg: 無(wú)法檢查簽名:沒(méi)有公鑰
執(zhí)行:
gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
然后進(jìn)行第二步安裝rvm
3.修改 rvm下載 ruby的源耀里,到 Ruby China 的鏡像
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
4.查看rvm庫(kù)中已知的ruby版本
rvm list known
5.安裝一個(gè)ruby版本
rvm install 2.3.3
6. 使用一個(gè)ruby版本
rvm use 2.3.3
7.設(shè)置默認(rèn)版本
rvm use 2.3.3 --default
8.卸載一個(gè)已知版本
rvm remove 2.0.0
9.查看ruby版本
ruby --version
10.繼續(xù)安裝Redis的
gem install redis

之后再運(yùn)行 redis-trib.rb 命令,啟動(dòng)集群:
[root@dev01 profile.d]# cd /usr/local/redis-4.0.10/src/
[root@dev01 src]# ./redis-trib.rb  create  --replicas  1  192.168.0.217:7000 192.168.0.217:7001  192.168.0.111:7002 192.168.0.111:7003  192.168.0.112:7004  192.168.0.112:7005                    

如圖所示,這樣就代表集群創(chuàng)建成功:


image.png

方法二: 編譯安裝

1)安裝ruby前置庫(kù)拾氓,安裝依賴(lài)
yum install zlib-devel -y
yum install  openssl-devel  zlib-devel  -y
2)安裝ruby
下載:wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.7.tar.gz
解壓到特定目錄:tar -zxvf ruby-2.3.7.tar.gz -C /usr/local
進(jìn)入目錄:cd /usr/local/ruby-2.3.7
創(chuàng)建目錄:mkdir /usr/local/ruby
配置:./configure --prefix=/usr/local/ruby(把解壓的源文件放在/usr/local/ruby)
編譯:make
安裝:make install
進(jìn)入目錄:cd /usr/local/ruby
把ruby冯挎、gem添加到環(huán)境變量中:
cd /etc/profile.d/
vim ruby.sh
export RUBY_HOME=/usr/local/ruby
export PATH=$RUBY_HOME/bin:$PATH
保存退出
source /etc/profile
如出現(xiàn)以下信息,說(shuō)明安裝成功:
[root@dev02 profile.d]# ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]
[root@dev02 profile.d]# gem -v
2.5.2.3
3)安裝ruby的redis的客戶(hù)端
下載:wget https://rubygems.org/downloads/redis-4.0.1.gem
安裝:gem install -l redis-4.0.1.gem痪枫,看到如下织堂,成功

[root@dev02 soft]# gem install -l redis-4.0.1.gem
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
4)校驗(yàn)安裝

gem list -- check redis gem


image.png

之后再運(yùn)行 redis-trib.rb 命令,啟動(dòng)集群:

[root@dev01 profile.d]# cd /usr/local/redis-4.0.10/src/
[root@dev01 src]# ./redis-trib.rb  create  --replicas  1  192.168.0.217:7000 192.168.0.217:7001  192.168.0.111:7002 192.168.0.111:7003  192.168.0.112:7004  192.168.0.112:7005   

查看集群狀態(tài):

[root@dev02 src]# ./redis-cli -p 7000 -h 192.168.0.217 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:7
cluster_my_epoch:1
cluster_stats_messages_ping_sent:13772
cluster_stats_messages_pong_sent:12088
cluster_stats_messages_fail_sent:20
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_sent:25881
cluster_stats_messages_ping_received:12083
cluster_stats_messages_pong_received:13314
cluster_stats_messages_meet_received:5
cluster_stats_messages_fail_received:4
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:25407

集群驗(yàn)證

在第一臺(tái)機(jī)器上連接集群的7000端口的節(jié)點(diǎn),在另外一臺(tái)連接7005節(jié)點(diǎn)奶陈,
連接方式為 redis-cli -h 192.168.0.217 -c -p 7000 ,加參數(shù) -C 可連接到集群易阳,因?yàn)樯厦?redis.conf 將 bind 改為了ip地址,所以 -h 參數(shù)不可以省略吃粒。

在7005節(jié)點(diǎn)執(zhí)行命令  set hello world 潦俺,執(zhí)行結(jié)果如下:
[root@dev02 src]#  ./redis-cli  -h 192.168.0.112 -c -p 7005
192.168.0.112:7005> set hello world
-> Redirected to slot [866] located at 192.168.0.217:7000
OK
192.168.0.217:7000> get hello
"world"
192.168.0.217:7000> 

然后在另外一臺(tái)7001端口,查看 key 為 hello 的內(nèi)容, get hello  事示,執(zhí)行結(jié)果如下:
[root@localhost src]# ./redis-cli  -h 192.168.0.217 -c -p 7001
192.168.0.217:7001> get hello
-> Redirected to slot [866] located at 192.168.0.217:7000
"world"
192.168.0.217:7000> 

說(shuō)明集群運(yùn)作正常早像。

簡(jiǎn)單說(shuō)一下原理

redis cluster在設(shè)計(jì)的時(shí)候,就考慮到了去中心化肖爵,去中間件卢鹦,也就是說(shuō),集群中的每個(gè)節(jié)點(diǎn)都是平等的關(guān)系劝堪,都是對(duì)等的冀自,每個(gè)節(jié)點(diǎn)都保存各自的數(shù)據(jù)和整個(gè)集群的狀態(tài)。每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接秒啦,而且這些連接保持活躍熬粗,這樣就保證了我們只需要連接集群中的任意一個(gè)節(jié)點(diǎn),就可以獲取到其他節(jié)點(diǎn)的數(shù)據(jù)余境。

Redis 集群沒(méi)有并使用傳統(tǒng)的一致性哈希來(lái)分配數(shù)據(jù)驻呐,而是采用另外一種叫做哈希槽 (hash slot)的方式來(lái)分配的。redis cluster 默認(rèn)分配了 16384 個(gè)slot芳来,當(dāng)我們set一個(gè)key 時(shí)含末,會(huì)用CRC16算法來(lái)取模得到所屬的slot,然后將這個(gè)key 分到哈希槽區(qū)間的節(jié)點(diǎn)上绣张,具體算法就是:CRC16(key) % 16384答渔。所以我們?cè)跍y(cè)試的時(shí)候看到set 和 get 的時(shí)候,直接跳轉(zhuǎn)到了7000端口的節(jié)點(diǎn)侥涵。

Redis 集群會(huì)把數(shù)據(jù)存在一個(gè) master 節(jié)點(diǎn),然后在這個(gè) master 和其對(duì)應(yīng)的salve 之間進(jìn)行數(shù)據(jù)同步宋雏。當(dāng)讀取數(shù)據(jù)時(shí)芜飘,也根據(jù)一致性哈希算法到對(duì)應(yīng)的 master 節(jié)點(diǎn)獲取數(shù)據(jù)。只有當(dāng)一個(gè)master 掛掉之后磨总,才會(huì)啟動(dòng)一個(gè)對(duì)應(yīng)的 salve 節(jié)點(diǎn)嗦明,充當(dāng) master 。

需要注意的是:必須要3個(gè)或以上的主節(jié)點(diǎn)蚪燕,否則在創(chuàng)建集群時(shí)會(huì)失敗娶牌,并且當(dāng)存活的主節(jié)點(diǎn)數(shù)小于總節(jié)點(diǎn)數(shù)的一半時(shí),整個(gè)集群就無(wú)法提供服務(wù)了馆纳。

redis集群伸縮實(shí)踐redis-cluster伸縮(槽和數(shù)據(jù)在節(jié)點(diǎn)之間的移動(dòng))

場(chǎng)景:redis集群由于各種原因诗良,可能需要下線(xiàn)機(jī)器,例如某臺(tái)機(jī)器經(jīng)常故障鲁驶,需要換掉鉴裹;例如某些時(shí)間段不需要那么多機(jī)器,都可以下線(xiàn)機(jī)器。某些時(shí)刻又需要增加機(jī)器径荔。

槽的概念

Redis Cluster中有一個(gè)16384長(zhǎng)度的槽的概念督禽,他們的編號(hào)為0、1总处、2狈惫、3……16382、16383鹦马。這個(gè)槽是一個(gè)虛擬的槽虱岂,并不是真正存在的。正常工作的時(shí)候菠红,Redis Cluster中的每個(gè)Master節(jié)點(diǎn)都會(huì)負(fù)責(zé)一部分的槽第岖,當(dāng)有某個(gè)key被映射到某個(gè)Master負(fù)責(zé)的槽,那么這個(gè)Master負(fù)責(zé)為這個(gè)key提供服務(wù)试溯,至于哪個(gè)Master節(jié)點(diǎn)負(fù)責(zé)哪個(gè)槽蔑滓,這是可以由用戶(hù)指定的,也可以在初始化的時(shí)候自動(dòng)生成(redis-trib.rb腳本)遇绞。這里值得一提的是键袱,在Redis Cluster中,只有Master才擁有槽的所有權(quán)摹闽,如果是某個(gè)Master的slave蹄咖,這個(gè)slave只負(fù)責(zé)槽的使用,但是沒(méi)有所有權(quán)付鹿。

增加節(jié)點(diǎn)澜汤,集群擴(kuò)容操作:

需要提前準(zhǔn)備好新節(jié)點(diǎn)并運(yùn)行在集群模式下,新節(jié)點(diǎn)建議跟集群內(nèi)的節(jié)點(diǎn)配置保持一致舵匾,便于管理統(tǒng)一

前面已經(jīng)配置好了三主三從的redis集群

準(zhǔn)備新機(jī)器,增加新節(jié)點(diǎn):
redis-7006.conf
redis-7007.conf
啟動(dòng)節(jié)點(diǎn)
[root@localhost src]# ./redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7006.conf 
[root@localhost src]# ./redis-server /usr/local/redis-4.0.10/redis_cluster/redis-7007.conf
1)加入集群
方法一:登錄任意一個(gè)集群節(jié)點(diǎn)俊抵,進(jìn)行cluster meet操作
[root@dev02 src]#  ./redis-cli  -h 192.168.0.217 -c -p 7001
192.168.0.217:7001> cluster meet 192.168.0.187 7006 
OK
192.168.0.217:7001> cluster meet 192.168.0.187 7007   
OK
在任意節(jié)點(diǎn)執(zhí)行cluster nodes可以看到
192.168.0.217:7001> cluster nodes
c22a455b53b210c251b67cad3218f6a0f23fd5e5 192.168.0.112:7004@17004 slave be724f368494ffbc995f939cff1c51c3800d2f2b 0 1570759904482 7 connected
575e3baaed21ad00dd9b2ddfb2035ece84c14acd 192.168.0.111:7002@17002 master - 0 1570759905000 3 connected 5461-10922
be724f368494ffbc995f939cff1c51c3800d2f2b 192.168.0.217:7001@17001 myself,master - 0 1570759898000 7 connected 10923-16383
413581dd1dff319b3a676deae031e26abb61780d 192.168.0.217:7000@17000 master - 0 1570759904000 1 connected 0-5460
652332f6e1708c3f15384dea3299b7f529677ff0 192.168.0.111:7003@17003 slave 413581dd1dff319b3a676deae031e26abb61780d 0 1570759907511 4 connected
387996ff427a05c74c6cb923725014052a8f605e 192.168.0.187:7006@17006 slave 413581dd1dff319b3a676deae031e26abb61780d 0 1570759905491 1 connected
0bd91df52d5308f420d08b54dedf4815d3831859 192.168.0.187:7007@17007 slave 413581dd1dff319b3a676deae031e26abb61780d 0 1570759906500 1 connected
baefc39247a5af15ac3093bc54d81175df4a785d 192.168.0.112:7005@17005 slave 575e3baaed21ad00dd9b2ddfb2035ece84c14acd 0 1570759905000 6 connected
然后可以做一個(gè)主從的分配:
登錄要分配的從節(jié)點(diǎn),用cluster replicate +masterID
[root@dev01 src]# ./redis-cli  -h 192.168.0.217 -c -p 7007
192.168.0.217:7007> cluster replicate 16a79c90c81679046159abdd34aff878d7112d38
OK
方法二:可以檢測(cè)節(jié)點(diǎn)是否存在于其他集群坐梯。(建議使用)
添加主節(jié)點(diǎn): redis-trib.rb add-node 192.168.0.187:7006 192.168.0.187:7007      
使用 add-node 命令來(lái)添加節(jié)點(diǎn)徽诲,第一個(gè)參數(shù)是新節(jié)點(diǎn)的地址,第二個(gè)參數(shù)是任意一個(gè)已經(jīng)存在的節(jié)點(diǎn)的IP和端口吵血,這樣谎替,新節(jié)點(diǎn)就會(huì)添加到集群中。 (相當(dāng)于一個(gè)meet的過(guò)程)

添加從節(jié)點(diǎn): redis-trib.rb add-node –slave 192.168.0.187:7006 192.168.0.187:7007 
這種情況下系統(tǒng)會(huì)在其他的集群中的主節(jié)點(diǎn)中隨機(jī)選取一個(gè)作為這個(gè)從節(jié)點(diǎn)的主節(jié)點(diǎn)蹋辅。

選擇做誰(shuí)的從節(jié)點(diǎn):redis-trib.rb add-node 192.168.0.187:7006 192.168.0.187:7007  --slave  --master-id  <arg mster的id值>   
 (如果新加的節(jié)點(diǎn)是從節(jié)點(diǎn)钱贯,可以通過(guò)這樣的參數(shù),選擇做誰(shuí)的從)

問(wèn)題解決:

1.如果節(jié)點(diǎn)一直加不上晕翠,檢查防火墻等是否關(guān)閉
2.[ERR] Node 192.168.0.217:7006 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解決:刪除相關(guān)節(jié)點(diǎn)中的appendonly.aof喷舀、dump.rdb砍濒、node_xxx.conf文件

命令記錄:

 ./redis-cli  -h 192.168.0.217  -p 7000 cluster nodes  (查看集群狀態(tài))
 ./redis-trib.rb del-node 192.168.0.217:7007 0bd91df52d5308f420d08b54dedf4815d3831859  (刪除一個(gè)slave節(jié)點(diǎn))
 ./redis-cli  -h 192.168.0.217  -p 7000 cluster slots (查看槽的分配情況)
 ./redis-trib.rb fix 192.168.0.217:7000              (修復(fù)槽異常情況)
2)遷移槽和數(shù)據(jù)
[root@dev01 src]# ./redis-trib.rb   reshard 192.168.0.217:7000
>>> Performing Cluster Check (using node 192.168.0.217:7000)
M: 413581dd1dff319b3a676deae031e26abb61780d 192.168.0.217:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: be724f368494ffbc995f939cff1c51c3800d2f2b 192.168.0.217:7001
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 652332f6e1708c3f15384dea3299b7f529677ff0 192.168.0.111:7003
   slots: (0 slots) slave
   replicates 413581dd1dff319b3a676deae031e26abb61780d
S: e58d7d1705eaed5e48f35d4bad1f226f4b03b2bf 192.168.0.217:7007
   slots: (0 slots) slave
   replicates 16a79c90c81679046159abdd34aff878d7112d38
M: 575e3baaed21ad00dd9b2ddfb2035ece84c14acd 192.168.0.111:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: c22a455b53b210c251b67cad3218f6a0f23fd5e5 192.168.0.112:7004
   slots: (0 slots) slave
   replicates be724f368494ffbc995f939cff1c51c3800d2f2b
M: 16a79c90c81679046159abdd34aff878d7112d38 192.168.0.217:7006
   slots: (0 slots) master
   1 additional replica(s)
S: baefc39247a5af15ac3093bc54d81175df4a785d 192.168.0.112:7005
   slots: (0 slots) slave
   replicates 575e3baaed21ad00dd9b2ddfb2035ece84c14acd
[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)? 
你需要遷移多少個(gè)槽 ?------>輸入 4096 

What is the receiving node ID?
你需要哪個(gè)ID接收硫麻?-------->輸入新擴(kuò)容的master的端口的ID

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.
輸入   all表示使用所有的其他節(jié)點(diǎn)作為source ID  ---->輸入all

Do you want to proceed with the proposed reshard plan (yes/no)?
是否想要繼續(xù)這個(gè)過(guò)程 ----->yes

結(jié)束,查看到分片的情況


image.png
問(wèn)題:
redis 集群重新(reshard)分片故障
[ERR] Calling MIGRATE ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
ruby gem安裝的redis庫(kù)爸邢,版本不能使用最新的4.0,否則redis-trib.rb reshard 192.168.0.217:7000 重新分片時(shí)會(huì)報(bào)錯(cuò)誤

解決方案
a. 卸載最新redis庫(kù)拿愧,gem uninstall redis
b. 安裝3.x版本杠河,gem install redis -v 3.3.5 測(cè)試3.2.1到3.3.5都可以,4.x以上的分片報(bào)錯(cuò)

 ./redis-trib.rb fix 192.168.0.217:7000  (修復(fù)reshard 出錯(cuò))

集群縮容

1)下線(xiàn)遷移槽
首先查看集群狀態(tài)
[root@dev01 src]# ./redis-cli  -h 192.168.0.217  -p 7000 cluster nodes 
be724f368494ffbc995f939cff1c51c3800d2f2b 192.168.0.217:7001@17001 master - 0 1570777972000 7 connected 12504-16383
652332f6e1708c3f15384dea3299b7f529677ff0 192.168.0.111:7003@17003 slave 413581dd1dff319b3a676deae031e26abb61780d 0 1570777974325 4 connected
e58d7d1705eaed5e48f35d4bad1f226f4b03b2bf 192.168.0.217:7007@17007 slave 16a79c90c81679046159abdd34aff878d7112d38 0 1570777969000 8 connected
575e3baaed21ad00dd9b2ddfb2035ece84c14acd 192.168.0.111:7002@17002 master - 0 1570777973000 3 connected 8012-10922
c22a455b53b210c251b67cad3218f6a0f23fd5e5 192.168.0.112:7004@17004 slave be724f368494ffbc995f939cff1c51c3800d2f2b 0 1570777973316 7 connected
413581dd1dff319b3a676deae031e26abb61780d 192.168.0.217:7000@17000 myself,master - 0 1570777968000 1 connected 2196-5460
16a79c90c81679046159abdd34aff878d7112d38 192.168.0.217:7006@17006 master - 0 1570777973000 8 connected 0-2195 5461-8011 10923-12503
baefc39247a5af15ac3093bc54d81175df4a785d 192.168.0.112:7005@17005 slave 575e3baaed21ad00dd9b2ddfb2035ece84c14acd 0 1570777972306 6 connected

這里演示把剛剛加給7006的槽分出去浇辜,可以看到7006的槽數(shù)量范圍分別是 0-2195 5461-8011 10923-12503:
./redis-trib.rb reshard --from 16a79c90c81679046159abdd34aff878d7112d38 --to be724f368494ffbc995f939cff1c51c3800d2f2b --slots 2196 192.168.0.217:7000
解釋?zhuān)?/redis-trib.rb reshard --from   要分配的槽的ID   --to    槽分配給誰(shuí)的ID     --slots    槽的數(shù)量     任意一個(gè)集群的節(jié)點(diǎn)ip:端口
依次把另外的槽的數(shù)量都分配給別的master
./redis-trib.rb reshard --from 16a79c90c81679046159abdd34aff878d7112d38 --to 575e3baaed21ad00dd9b2ddfb2035ece84c14acd --slots 3264 192.168.0.217:7000
./redis-trib.rb reshard --from 16a79c90c81679046159abdd34aff878d7112d38 --to be724f368494ffbc995f939cff1c51c3800d2f2b --slots 2550 192.168.0.217:7000
遷移完畢券敌,查看到7006的已經(jīng)沒(méi)有槽了
[root@dev01 src]# ./redis-cli  -h 192.168.0.217  -p 7000 cluster nodes
16a79c90c81679046159abdd34aff878d7112d38 192.168.0.217:7006@17006 master - 0 1570779335000 8 connected
2)忘記節(jié)點(diǎn)

先下從節(jié)點(diǎn),再下主節(jié)點(diǎn)柳洋,如果先下主節(jié)點(diǎn)會(huì)出現(xiàn)故障自動(dòng)轉(zhuǎn)移

./redis-trib.rb del-node 192.168.0.217:7000 0bd91df52d5308f420d08b54dedf4815d3831859
 解釋?zhuān)?/redis-trib.rb del-node 任意一個(gè)集群的節(jié)點(diǎn)ip:端口    要忘記的節(jié)點(diǎn)的ID
然后可以驗(yàn)證一下待诅,發(fā)現(xiàn)沒(méi)有7006、7007的集群端口:
[root@dev01 src]# ./redis-cli  -h 192.168.0.217  -p 7000 cluster nodes                                
be724f368494ffbc995f939cff1c51c3800d2f2b 192.168.0.217:7001@17001 master - 0 1570780017687 9 connected 0-2195 5461-8011 12504-16383
652332f6e1708c3f15384dea3299b7f529677ff0 192.168.0.111:7003@17003 slave 413581dd1dff319b3a676deae031e26abb61780d 0 1570780014000 4 connected
575e3baaed21ad00dd9b2ddfb2035ece84c14acd 192.168.0.111:7002@17002 master - 0 1570780016000 10 connected 8012-12503
c22a455b53b210c251b67cad3218f6a0f23fd5e5 192.168.0.112:7004@17004 slave be724f368494ffbc995f939cff1c51c3800d2f2b 0 1570780015000 9 connected
413581dd1dff319b3a676deae031e26abb61780d 192.168.0.217:7000@17000 myself,master - 0 1570780015000 1 connected 2196-5460
baefc39247a5af15ac3093bc54d81175df4a785d 192.168.0.112:7005@17005 slave 575e3baaed21ad00dd9b2ddfb2035ece84c14acd 0 1570780017000 10 connected

無(wú)法連接節(jié)點(diǎn)熊镣,命令redis-trib.rb del-node host:port node_id無(wú)能為力了卑雁,只能使用CLUSTER FORGET node-id。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绪囱,一起剝皮案震驚了整個(gè)濱河市测蹲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鬼吵,老刑警劉巖扣甲,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異齿椅,居然都是意外死亡琉挖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)媒咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粹排,“玉大人,你說(shuō)我怎么就攤上這事涩澡。” “怎么了坠敷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵妙同,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我膝迎,道長(zhǎng)粥帚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任限次,我火速辦了婚禮芒涡,結(jié)果婚禮上柴灯,老公的妹妹穿的比我還像新娘。我一直安慰自己费尽,他們只是感情好赠群,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著旱幼,像睡著了一般查描。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柏卤,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天冬三,我揣著相機(jī)與錄音,去河邊找鬼缘缚。 笑死勾笆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桥滨。 我是一名探鬼主播窝爪,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼该园!你這毒婦竟也來(lái)了酸舍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤里初,失蹤者是張志新(化名)和其女友劉穎啃勉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體双妨,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淮阐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刁品。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泣特。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挑随,靈堂內(nèi)的尸體忽然破棺而出状您,到底是詐尸還是另有隱情,我是刑警寧澤兜挨,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布膏孟,位于F島的核電站,受9級(jí)特大地震影響拌汇,放射性物質(zhì)發(fā)生泄漏柒桑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一噪舀、第九天 我趴在偏房一處隱蔽的房頂上張望魁淳。 院中可真熱鬧飘诗,春花似錦、人聲如沸界逛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仇奶。三九已至貌嫡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間该溯,已是汗流浹背岛抄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狈茉,地道東北人夫椭。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氯庆,于是被迫代替她去往敵國(guó)和親蹭秋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345