如上述命令正常执行输出结果如下。
[root@localhost bin]# /usr/local/bin/redis-cli -p 7001 127.0.0.1:7001> cluster meet 127.0.0.1 7002 OK 127.0.0.1:7001> cluster meet 127.0.0.1 7003 OK 127.0.0.1:7001> cluster meet 127.0.0.1 8001 OK 127.0.0.1:7001> cluster meet 127.0.0.1 8002 OK 127.0.0.1:7001> cluster meet 127.0.0.1 8003 OK接下来可以通过 cluster nodes 命令查看节点之间 的链接状态。我随机找了两个节点 B 和 F 测试,输出结果如下所示。
[root@localhost /]# /usr/local/bin/redis-cli -p 7002 cluster nodes 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220691885 4 connected a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 master - 0 1552220691000 5 connected 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220690878 3 connected 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 myself,master - 0 1552220690000 1 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220691000 2 connected ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220690000 0 connected [root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected可以看到,节点 B 和节点 F 都已经分别和其他 5 个节点建立链接。
至此,节点握手完成。
分配槽位此时 Redis 集群还并没有处于上线状态,可以在任意一节点上执行 cluster info 命令来查看目前集群的运行状态。
[root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info cluster_state:fail ......上面输出cluster_state:fail表示当前集群处于下线状态。因为只有给集群中所有主节点分配好槽位(即哈希槽slot,本文第一小节有提及)集群才能上线。
分配槽位的命令如下:
cluster addslots slot [slot ...]根据预先规划,这一步需要使用 cluster addslots 命令手动将 16384 个哈希槽大致均等分配给主节点 A、B、C。
/usr/local/bin/redis-cli -p 7001 cluster addslots {0..5461} /usr/local/bin/redis-cli -p 7002 cluster addslots {5462..10922} /usr/local/bin/redis-cli -p 7003 cluster addslots {10923..16383}上面三组命令执行完毕,可以再次查看目前集群的一些运行参数。
[root@localhost ~]# /usr/local/bin/redis-cli -p 7001 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:4 cluster_stats_messages_ping_sent:11413 cluster_stats_messages_pong_sent:10509 cluster_stats_messages_meet_sent:11 cluster_stats_messages_sent:21933 cluster_stats_messages_ping_received:10509 cluster_stats_messages_pong_received:10535 cluster_stats_messages_received:21044如上输出cluster_state:ok证明 Redis 集群成功上线。
主从复制Redis 集群成功上线,不过还没有给主节点指定从节点,此时如果有一个节点故障,那么整个集群也就挂了,也就无法实现高可用。
集群中需要使用 cluster replicate 命令手动给从节点配置主节点。
集群复制命令如下:
cluster replicate node-id集群中各个节点的node-id可以用cluster nodes命令查看,如下输出1b4b3741945d7fed472a1324aaaa6acaa1843ccb即是主节点 B 的node-id。
[root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected根据预先规划,A主D从;B主E从;C主F从。执行如下三组命令分别为从节点 D、E、F 指定其主节点,使群集可以自动完成主从复制。
/usr/local/bin/redis-cli -p 8001 cluster replicate 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 /usr/local/bin/redis-cli -p 8002 cluster replicate 1b4b3741945d7fed472a1324aaaa6acaa1843ccb /usr/local/bin/redis-cli -p 8003 cluster replicate 19147f56e679767bcebb8653262ff7f56ca072a8命令执行成功后,我们便算以手动方式成功搭建了一个 Redis 集群。