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槽分配出去