Redis分片集群-集群伸缩
redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:
redis-cli --cluster help执行如下:
比如,添加节点的命令:
new_host代表需要添加的节点ip, exitsting_host代表已经存在的主机IP,也即集群中已经有的,为什么需要知道旧节点的ip端口呢,因为要向集群添加节点,需要通知集群中的每个角色,也就是得先联系上这个集群,告诉这个端口号,客户端命令就可以联系上这个集群,从而把这个新节点信息通知给集群中的每一个角色,新增的节点在没有指定的情况下,默认就是主节点,如果加上后面的注释部分比如cluster-slave就代表是从节点,还可以通过cluster-master-id指定它的主节点是谁。
首先,创建一个文件夹存放节点配置文件。
mkdir 9004
接着把redis.conf文件拷贝放入到9004文件夹下,执行命令:
cp redis.conf 9004
通过命令将配置文件里面的端口号改一下:
sed -i s/6379/9004/g 9004/redis.conf
启动新加的节点:
redis-server 9004/redis.conf
启动后查看一下进程:
ps -ef | grep redis
如下图:
但现在它还没有成为集群中的节点,我们要通过这个命令执行让其成为集群节点的一部分:
redis-cli --cluster add-node 192.168.137.11:9004 192.168.137.11:9001
为了更准确的查看添加信息,可以执行:
redis-cli -p 9001 cluster nodes
但是上图的对比发现,9004是没有任何插槽的,这个时候需要重新分配集群的插槽给9004,需要就9001上的一部分插槽分配给9004.
执行:redis-cli -c -p 9001
输入不同的变量值,查看插槽的显示信息:
从上图可看出,num的插槽是2765,如果想要将num分配在9004这个节点上,则需将指定的插槽移动到9004上。执行:
redis-cli --cluster reshard 192.168.137.11:9001
上面这个指令地址192.168.137.11:9001代表的是从哪个集群ip上进行分片,我们现在是想从9001这个集群上获取分配,所以填9001这个就好。如下图:
回车,在输入要分配到哪个记得,也就是9004这个节点地址,直接复制上面的9004这个节点的id即可:
回车,接下来它又问你从哪个源进行拷贝,毫无疑问从9001上进行拷贝,复制它的id填入即可:
写完后,再填入done代表结束。
后面还会提示你要不要将这3000个插槽移动过去,输入yes回车即可。
0到2999个插槽移动完成:
再执行查询集群节点信息的命令:redis-cli -p 9001 cluster nodes,可以看到新加的9004节点已经有插槽值分配到。
执行命令:redis-cli -c -p 9001,可以发现num值已经存在了9004这个节点上了(原来是在9001上的 )。
这同时也说明了,redis的数据是跟着插槽走的。记住两个命令,一个是:add-node,另一个是:reshard,可以通过帮助文档命令:redis-cli --cluster help查看。
接下来,我们演示下删除主节点,我们现在要将9004这个节点删除。
如果主节点有从节点,将从节点转移到其他主节点
如果主节点有slot,去掉分配的slot,然后在删除主节点
过程如下:
1.槽位移动
执行名:redis-cli --cluster reshard 192.168.137.11:9004
按照上图的步骤回车一步一步执行即可,接下来它又问从哪个源进行拷贝,肯定是需要删除的这个节点上拷贝了:
接着,执行done操作,后面又问要不要将这3000个槽位移动过去,yes即可:
2.删除主节点9004
直接执行:redis-cli --cluster del-node 192.168.137.11:9004 30977fd928bc445a89e86102f43eeb0779ee8b23
接着验证一下:redis-cli -p 9001 cluster nodes