1. 程式人生 > 其它 >Redis Cluster 簡單配置與動態擴容

Redis Cluster 簡單配置與動態擴容

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

Redis 3.0 就要自帶叢集功能了, 去看了一下這裡還有官方教程之後, 發現似乎必須用命令列來搞著, 而且官方提供的 redis-trib.rb 要求至少 3 個節點才能建立一個叢集, 這規格是向黨支部看齊麼...

至少 3 個節點這個還是略坑, 而且不能自動新增節點 (難道要我啟動個 py 的 subprocess 去掉 ruby?), 於是去看看原始碼, 驚訝地發現, 原來限制 3 個節點起步的是ruby 指令碼, 而且調叢集加節點平衡負載其實都可以用 redis 命令來完成. 好吧, 那我自己來連 socket 搞總行了吧.

結果一番折騰還真的可行的樣子, 於是有了這篇文章和一個簡單的工具. 那麼首先說說怎麼用 redis-cli 來做這些事情.

如何在 redis-cli 手動啟動叢集呢, 請隨意連上一個空的支援叢集模式的節點, 然後執行

cluster addslots 0 1 2 ... 16383

千萬不要誤會了, 中間那個 ... 可是要實打實地從頭寫到尾的哦. 所以如果可以的話, 手動寫個指令碼來幹這事情吧.

不過也可以略過這些步驟, 反正下面看看例子就行, 最後會給出一個 Python 工具來做這些.

接下來的例子中, 假定已經開好了一個叢集, 共有 3 個 master 節點. 要在控制檯檢視這些節點, 請用 redis-cli 隨意連上其中一個, 並執行

cluster nodes

輸出

e7f4fcc0dd003fc107333a4132a471ad306d5513 127.0.0.1:8001 master - 0 1414033928009 3 connected 0-2729 8192-10921
bd239f7dbeaba9541586a708484cdce0ca99aba5 127.0.0.1:8000 master - 0 1414033929011 2 connected 2730-8191
787e06e9d96e6a9a3d02c7f3ec14e243882293e9 127.0.0.1:7999 myself,master - 0 0 1 connected 10922-16383

以上每一行是一個節點資訊, 按空格分隔的域依次表示

  • 節點 ID
  • 節點地址
  • 節點角色 (master / slave), 如果是當前節點, 還會有個 myself
  • 對於 slave 而言, 其 master 節點的 ID
  • 最後一次 ping 時間戳
  • 最後一次 pong 時間戳
  • 節點順序號
  • 節點連線狀態
  • 之後的所有 : 節點所配給的槽位, 如果槽位連續, 就以 BEGIN-END 表示, 不連續的由空格隔開

如果要向叢集新增一個節點, 需要用 redis-cli 連上這個新節點, 呼叫一次 cluster meet 命令. 如

cluster meet 127.0.0.1 7999

後面引數是已經在叢集中的節點中任意一個節點的地址及埠. 然後再來一次

e7f4fcc0dd003fc107333a4132a471ad306d5513 127.0.0.1:8001 master - 0 1414034715486 3 connected 0-2729 8192-10921
bd239f7dbeaba9541586a708484cdce0ca99aba5 127.0.0.1:8000 master - 0 1414034714983 2 connected 2730-8191
787e06e9d96e6a9a3d02c7f3ec14e243882293e9 127.0.0.1:7999 master - 0 1414034714482 1 connected 10922-16383
a0fa298711f5da94cb8acc0ed913970f7b00c7af 127.0.0.1:8010 myself,master - 0 0 0 connected

就會發現這個節點已經加入叢集, 但是沒有被分配任何槽位. 現在得從原來幾個節點搬運一些過來. 在執行這個操作前, 為了測試, 先向叢集裡扔一個值進去

set "foo14308" "bar"

這個鍵對應的槽位是 7 號. 等會兒就嘗試將 7 號槽移動到新節點上.

第一步, 鎖定槽位. 這個操作需要分開進行. 首先用 redis-cli 連上新節點 (上述例子中埠 8010 的那個) 並執行

cluster setslot 7 importing e7f4fcc0dd003fc107333a4132a471ad306d5513

這表示即將從 ID 為 e7f4fcc0dd003fc107333a4132a471ad306d5513 的節點 (也就是 7 號槽位的所有者) 匯入 7 號槽.

接下來連上 7 號槽位的所有者所在的 8001 埠, 執行

cluster setslot 7 migrating a0fa298711f5da94cb8acc0ed913970f7b00c7af

再執行

cluster getkeysinslot 7 10

檢視 7 號槽位的全部鍵 (引數 7 表示槽位, 引數 10 表示數量). 這樣 redis 會回顯剛才放進去的 "foo14308".

現在開始手動遷移這些鍵. 在 8001 埠的客戶端上執行

migrate 127.0.0.1 8010 foo14308 0 15000

(最後兩個引數, 其實我也不知道什麼意思, 從官方程式碼裡抄過來的)

因為只有這一個鍵, 所以現在整個槽的遷移已經完成了, 需要告知整個叢集 7 號槽位已經被新節點承包了, 官方原始碼裡 這裡進行了廣播, 在命令列裡的話似乎需要逐個連線節點, 執行以下命令

cluster setslot 7 node a0fa298711f5da94cb8acc0ed913970f7b00c7af

搞完就好了.

轉載於:https://my.oschina.net/neuront/blog/336651