槽位分配情况如下,槽位号从0开始,到16383结束,共16384个槽位:
节点 槽位数量node1:6379 0 - 5461
node2:6379 5461 - 10922
node3:6379 10922 - 16383
开始分配:
$ redis-cli -h node1 -p 6379 cluster addslots {0..5461} $ redis-cli -h node2 -p 6379 cluster addslots {5462..10922} $ redis-cli -h node3 -p 6379 cluster addslots {10923..16383} 检查槽位是否分配正确,这里进行内容截取:
$ redis-cli -h node1 -p 6379 node1:6379> CLUSTER nodes 192.168.0.130:6379@16379 master - 0 1617292240544 1 connected 5462-10922 192.168.0.140:6379@16379 master - 0 1617292239000 2 connected 10923-16383 192.168.0.120:6379@16379 myself,master - 0 1617292238000 5 connected 0-5461 # 看master节点的最后 检查状态 使用以下命令检查集群状态是否ok,如果槽位全部分配完毕应该是ok,不然的话就检查你分配槽位时是否输错了数量:
$ redis-cli -h node1 -p 6379 node1:6379> CLUSTER info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:5 cluster_my_epoch:5 cluster_stats_messages_ping_sent:2825 cluster_stats_messages_pong_sent:2793 cluster_stats_messages_meet_sent:5 cluster_stats_messages_sent:5623 cluster_stats_messages_ping_received:2793 cluster_stats_messages_pong_received:2830 cluster_stats_messages_received:5623 MOVED重定向 现在我们在node1的master节点上进行写入:
$ redis-cli -h node1 -p 6379 node1:6379> set k1 "v1" (error) MOVED 12706 192.168.0.140:6379 它会提示你去node2的master上进行写入。
这个就是MOVED重定向。
-c参数 如何解决这个问题?其实在登录的时候加上参数-c即可,-c参数无所谓你的Redis是否是集群模式,建议任何登录操作都加上,这样即使是Redis集群也会自动进行MOVED重定向:
$ redis-cli -c -h node1 -p 6379 node1:6379> set k1 "v1" -> Redirected to slot [12706] located at 192.168.0.140:6379 OK 一并对主从进行验证,这条数据是写入至了node3的Master中,我们登录node2的Slave中进行查看:
$ redis-cli -h node2 -p 6380 -c node2:6380> keys * 1) "k1" 故障转移 故障模拟 模拟node1的6379下线宕机,此时应该由node3的6380接管它的工作:
$ redis-cli -h node1 -p 6379 shutdown 登录集群任意节点查看目前的集群节点信息:
node2:6379> cluster nodes 214dc5a10149091047df1c61fd3415d91d6204ea 192.168.0.130:6379@16379 myself,master - 0 1617294532000 1 connected 5462-10922 bae708f7b8df32edf4571c72bbf87715eb45c169 192.168.0.130:6380@16380 slave 7a151f97ee9b020a3c954bbf78cd7ed8a674aa70 0 1617294533000 2 connected # 已下线 c8a8c7d52e6e7403e799c75302b6411e2027621b 192.168.0.120:6379@16379 master,fail - 1617294479247 1617294475173 5 disconnected 7a151f97ee9b020a3c954bbf78cd7ed8a674aa70 192.168.0.140:6379@16379 master - 0 1617294536864 2 connected 10923-16383 # 自动升级为主库,并且插槽也转移了 fd1dde2a641727e52b4e82cfb351fe3c17690a17 192.168.0.140:6380@16380 master - 0 1617294536000 6 connected 0-5461 baa10306639fcaca833db0d521235bc9593dbeca 192.168.0.120:6380@16380 slave 214dc5a10149091047df1c61fd3415d91d6204ea 0 1617294535853 1 connected 恢复工作 重启node1的6379:
$ redis-server /usr/local/redis_cluster/redis_6379/conf/redis.cnf 登录node1的6379,发现他已经自动的进行上线了,并且作为node3中6380的从库:
$ redis-cli -h node1 -p 6379 node1:6379> cluster nodes # 自动上线 c8a8c7d52e6e7403e799c75302b6411e2027621b 192.168.0.120:6379@16379 myself,slave fd1dde2a641727e52b4e82cfb351fe3c17690a17 0 1617294746000 6 connected cluster命令 以下是集群中常用的可执行命令,命令执行格式为:
cluster 下表命令 命令如下,未全,如果想了解更多请执行cluster help操作:
命令 描述INFO 返回当前集群信息
MEET <ip> <port> [<bus-port>] 添加一个节点至当前集群
MYID 返回当前节点集群ID
NODES 返回当前节点的集群信息
REPLICATE <node-id> 将当前节点作为某一集群节点的从库
FAILOVER [FORCE|TAKEOVER] 将当前从库升级为主库
RESET [HARD|SOFT] 重置当前节点信息
ADDSLOTS <slot> [<slot> ...] 为当前集群节点增加一个或多个插槽位,推荐在bash shell中执行,可通过{int..int}指定多个插槽位
DELSLOTS <slot> [<slot> ...] 为当前集群节点删除一个或多个插槽位,推荐在bash shell中执行,可通过{int..int}指定多个插槽位
FLUSHSLOTS 删除当前节点中所有的插槽信息
FORGET <node-id> 从集群中删除某一节点
COUNT-FAILURE-REPORTS <node-id> 返回当前集群节点的故障报告数量
COUNTKEYSINSLOT <slot> 返回某一插槽中的键的数量
GETKEYSINSLOT <slot> <count> 返回当前节点存储在插槽中的key名称。
KEYSLOT <key> 返回该key的哈希槽位
SAVECONFIG 保存当前集群配置,进行落盘操作
SLOTS 返回该插槽的信息