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

2022-06-06 05:51:07 字數 3381 閱讀 7713

在測試的過程中,我嘗試搭建乙個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,還是我們需要特殊處理,先把這個記在這裡。

C語言redis集群客戶端

原理 首先安裝hiredis,在此之前要確定安裝了gcc.單機版連線參考 根據之前的單機版實現,連線redis集群中任意例項,當像其中存入key時,會告訴你這個kay對應的槽和ip與埠。程式輸出 對應的槽 ip 埠 可以根據cluster keyslot key命令來驗證,圖中分別存入的是1,2,3...

Redis的Python客戶端redis py

1.安裝 1.redis py a.使用easy install sudo easy install redis b.原始碼安裝git clone cd redis py python setup.py install 2.parser安裝 parser可以控制如何解析redis響應的內容。redi...

Redis的Python客戶端redis py

1.redis py a.使用easy install 1 sudo easy install redis b.原始碼安裝 1 2 3 git clone cd redis py python setup.py install 2.parser安裝 parser可以控制如何解析redis響應的內容。...