背景:之前搭建了Redis的集群环境,3主3从共六个节点(传送门:https://editor.csdn.net/md/?articleId=122602931)
现在想要水平扩展/删除1主1从。
./redis-server ../redis-cluster/8001/redis-8001.conf
./redis-server ../redis-cluster/8002/redis-8002.conf
./redis-server ../redis-cluster/8003/redis-8003.conf
./redis-server ../redis-cluster/8004/redis-8004.conf
./redis-server ../redis-cluster/8005/redis-8005.conf
./redis-server ../redis-cluster/8006/redis-8006.conf
./redis-cli -p 8001 -h 192.168.74.128 -c -a root
# 连接成功后,查看集群节点信息
192.168.74.128:8001> CLUSTER NODES
从上图可以看出,整个集群运行正常,三个master节点和三个slave节点,8001端口的实例节点存储0-5460这些hash槽,8002端口的实 例节点存储5461-10922这些hash槽,8003端口的实例节点存储10923-16383这些hash槽,这三个master节点存储的所有hash槽组成 redis集群的存储槽位,slave点是每个主节点的备份从节点,不显示存储槽位。
我这里在192.168.74.128服务上集群配置文件同路径下创建了8007和8008文件夹,并将8001的配置文件复制到8007/redis-8007.conf和8008/redis-8008.conf,并对800x相关配置进行修改。
这里配置文件修改同集群配置文件,将集群配置文件800x相关配置修改即可
./redis-server ../redis-cluster/8007/redis-8007.conf
./redis-server ../redis-cluster/8008/redis-8008.conf
# 查看redis进程
ps -ef|grep redis
redis集群的命令帮助参考 附录1
# 将8008加入集群,并成为主节点
./redis-cli --cluster add-node 192.168.74.128:8007 192.168.74.128:8001 -a root
查看集群状态:
./redis-cli -h 192.168.74.128 -p 8001 -a root -c
# 查看集群状态
cluster nodes
注意: 当添加节点成功以后,新增的节点不会有任何数据,因为它还没有分配任何的slot(hash槽),我们需要为新节点手工分配hash槽。
所以,我们接下来就需要为8007分配hash槽,找到其中任意一个主节点,进行分片。
../redis-cli -a root --cluster reshard 192.169.74.128:8001
输入如下:
… …
How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
What is the receiving node ID?ee8cf16b7b208619a74c909860af1a968708295d
(ps:把这600个hash槽移动到哪个节点上去,需要指定节点id,这里指定8007的节点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:all
(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)
… …
重新检查集群信息
cluster nodes
现在我们的8007已经有hash槽了,也就是说可以在8007上进行读写数据啦!到此为止我们的8007已经加入到集群中,并且 是主节点(Master)
# 将8008节点加入集群
./redis-cli --cluster add-node 192.168.74.128:8008 192.168.74.128:8001 -a root
# 连接8001
./redis-cli -h 192.168.74.128 -p 8001 -a root -c
# 查看集群信息
cluster nodes
加入后我们发现,新加入的8008节点是个主节点,没有被分配任何的hash槽。所以,我们还需要将8008配置成8007节点的从节点
我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个,首先需要连接新加的8008节点的客户端,然后使用集群命令进行操作,把当前的8008(slave)节点指定到一个主节点下(这里使用之前创建的8007主节点)
# 连接8008主节点
./redis-cli -h 192.168.74.128 -p 8008 -a root -c
# 配置8008为8007节点的从节点
# 后面的id为8007主节点的id
cluster replicate ee8cf16b7b208619a74c909860af1a968708295d
# 查看集群信息
cluster nodes
到此,集群的水平扩展一主一从就完成了!!!
用del-node删除从节点8008,指定删除节点ip和端口,以及节点id(8008节点id)
# 从集群中删除8008从节点
./redis-cli --cluster del-node 192.168.74.128:8008 0b54dd59f3dc3c1114562e889aca079f24ca3d83 -a root
# 查看集群状态
cluster nodes
我们可以看到,8008这个slave节点已经从集群中移除
最后,我们尝试删除之前加入的主节点8007,这个步骤相对比较麻烦一些,因为主节点的里面是有分配了hash槽的,所以我们这里必须先把8007里的hash槽放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题(目前只能把master的数据迁移 到一个节点上,暂时做不了平均分配功能)。
# 将8007里的hash槽放入其他可用节点
./redis-cli -a root --cluster reshard 192.168.74.128:8007
输出如下:
… …
How many slots do you want to move (from 1 to 16384)? 600
What is the receiving node ID? 0ac238229b9e55657bb5500e76d343e6b52c00ac
(ps:这里是需要把数据移动到哪?8001的主节点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:
ee8cf16b7b208619a74c909860af1a968708295d
(ps:这里是需要数据源,也就是我们的8007节点id)
Source node 2:done
(ps:这里直接输入done 开始生成迁移计划)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:这里输入yes开始迁移)
… …
至此,我们已经成功的把8007主节点的数据迁移到8001上去了,我们可以看一下现在的集群状态如下图,你会发现8007下面已经没有任何hash槽了,证明迁移成功。
最后,我们只需要删除8007节点即可。
# 从集群中删除8008从节点
./redis-cli --cluster del-node 192.168.74.128:8007 ee8cf16b7b208619a74c909860af1a968708295d -a root
# 查看集群状态
cluster nodes
到此,8007节点已经从集群中删除,一切还原到最初的状态,大功告成!!
# 查看redis集群的命令帮助
./redis‐cli ‐‐cluster help