1. 程式人生 > 實用技巧 >redis叢集客戶端實現中的注意事項

redis叢集客戶端實現中的注意事項

在測試的過程中,我嘗試搭建一個redis叢集,實現redis叢集的客戶端,如果需要達到redis官方的標準,需要滿足處理ASK錯誤。我搭建的redis叢集部署如下(ip進行了修改):

主節點: 1.1.1.1 7000 1b220196cbf1b2d870366d05097c1a56ff096479 0-5460

主節點: 1.1.1.1 7001 6516f46a15a2745dd16e12b608f2420bdedf384e5461-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,還是我們需要特殊處理,先把這個記在這裡。