3.0版本之前的redis是不支持集群的

 

1、redis-cluster架构图


 

2、redis-cluster容错

1)投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.

 

2)什么时候整个集群不可用(cluster_state:fail)?

 

如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.

redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开的话集群可以兼容部分节点失败.

如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

 

3、为集群增加主节点 (提高并发写的能力、扩大容量)

命令:

./redis-trib.rb add-node 192.168.37.131:7007 192.168.37.131:7001

192.168.37.131:7007表示要添加的新节点

192.168.37.131:7001表示集群中的任意一个主节点(该节点的作用是用来连接上集群)

 

使用命令 ./redis1/redis-cli -c -h 192.168.37.131 -p 7001 连接上集群

使用命令 cluster nodes 查看节点是否加入到集群中

 

新增主节点的话要重新分配hashSolt

第一步:连接上集群

./redis-trib.rb reshard 192.168.37.131:7001(连接集群中任意一个可用结点都行)(会提示给新节点分配hashsolat)

第二步:输入要分配的槽数量

输入1000表示要分配1000个槽

第三步:输入接收槽的结点id

这里准备给7007分配槽,通过cluster nodes查看7007结点id为5d6c61ecff23bff3b0fb01a86c66d882f2d402a0

输入:5d6c61ecff23bff3b0fb01a86c66d882f2d402a0

第四步:输入源结点id

输入源结点id,槽将从源结点中拿,分配后的槽在源结点中就不存在了。

输入all表示从所有源结点中获取槽。

输入done取消分配。

第五步:输入yes开始移动槽到目标结点id

第六步:查看结点信息 查看hashSolt是否已经分配给新节点

 

 

4、新增从节点(增加并发读能力)

   ./redis-trib.rb add-node --slave --master-id 主节点id  新添加的节点的ip和端口集群中已存在的任意节点ip和端口

 

5、删除节点

./redis-trib.rb del-node 192.168.37.131:7007 5d6c61ecff23bff3b0fb01a86c66d882f2d402a0

命令解释:./redis-trib.rb del-node 要删除的节点IP:PORT  节点的ID

 

删除已经占有hash槽的结点会失败,报错如下:

 [ERR] Node 192.168.37.131:7007 is not empty! Reshard data away and try again.

需要将该结点占用的hash槽分配出去