簡(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)建成功:
方法二: 編譯安裝
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
之后再運(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é)束,查看到分片的情況
問(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。