redis槽位
redis集群搭建完后会自动在redis集群中内置16384个哈希槽(至于为啥是16384个,有兴趣的读者可进行深究)。当客户端向redis集群中插入数据时(key-value),redis会先对key使用crc16算法算出一个结果值,然后用此结果值对16384进行求余,此余数会对应到16384中的相应槽位。也就是说,集群中的每个节点都会负责一部分槽位,这一部分槽位便用来存储数据。这里需要注意的是,搭建集群时,槽位并不一定是平均分配的。查看集群中每个节点负责的槽位,可进入任意集群节点后执行cluster nodes
查看,如下所示:
[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002>
127.0.0.1:7002>
127.0.0.1:7002> cluster nodes
645d2b118ba3d4d7f0de88c3618885d6ddc5734a 127.0.0.1:7002@17002 myself,master - 0 1575946339000 22 connected 0-5459
058fadf3bccee9d92e15f41f4290cf87c60698fd 127.0.0.1:7005@17005 slave 645d2b118ba3d4d7f0de88c3618885d6ddc5734a 0 1575946341203 22 connected
0a031b3b81c9307ac86b776b00b26110cf6e21b6 127.0.0.1:7006@17006 slave 6ac079fc26f0a558338263dba79afd20379c1fd7 0 1575946340201 23 connected
f17939b8ae0da8901cb3dd3ec425b50975f130d5 127.0.0.1:7001@17001 master - 0 1575946338195 21 connected 10920-16383
664ac1cf4e1dc5a810b3651b97009992d646a10a 127.0.0.1:7004@17004 slave f17939b8ae0da8901cb3dd3ec425b50975f130d5 0 1575946339198 21 connected
6ac079fc26f0a558338263dba79afd20379c1fd7 127.0.0.1:7003@17003 master - 0 1575946341000 23 connected 5460-10919
由上述可以看到,在每个主节点后面,会标注具体的槽位信息。
这里补充一下,集群数据迁移为啥要介绍槽位的概念。有可能有人会问,集群迁移,我们直接把持久化的数据文件(rdb文件或aof文件)拷贝过去不久行了吗?
其实不然,正是由于有槽位的存在,如果把持久化文件拷贝过去,你并不能保证A集群与B集群每个节点的槽位完全相同,也就是说,你从A集群拷贝的节点持久化文件并不能拷贝到B集群中的,一旦槽位产生差异,就会造成数据丢失或迁移出错。因此,集群数据迁移时,最保险的方法可参照如下步骤:
数据迁移步骤
假设从A集群迁移到B集群,A集群:127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003
这里需要备注下:此次数据迁移是在redis5.0+基础上进行测试的。不得不说,redis5.0+就是好呀。2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂度大大降低,爽爽爽。redis5.0以下版本, 下述用到的redis-cli命令,可替换为redis-trib.rb即可。
1)转移A集群槽位
将A集群的槽位全部转移到任一节点,这里我们假设转移到127.0.0.1:7001节点,在redis安装的bin目录下执行如下命令:
[root@localhost bin]# ./redis-cli --cluster reshard 127.0.0.1:7001
其中127.0.0.1:7001也可写成127.0.0.1:7002或127.0.0.1:7003。执行后,显示如下:
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f17939b8ae0da8901cb3dd3ec425b50975f130d5 127.0.0.1:7001
slots:[10920-16383] (5464 slots) master
1 additional replica(s)
S: 664ac1cf4e1dc5a810b3651b97009992d646a10a 127.0.0.1:7004
slots: (0 slots) slave
replicates f17939b8ae0da8901cb3dd3ec425b50975f130d5
M: 6ac079fc26f0a558338263dba79afd20379c1fd7 127.0.0.1:7003
slots:[5460-10919] (5460 slots) master
1 additional replica(s)
S: 058fadf3bccee9d92e15f41f4290cf87c60698fd 127.0.0.1:7005
slots: (0 slots) slave
replicates 645d2b118ba3d4d7f0de88c3618885d6ddc5734a
S: 0a031b3b81c9307ac86b776b00b26110cf6e21b6 127.0.0.1:7006
slots: (0 slots) slave
replicates 6ac079fc26f0a558338263dba79afd20379c1fd7
M: 645d2b118ba3d4d7f0de88c3618885d6ddc5734a 127.0.0.1:7002
slots:[0-5459] (5460 slots) master
1 additional replica(s)
[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)?
询问你要转移多少节点,由于我们是要从7002和7003节点转移到7001,所以这时我们需要查清楚每个节点总共多少槽位,通过上述cluster nodes知道,7002共有5460个槽位,7003共有5460个槽位。这里我们先转移7002节点。我们输入5460后回车
How many slots do you want to move (from 1 to 16384)? 5460
What is the receiving node ID?
询问你哪个节点接收转移的槽位,这里是7001节点,我们输入7001节点的ID即可
What is the receiving node ID? f17939b8ae0da8901cb3dd3ec425b50975f130d5
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:
此处是让你输入来源的节点ID,输入完7002的节点ID,再次输入done回车即可。
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: 645d2b118ba3d4d7f0de88c3618885d6ddc5734a
Source node #2: done
后续提示,输入yes即可。至此,7002节点的槽位转移完成。我们可以进入任意节点,查看cluster nodes情况
[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002> cluster nodes
645d2b118ba3d4d7f0de88c3618885d6ddc5734a 127.0.0.1:7002@17002 myself,master - 0 1575947648000 22 connected
058fadf3bccee9d92e15f41f4290cf87c60698fd 127.0.0.1:7005@17005 slave f17939b8ae0da8901cb3dd3ec425b50975f130d5 0 1575947648464 24 connected
0a031b3b81c9307ac86b776b00b26110cf6e21b6 127.0.0.1:7006@17006 slave 6ac079fc26f0a558338263dba79afd20379c1fd7 0 1575947647000 23 connected
f17939b8ae0da8901cb3dd3ec425b50975f130d5 127.0.0.1:7001@17001 master - 0 1575947648000 24 connected 0-5459 10920-16383
664ac1cf4e1dc5a810b3651b97009992d646a10a 127.0.0.1:7004@17004 slave f17939b8ae0da8901cb3dd3ec425b50975f130d5 0 1575947649466 24 connected
6ac079fc26f0a558338263dba79afd20379c1fd7 127.0.0.1:7003@17003 master - 0 1575947647461 23 connected 5460-10919
可以看到,7002节点的槽位已全部转移到7001节点。
接下来将7003节点的槽位转移到7001节点,操作方法与上述步骤相同。
2)转移B集群槽位
B集群的槽位也要统一转移到具体某个节点,转移方法同上。
3)转移数据
槽点转移完毕后,我们可以拷贝A集群的7001节点下的持久化文件,我们这里是rdb文件,如果设置了aof文件,则将aof文件进行拷贝到B集群中的某个节点,此节点是B集群所有槽位集中的节点。
4)启动B集群即可
当然,此时集群数据全部集中在某个节点,此时可以将槽位平均分配到各个节点,操作步骤同上,这里不再描述。
以上便是对redis集群数据迁移的简单描述,如有问题,可随时沟通。
遗留问题:
不同版本间,数据迁移。待调研。
网友评论