高性能网站架构设计之缓存篇(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 集群。
轉載于:https://www.cnblogs.com/zhousongsky/p/6639393.html
總結
以上是生活随笔為你收集整理的高性能网站架构设计之缓存篇(6)- Redis 集群(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel框架总结(一) -- 请求
- 下一篇: jQuery获取input复选框的值