1、先創建好redis集群,然后將所有的slot分配到一個主節點
2、把單節點的實例快照或是aof文件拷貝到集群的一個節點上,將所有數據放到主節點的16834個slot里面,然后啟動集群另外的節點,將16834個slot里的數據分發到其他的節點上去,最后是為每個主節點創建從庫。
具體步驟如下:
1、創建好redis集群
2、假如單實例redis同時開啟了RDB和AOF,只要AOF文件就可以了,因為當AOF和RDB同時存在的時候,Redis還是會先加載AOF文件的
在單實例redis上執行 BGREWRITEAOF保存數據
如果沒有開啟AOF只開了rdb則執行BGSAVE,
BGSAVE 命令執行之后立即返回 OK ,然后 Redis fork 出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,然后退出。
客戶端可以通過 LASTSAVE 命令查看相關信息,判斷 BGSAVE 命令是否執行成功。
3、查看集群當前卡槽分配情況並將所有卡槽集中到一個master節點
./redis-trib.rb check 10.253.112.161:7001
#redis5以上統一使用redis-cli命令
redis-cli --cluster info 10.253.112.161:7001
>>> Performing Cluster Check (using node 10.253.112.161:7001) M: 8ec7056e12788255ada53b548ee960cb690e72c7 10.253.112.161:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 4e445cdf6b0430433a7a32928622e803f686ba76 10.253.112.161:7005 slots: (0 slots) slave replicates 4faa969455ae34669e5b9bf4b14655e969514122 S: dd2407d636459bbc8dc88df11321e387e567ee1e 10.253.112.161:7004 slots: (0 slots) slave replicates 8ec7056e12788255ada53b548ee960cb690e72c7 M: b816bbff799243edd86e067879e6bfbfe37330e0 10.253.112.161:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 4faa969455ae34669e5b9bf4b14655e969514122 10.253.112.161:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: c7e644caca2d0725d8ff0bd852f6e51eceb48970 10.253.112.161:7006 slots: (0 slots) slave replicates b816bbff799243edd86e067879e6bfbfe37330e0 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
可以看到10.253.112.161:7001分配的卡槽是0-5460
10.253.112.161:7003分配的卡槽是10923-16383
10.253.112.161:7002分配的卡槽是5461-10922
我們現在要將10.253.112.161:7002和10.253.112.161:7003的卡槽遷移到10.253.112.161:7001上面去
先將10.253.112.161:7002的卡槽遷移到10.253.112.161:7001
./redis-trib.rb reshard 10.253.112.161:7002
或
redis-cli --cluster reshard 10.253.112.161:7002
該過程會先讓你輸入遷出多少個卡槽,然后輸入遷到哪個卡槽再輸入從哪遷
>>> Performing Cluster Check (using node 10.253.112.161:7002) M: 4faa969455ae34669e5b9bf4b14655e969514122 10.253.112.161:7002 slots: (0 slots) master 0 additional replica(s) S: 4e445cdf6b0430433a7a32928622e803f686ba76 10.253.112.161:7005 slots: (0 slots) slave replicates 8ec7056e12788255ada53b548ee960cb690e72c7 M: 8ec7056e12788255ada53b548ee960cb690e72c7 10.253.112.161:7001 slots:0-10922 (10923 slots) master 2 additional replica(s) M: b816bbff799243edd86e067879e6bfbfe37330e0 10.253.112.161:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: dd2407d636459bbc8dc88df11321e387e567ee1e 10.253.112.161:7004 slots: (0 slots) slave replicates 8ec7056e12788255ada53b548ee960cb690e72c7 S: c7e644caca2d0725d8ff0bd852f6e51eceb48970 10.253.112.161:7006 slots: (0 slots) slave replicates b816bbff799243edd86e067879e6bfbfe37330e0 [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)? 5462 #表示遷出5462個卡槽 What is the receiving node ID? 4faa969455ae34669e5b9bf4b14655e969514122 #接收遷出卡槽的id,因為我們要把所以卡槽遷到10.253.112.161:7001上面,所以這里的id就是10.253.112.161:7001的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. Source node #1:8ec7056e12788255ada53b548ee960cb690e72c7 #移出去的節點id ,因為我們要把10.253.112.161:7002的卡槽遷出去,所以這里的id是10.253.112.161:7002的id
Source node #2:done
.............
.............
Do you want to proceed with the proposed reshard plan (yes/no)?yes
同上將10.253.112.161:7003的卡槽遷移到10.253.112.161:7001
./redis-trib.rb reshard 10.253.112.161:7003
或
redis-cli --cluster reshard 10.253.112.161:7003
[root@ddyh-app-02 redis-cluster]# ./redis-trib.rb check 10.253.112.161:7001 >>> Performing Cluster Check (using node 10.253.112.161:7001) M: 8ec7056e12788255ada53b548ee960cb690e72c7 10.253.112.161:7001 slots:0-16383 (16384 slots) master 3 additional replica(s) S: 4e445cdf6b0430433a7a32928622e803f686ba76 10.253.112.161:7005 slots: (0 slots) slave replicates 8ec7056e12788255ada53b548ee960cb690e72c7 S: dd2407d636459bbc8dc88df11321e387e567ee1e 10.253.112.161:7004 slots: (0 slots) slave replicates 8ec7056e12788255ada53b548ee960cb690e72c7 M: b816bbff799243edd86e067879e6bfbfe37330e0 10.253.112.161:7003 slots: (0 slots) master 0 additional replica(s) M: 4faa969455ae34669e5b9bf4b14655e969514122 10.253.112.161:7002 slots: (0 slots) master 0 additional replica(s) S: c7e644caca2d0725d8ff0bd852f6e51eceb48970 10.253.112.161:7006 slots: (0 slots) slave replicates 8ec7056e12788255ada53b548ee960cb690e72c7 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
可以看到所有的卡槽均已在10.253.112.161:7001上面。
4、停掉redis集群,然后把單實例節點的aof文件或者dump文件拷貝到10.253.112.161:7001的節點對應的目錄下,單實例開啟了aof的化只需要aof文件即可,沒開啟aof則拷貝dump.rdb文件。
將拷貝過來的文件命名為跟10.253.112.161:7001節點配置文件定義的名字一樣。
注意:因為redis默認優先讀寫aof文件,如果集群開啟了aof模式,但只拷貝rdb文件過來,啟動redis集群時,redis內依然無數據,因為沒有aof文件,此時需要先關閉aof再啟動redis集群,數據導完后生成aof文件然后停止redis集群再開啟aof
appendonly no
然后只啟動7001這個節點
cd /data1/redis-cluster/redis-01 ./redis-server redis.conf
檢測數據是否拷貝完成,沒有的話則查看日志是否報錯
./redis-trib.rb info 10.253.112.161:7001
或
redis-cli --cluster info 10.253.112.161:7001
如果直接拷過來的是aof文件,下面三步無需操作:
使用redis-cli命令,登錄redis,執行BGREWRITEAOF命令,重新生成aof文件
關閉redis,在redis.conf中開啟aof模式
重新開啟redis服務,這時候,redis就會讀取appendonly.aof文件,加載完整數據了。
5、將10.253.112.161:7001的槽 均勻分配給其他兩個master節點
./redis-trib.rb reshard --from 8ec7056e12788255ada53b548ee960cb690e72c7 --to 4faa969455ae34669e5b9bf4b14655e969514122 --slots 5462 --yes 10.253.112.161:7002
./redis-trib.rb reshard --from 8ec7056e12788255ada53b548ee960cb690e72c7 --to b816bbff799243edd86e067879e6bfbfe37330e0 --slots 5461 --yes 10.253.112.161:7003
再次檢測節點卡槽分配及數據即可