1. 程式人生 > >高效能網站架構設計之快取篇(6)- Redis 叢集(中)

高效能網站架構設計之快取篇(6)- Redis 叢集(中)

昨天晚上釣魚回來,大發神經,寫了篇概括程式設計師生活現狀的文章,沒想到招來眾多人的口誅筆伐,大有上升到政治層面的趨勢。

我也許不會再發表任何衝擊心靈的文章,我希望給大家帶來更多的正能量,所以那篇文章已被我刪除。

我的本意只是想讓各位看過文章之後能冷靜地思考自己的程式人生,不管是對是錯,人都有選擇的權力,走好自己的路。

我沒有你們想象中那麼悲觀,我也在不懈的努力,哪怕一時的跌倒,我也要重新站起。

生活無時無刻不是壓力,讓我們背起行囊,邁出踏實的一步,走起!

我們繼續我們的 redis 快取之旅。

前一篇我們實現了一個簡單的 redis 叢集,redis 也為了讓我們方便的維護叢集提供了非常好的工具。

首先請大家參照我的上一篇文章,把叢集環境搭建起來。

OK,我用了分分鐘的時間已經搭建好了。

[OK] All 16384 slots covered.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> get testkey001

-> Redirected to slot [12786] located at 127.0.0.1:9003

(nil)

127.0.0.1:9003> 

如何增加節點:

首先我們建立一個叫做 9004 的目錄:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9004

zhaoguihuadediannao:redis-cluster zhaogh$ 

接著我們將 9001 目錄下的 redis-server 、 redis.conf 兩個檔案拷貝到 9004 目錄:

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9004

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9004

然後我們開啟 redis.conf 檔案修改裡面的埠配置項,將其改為 9004 。

啟動 9004 例項:

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9004

zhaoguihuadediannao:9004 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9004 zhaogh$ 

想要把這個例項加入到叢集,我們只需要執行 redis-trib.rb 命令:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node 127.0.0.1:9004 127.0.0.1:9001

第一個引數是我們剛才啟動的新例項,第二個引數是叢集中已有的節點。

檢查一下新節點是否已經加入:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> cluster nodes

0e8f980bfe7a682e3d71b15523a41293535b8ccd :0 myself,master - 0 0 1 connected 0-5460

cbb01bdfdc265b190496956354d84aaae6e7d54d 127.0.0.1:9004 master - 0 1401952316346 0 connected

708e6e14474e3a99677b05ff89bd857375884437 127.0.0.1:9002 master - 0 1401952314325 2 connected 5461-10922

a7f9d3c64540cc3fc8cd3072e573bb8ab0bf1e6f 127.0.0.1:9003 master - 0 1401952315334 3 connected 10923-16383

127.0.0.1:9001> 

我們可以發現 9004 並不包含任何雜湊槽,因為它還沒有資料。

我們還可以為叢集中的主節點增加從節點用於只讀查詢。

如何增加從節點:

我們還是要建立目錄,拷貝那兩個檔案,修改配置,然後啟動例項:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9005

修改 port 為 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9005

zhaoguihuadediannao:9005 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9005 zhaogh$ 

執行下面的命令,增加從節點:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node --slave 127.0.0.1:9005 127.0.0.1:9001

第一個引數為從節點,第二個引數為主節點。

如何刪除一個節點:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 'cbb01bdfdc265b190496956354d84aaae6e7d54d'

這裡要注意一下,第一個引數是叢集中的任何一個主節點地址,而第二個引數是要刪除節點的 ID,這個ID如果你不知道的話,可以通過 cluster nodes 命令檢視。

還有一點就是要刪除的節點必須是空的,也就是不能快取任何資料,否則會刪除不成功。對於非空節點,在刪除之前需要重新分片,將快取的資料轉移到別的節點。

如何重新分片:

我們先給某個節點做點資料:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> set testkey001 testvalue001

-> Redirected to slot [12786] located at 127.0.0.1:9003

OK

127.0.0.1:9003> 

現在 9003 上已經有資料了,我們嘗試刪除一下:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

[ERR] Node 127.0.0.1:9003 is not empty! Reshard data away and try again.

zhaoguihuadediannao:src zhaogh$ 

沒有刪除成功,我們來重新分片,把 9003 上的資料轉移:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb reshard 127.0.0.1:9003

然後輸出了很多資訊,很多數值和ID都可以從這段資訊中找到。

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

會問你要移動多少個雜湊槽,我們把 9003 上的所有雜湊槽都移走,5461 這個數字可以從終端上看到,或許你的實際情況不是這個數字。

What is the receiving node ID? 4d2e0a8360795ce7ce8381c68746034aeba3c9b9

然後問你你要把這些雜湊槽移到哪兒去,我指定了 9001 的 節點 ID。

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:78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3

Source node #2:done

之後,redis 列出了重新分片計劃,最後問你

Do you want to proceed with the proposed reshard plan (yes/no)? yes

執行完成後,我們看看 9003 上還有沒有 key:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

127.0.0.1:9003> keys *

(empty list or set)

127.0.0.1:9003> 

再看看 9001 上是不是有這個 key 了

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9001

127.0.0.1:9001> keys *

1) "testkey001"

127.0.0.1:9001> 

沒錯,果然轉移過來了。

最後我們試試能不能把 9003 刪除:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Sending CLUSTER FORGET messages to the cluster...

>>> SHUTDOWN the node.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

Could not connect to Redis at 127.0.0.1:9003: Connection refused

not connected> 

非常好,it’s very good.

上篇文章說過,目前c#客戶端還不能很好的支援 redis 叢集,下一篇我將介紹如何使用代理來實現 redis 叢集。