上一篇文章中搭建的redis集群的三个主节点平分了16384个槽位:
如果此时以redis-cli -p 端口号的方式进入了某个主节点,尝试存入某个key,但是其哈希值不在该节点的哈希槽范围内,则会报如下错误:
解决方法就是以redis-cli -p 端口号 -c进入:
此时,存储ok,并且会跳转到另外一个主机。
上述redis集群的容错机制是:若主节点挂了,从节点会上位,如果主机点恢复,则会变为从机。
接下来介绍扩容:
首先再创建两个实例:
docker run -p 6387:6379 -p 16387:16379 --name redis7 --privileged=true -v /tmp/redis/data7/:/data -d redis --cluster-enabled yes --appendonly yes docker run -p 6388:6379 -p 16388:16379 --name redis8 --privileged=true -v /tmp/redis/data8/:/data -d redis --cluster-enabled yes --appendonly yes
进入redis7容器,执行如下命令使其加入集群:
redis-cli --cluster add-node 新加入节点的ip:6379 原集群中某个主机的ip:6379
如果不清楚ip,可以通过cat /etc/hosts查看。接下来重新划分哈希槽:
redis-cli --cluster reshard 集群中某个主节点的ip:6379
这里以redis1容器的ip 172.0.0.2为例,如下图:
输入上述命令后,首先会问你移多少个槽,为了均分,需要移4096个槽位给新加入的节点,然后输入接受节点的id,即新加入节点在集群中的id,然后会问你从哪儿移槽位,这里我们选择所有的节点,输入all:
接下来可能还会有一个确认项,输入yes即可 ,完成分配后,重新检查集群信息:
可以发现,新加入的节点已经分配了4096个槽位(分成了三段),其他三个主节点的槽位都有减少。接下来进入从机redis8容器,执行如下命令使其加入集群并成为redis7的从机:
redis-cli --cluster add-node 从机ip:6379 主机ip:6379 --cluster-slave --cluster-master-id 主机在集群中的id
然后查看集群信息,发现集群已经变为四主四从:
接下来介绍缩容:
首先从集群中删除redis8从机节点 :
redis-cli --cluster del-node 从机ip:6379 从机在集群中的id
在删除redis7主机之前,需要重新分配槽位,即把redis7的4096个槽位分给其他节点,这里全部分给redis1节点:
上图中依然是选择移动4096个槽位,使用redis1在集群中的id作为接受者,然后输入redis8的id作为槽位来源者,输入done,表示设置结束,槽位重新分配好之后,从集群中删除redis7节点:
redis-cli --cluster del-node 主机ip:6379 主机在集群中的id
然后查看集群信息:
可以看到集群已经变为三主三从



