redis集群客户端实现中的注意事项

在测试的过程中,我尝试搭建一个redis集群,实现redis集群的客户端,如果需要达到redis官方的标准,需要满足处理ASK错误。我搭建的redis集群部署如下(ip进行了修改):

主节点: 1.1.1.1 7000      1b220196cbf1b2d870366d05097c1a56ff096479   0-5460

主节点: 1.1.1.1 7001       6516f46a15a2745dd16e12b608f2420bdedf384e  5461-10922

主节点: 1.1.1.2 7000      e2354ceeaf53451c932f6536d27a39e1be1090da   10923-16383

从节点:1.1.1.2 7001 -> 1.1.1.1 7000       5ff7670b43c0067fa54ab32d5ce4fad4c103cf4c     

从节点:1.1.1.3 7000 -> 1.1.1.1 7001       fdc657db984ee6e00ede607413ede3458c1c45a2

从节点:1.1.1.3 7001 -> 1.1.1.2 7000      35fff3049164196580b4398c6cca6a0398ca99bb

为了测试ASK错误,我打算把1.1.1.1 7000中的一个槽位2中的一个key: vgqpx,从主节点1.1.1.1 7000,移动到1.1.1.1 7001,

首先,我对节点1.1.1.1 7001调用

CLUSTER SETSLOT 2 IMPORTING 1b220196cbf1b2d870366d05097c1a56ff096479

然后对节点1.1.1.1 7000调用

CLUSTER SETSLOT 2 MIGRATING 6516f46a15a2745dd16e12b608f2420bdedf384e

然后对节点 1.1.1.1 7000调用

CLUSTER GETKEYSINSLOT 2 10

发现槽位中只有 vgqpx,然后将这个节点移动到 1.1.1.1 7001(还是对1.1.1.1 7000)调用:

MIGRATE 1.1.1.1 7001 vgqpx 0 10

操作到此为止。

这时候,查看cluster nodes和cluster slots,和预想的结果一致。但是,如果这时候,我们把1.1.1.1 7000 kill掉。会看到如何下的redis nodes信息:

1) 1) (integer) 0
   2) (integer) 1
   3) 1) "1.1.1.2"
      2) (integer) 7001
      3) "5ff7670b43c0067fa54ab32d5ce4fad4c103cf4c"
2) 1) (integer) 3
   2) (integer) 5460
   3) 1) "1.1.1.2"
      2) (integer) 7001
      3) "5ff7670b43c0067fa54ab32d5ce4fad4c103cf4c"
3) 1) (integer) 2
   2) (integer) 2
   3) 1) "1.1.1.1"
      2) (integer) 7000
      3) "1b220196cbf1b2d870366d05097c1a56ff096479"
4) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "1.1.1.1"
      2) (integer) 7001
      3) "6516f46a15a2745dd16e12b608f2420bdedf384e"
   4) 1) "1.1.1.3"
      2) (integer) 7000
      3) "fdc657db984ee6e00ede607413ede3458c1c45a2"
5) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "1.1.1.2"
      2) (integer) 7000
      3) "e2354ceeaf53451c932f6536d27a39e1be1090da"
   4) 1) "1.1.1.3"
      2) (integer) 7001
      3) "35fff3049164196580b4398c6cca6a0398ca99bb"

  然后,我们将1.1.1.1 7000重新启动,这个节点会自动加入集群。然后再重新调用cluster slots,结果如下:

1) 1) (integer) 0
   2) (integer) 1
   3) 1) "1.1.1.2"
      2) (integer) 7001
      3) "5ff7670b43c0067fa54ab32d5ce4fad4c103cf4c"
   4) 1) "1.1.1.1"
      2) (integer) 7000
      3) "1b220196cbf1b2d870366d05097c1a56ff096479"
2) 1) (integer) 3
   2) (integer) 5460
   3) 1) "1.1.1.2"
      2) (integer) 7001
      3) "5ff7670b43c0067fa54ab32d5ce4fad4c103cf4c"
   4) 1) "1.1.1.1"
      2) (integer) 7000
      3) "1b220196cbf1b2d870366d05097c1a56ff096479"
3) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "1.1.1.1"
      2) (integer) 7001
      3) "6516f46a15a2745dd16e12b608f2420bdedf384e"
   4) 1) "1.1.1.3"
      2) (integer) 7000
      3) "fdc657db984ee6e00ede607413ede3458c1c45a2"
4) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "1.1.1.2"
      2) (integer) 7000
      3) "e2354ceeaf53451c932f6536d27a39e1be1090da"
   4) 1) "1.1.1.3"
      2) (integer) 7001
      3) "35fff3049164196580b4398c6cca6a0398ca99bb"

  在这种情况下,cluster slots返回的槽位2的信息很奇怪,要么返回了已经断开连接的那个节点ip和port,要么,根本就不返回。对于这种特殊情况,我暂时不确定是否为redis的bug,还是我们需要特殊处理,先把这个记在这里。

 

你可能感兴趣的:(redis集群客户端实现中的注意事项)