redisクラスタクライアント実装における注意点

3613 ワード

テストの過程で、私はredisクラスタを構築して、redisクラスタのクライアントを実現することを試みて、もしredisの公式の標準を達成する必要があるならば、ASKエラーの処理を満たす必要があります.私が構築したredisクラスタは以下のように配置されています(ipは変更されました):
メインノード:1.1.1.1 7000 1 b 220196 cbf 1 b 2 d 870366 d 05097 c 1 a 56 ff 096479 0-5460
メインノード:1.1.1.1 7001 6516 f 46 a 15 a 2745 dd 16 e 12 b 608 f 2402 bdedf 384 e 5461-1092
プライマリノード:1.1.1.2 7000 e 2354 ceeaf 53451 c 932 f 6536 d 27 a 39 e 1 be 1090 da 10923-16383
ノード:1.1.1.2 7001->1.1.1.1 7000 5 ff 7670 b 43 c 0067 fa 54 ab 32 d 5 ce 4 fad 4 c 103 cf 4 c
ノード:1.1.1.3 7000->1.1.1.1 7001 fdc 657 db 984 ee 6 e 00 ede 607413 ede 3458 c 1 c 45 a 2
ノード:1.1.1.3 7001->1.1.1.2 7000 35 fff 3049164196580 b 4398 c 6 cca 6 a 0398 ca 99 bb
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.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のバグなのか、それとも特殊な処理が必要なのか、まずこれをここに記入します.