redis集羣搭建

51的內容長度限制,這裏繼續 redis cluster 的簡單使用和維護。

  

7,下面簡單測試一下 cluster
   
7.1 測試數據分佈

  

使用 redis-cli 來測試 cluster shard,可以看到 foo->bar 被存儲到了 7002 節點上,並且自動跳轉到了 7002 上,然後 7002 上 hello-world 是存儲在 7000 上,再次重定向到 7000 節點上了。
  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# -c 選項爲進入 cluster mode

$ redis-cli -c -p 7000

127.0.0.1:7000> set foo bar

-> Redirected to slot [12182] located at 127.0.0.1:7002

OK

127.0.0.1:7002> set hello world

-> Redirected to slot [866] located at 127.0.0.1:7000

OK

127.0.0.1:7000> get foo

-> Redirected to slot [12182] located at 127.0.0.1:7002

"bar"

127.0.0.1:7002> get hello

-> Redirected to slot [866] located at 127.0.0.1:7000

"world"

127.0.0.1:7000>

  
7.2 reshard

  

重新分佈,這裏測試reshard 1000 個 slots 到 7000 節點的情形:
  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

$ ./redis-trib.rb reshard 127.0.0.1:7000

... ...

# 需要遷移的 slots 數目

How many slots do you want to move (from 1 to 16384)? 1000

# 接收這 1000 個 slots 的節點,這裏必須填寫爲 NodeID

What is the receiving node ID? 123ed65d59ff22370f2f09546f410d31207789f6

# 這裏需要設置從哪些 源節點 中選擇 slots,這裏 all 表示從所有節點中選擇

Please enter all the source node IDs.

  Type 'all' to use all the nodes as source nodes for the hash slots.

  Type 'done' once you entered all the source nodes IDs.

Source node #1: all

# 下面列出了 Source nodes 以及 Destination node(即 7000 節點)

Ready to move 1000 slots.

  Source nodes:

    M: 82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 127.0.0.1:7001

   slots:5962-10922 (4961 slots) master

   1 additional replica(s)

    M: f5bdda1518cd3826100a30f5953ed82a5861ed48 127.0.0.1:7002

   slots:11422-16383 (4962 slots) master

   1 additional replica(s)

  Destination node:

    M: 123ed65d59ff22370f2f09546f410d31207789f6 127.0.0.1:7000

   slots:0-5961,10923-11421 (6461 slots) master

   1 additional replica(s)

    

# 下面爲 redis-trib 列出的 reshard 的 slot 規劃:

  Resharding plan:

    Moving slot 11422 from f5bdda1518cd3826100a30f5953ed82a5861ed48

    Moving slot 11423 from f5bdda1518cd3826100a30f5953ed82a5861ed48

    Moving slot 11424 from f5bdda1518cd3826100a30f5953ed82a5861ed48

# 如果接收 redis-trib 的 slot reshard plan,則錄入 yes

Do you want to proceed with the proposed reshard plan (yes/noyes

# 開始執行 resharding

Moving slot 11422 from 127.0.0.1:7002 to 127.0.0.1:7000: 

Moving slot 11423 from 127.0.0.1:7002 to 127.0.0.1:7000: 

Moving slot 11424 from 127.0.0.1:7002 to 127.0.0.1:7000:

# 下面我們校驗一下,確認 resharding OK

$ ./redis-trib.rb check 127.0.0.1:7000

>>> Performing Cluster Check (using node 127.0.0.1:7000)

M: 123ed65d59ff22370f2f09546f410d31207789f6 127.0.0.1:7000

   slots:0-6460,10923-11922 (7461 slots) master

   1 additional replica(s)

    
7.3 failover 測試(這裏沒有做一致性檢查,只是看一下是否 master-slave 做了切換)

  
  首先通過 debug segfault 命令停止了 7002 節點(從上面的運行日誌中,可以看到該節點爲 master 節點)

  

1

2

3

4

5

6

7

8

9

10

  $ redis-cli -p 7002 debug segfault

  Error: Server closed the connection

   

  # 下面爲 7002 節點的日誌

=== REDIS BUG REPORT END. Make sure to include from START to END. ===

       Please report the crash opening an issue on github:

           http://github.com/antirez/redis/issues

  Suspect RAM error? Use redis-server --test-memory to verify it.

Segmentation fault

$

   
   然後從 cluster nodes 命令輸出可以看到 7002 節點 fail,同時它的 slave 7005 節點升級爲了 master 節點

  

1

2

3

4

5

6

7

8

127.0.0.1:7000> cluster nodes

35e0f6fdadbf81a00a1d6d1843698613e653867b 127.0.0.1:7003 slave 123ed65d59ff22370f2f09546f410d31207789f6 0 1410838367042 7 connected

61dfb1055760d5dcf6519e35435d60dc5b207940 127.0.0.1:7004 slave 82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 0 1410838368047 5 connected

82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 127.0.0.1:7001 master - 0 1410838368547 2 connected 6461-10922

123ed65d59ff22370f2f09546f410d31207789f6 127.0.0.1:7000 myself,master - 0 0 7 connected 0-6460 10923-11922

bfc910f924d772fe03d9fe6a19aabd73d5730d26 127.0.0.1:7005 master - 0 1410838366541 8 connected 11923-16383

f5bdda1518cd3826100a30f5953ed82a5861ed48 127.0.0.1:7002 master,fail - 1410838288398 1410838286795 3 disconnected

127.0.0.1:7000>

  
   把 7002 節點再次啓動後,7002 節點自動成爲了 7005 節點的 slave 節點

  

1

2

3

4

5

6

7

8

127.0.0.1:7000> cluster nodes

35e0f6fdadbf81a00a1d6d1843698613e653867b 127.0.0.1:7003 slave 123ed65d59ff22370f2f09546f410d31207789f6 0 1410838468336 7 connected

61dfb1055760d5dcf6519e35435d60dc5b207940 127.0.0.1:7004 slave 82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 0 1410838468336 5 connected

82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 127.0.0.1:7001 master - 0 1410838468837 2 connected 6461-10922

123ed65d59ff22370f2f09546f410d31207789f6 127.0.0.1:7000 myself,master - 0 0 7 connected 0-6460 10923-11922

bfc910f924d772fe03d9fe6a19aabd73d5730d26 127.0.0.1:7005 master - 0 1410838467334 8 connected 11923-16383

f5bdda1518cd3826100a30f5953ed82a5861ed48 127.0.0.1:7002 slave bfc910f924d772fe03d9fe6a19aabd73d5730d26 0 1410838469337 8 connected

127.0.0.1:7000>

  
7.4 新增節點
  
  7.4.1 新增 master 節點
  
  默認是新增一個 master 節點,同樣的,這裏測試是先新增 7006/ 目錄,再編輯 redis.conf 配置文件

  
  在 7006 目錄下啓動 7006 節點 redis-server redis.conf

  
  下面通過 redis-trib 工具在當前的 cluster 中新增 7006 節點
  

1

2

3

4

5

6

7

8

9

  $ ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

  >>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000

  ...

  >>> Performing Cluster Check (using node 127.0.0.1:7000)

  ...

  Connecting to node 127.0.0.1:7006: OK

  // 這裏發送 CLUSTER MEET 命令給 7006 節點,要求其加入 cluster

  >>> Send CLUSTER MEET to node 127.0.0.1:7006 to make it join the cluster.

  [OK] New node added correctly.

  
  此時,7006 節點已經加入 cluster,可以接收客戶端的指令,並執行 redirection
  
  7.4.2 新增 slave 節點
  
  有兩種方式來添加 slave 節點:
  
  1) 通過 --slave 選項添加 slave 節點,這裏以新增的 7007 節點作爲 7005(當前已經爲master節點)的 slave 節點爲例
    

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

$ ./redis-trib.rb add-node --slave --master-id bfc910f924d772fe03d9fe6a19aabd73d5730d26 127.0.0.1:7007 127.0.0.1:7000

>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7000

Connecting to node 127.0.0.1:7000: OK

... ...

>>> Performing Cluster Check (using node 127.0.0.1:7000)

S: 35e0f6fdadbf81a00a1d6d1843698613e653867b 127.0.0.1:7003

   slots: (0 slots) slave

   replicates 123ed65d59ff22370f2f09546f410d31207789f6

M: bfc910f924d772fe03d9fe6a19aabd73d5730d26 127.0.0.1:7005

   slots:11923-16383 (4461 slots) master

   1 additional replica(s)

... ...

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

// 將 7007 加入 cluster,並配置爲 7005 的 slave 節點

Connecting to node 127.0.0.1:7007: OK

>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster.

Waiting for the cluster to join.

>>> Configure node as replica of 127.0.0.1:7005.

[OK] New node added correctly.

[root@sasd redis-cluster]

     

127.0.0.1:7000> cluster nodes

8868592d98d84b7cf5752cc0b97af4ac807d1a12 127.0.0.1:7007 slave bfc910f924d772fe03d9fe6a19aabd73d5730d26 0 1410844154906 8 connected

6d1ebedad33bb31ffbaa99bad095eef4a5920857 127.0.0.1:7006 master - 0 1410844155909 0 connected

35e0f6fdadbf81a00a1d6d1843698613e653867b 127.0.0.1:7003 slave 123ed65d59ff22370f2f09546f410d31207789f6 0 1410844154405 7 connected

61dfb1055760d5dcf6519e35435d60dc5b207940 127.0.0.1:7004 slave 82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 0 1410844153905 5 connected

82578e8ec9747e46cbb4b8cc2484c71b9b2c91f4 127.0.0.1:7001 master - 0 1410844153905 2 connected 6461-10922

123ed65d59ff22370f2f09546f410d31207789f6 127.0.0.1:7000 myself,master - 0 0 7 connected 0-6460 10923-11922

bfc910f924d772fe03d9fe6a19aabd73d5730d26 127.0.0.1:7005 master - 0 1410844155408 8 connected 11923-16383

f5bdda1518cd3826100a30f5953ed82a5861ed48 127.0.0.1:7002 slave bfc910f924d772fe03d9fe6a19aabd73d5730d26 0 1410844154406 8 connected

127.0.0.1:7000>

    
  2) 通過 cluster replicate 命令來添加 slave 節點,如下:
  

1

2

# 將 7007 節點添加爲 NodeID=bfc910f924d772fe03d9fe6a19aabd73d5730d26 的 slave 節點

127.0.0.1:7007> cluster replicate bfc910f924d772fe03d9fe6a19aabd73d5730d26

---------

7.4 刪除節點

  7.4.1 刪除 slave 節點
  
  對於刪除 slave 節點,可以直接使用 redis-trib 的 del-node 命令來刪除,如:
 

1

./redis-trib del-node 127.0.0.1:7000 <node-id>

  
  node-id 爲待刪除的slave節點的 NodeID。
  
  7.4.2 刪除 master 節點
  
  也可以使用 del-node 命令來刪除 master 節點,但是必須爲空,因此需要在刪除 master 節點之前先通過 reshard 將數據遷移至其他的 master 節點上。
  當然也可以使用上面的 CLUSTER FAILOVER 命令來刪除 master 節點,並選擇一個 slave 作爲新的 master 節點。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章