1. 程式人生 > >redis-cluser叢集搭建及使用

redis-cluser叢集搭建及使用

    近段時間一直在研究redis-cluser叢集模式,準備將原有的sentinel模式替換掉。但是遲遲沒能落實,一來是現有叢集模式尚能滿足現有應用,怕變更後不穩定固不願輕易改動;二是對redis-cluster的研究還不是很深入,還需要時間。redis-cluster叢集模式自己也有搭建過好幾次了,但都只是簡單的搭建完,簡單的對幾種資料型別進行了讀寫操作就完事了。沒有進行過動態增刪節點,重新分片等高階特性的研究,固今天就來實際操作下,探探究竟。

redis-cluster叢集模式的優點:

  • 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

  • 節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

  • 客戶端與redis節點直連,不需要中間proxy.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即

  • redis-cluster把所有的物理節點對映到[0-16383]slot,cluster負責維護node -> slot -> key

不足:

  • 無中心化架構

  • Gossip訊息的開銷

  • 不停機升級困難

  • 無法根據統計區分冷熱資料

  • 客戶端的挑戰

  • Cluster協議支援

  • 連線和路由表的維護開銷

  • MultiOpPipeline支援有限

  • Redis的實現問題

  • 不能自動發現

  • 不能自動Resharding

  • 無監控管理UI

  • 最終一致性和腦裂問題

  • 資料遷移以Key為單位,速度較慢

  • 資料遷移沒有儲存進度,故障時不能恢復

  • Slave“冷備,不能緩解讀壓力

實踐開始,本次實踐是在centos6環境下完成的。

一、安裝redis服務

redis官網下載redis安裝包:

解壓:

tar-zxvf redis-stable.tar.gz -C /opt/

安裝:

makePREFIX=/usr/local/redis install MALLOC=libc

安裝完之後複製redis解壓包下src/redis-trib.rb檔案到安裝目錄/usr/local/redis/bin/

,後續建立叢集的時候用的著.這是官方提供的一個用ruby語言編寫的用於建立redis叢集的工具

命令:cp /opt/redis-stable/src/redis-trib.rb/usr/local/redis-stable/bin/

二、安裝叢集基礎依賴

1、安裝zlib類庫

命令:yum -y install zlib

2、安裝ruby環境

命令:yum -y install ruby rubygems (圖片命令少rubygems了一個s)

3、安裝ruby環境的redis

命令:gem install redis

三、建立redis例項

建立例項目錄:

命令:mkdir -p/usr/local/redis-cluster/redis{7001,7002,7003,7004,7005,7006,7007,7008}

複製redis.conf配置檔案到例項目錄:

命令:for dir in /usr/local/redis-cluster/redis700*; do cp -v /opt/redis-stable/redis.conf $dir ; done

修改相關配置引數:

命令:

fordir in /usr/local/redis-cluster/redis700*; do

myport=`basename$dir|sed 's/[a-zA-Z]*//g'`

sed-r -i "

"$dir/redis.conf

done

啟動所有例項:

命令:

fordir in /usr/local/redis-cluster/redis700*; do /usr/local/redis-stable/bin/redis-server$dir/redis.conf ; done

檢視例項是否都已啟動:

命令:ps -ef|grep redis

通過redis-trib.rb指令碼建立叢集:

命令:

./redis-trib.rb create --replicas 1 192.168.253.252:7001 192.168.253.252:7002 192.168.253.252:7003192.168.253.252:7004 192.168.253.252:7005 192.168.253.252:7006

--replicas 1:表示為每個主節點建立一個從節點

至此, redis的叢集環境已經搭建完成了,我們可以看一下節點情況:

命令:/usr/local/redis-stable/bin/redis-cli -h 192.168.253.252 -p 7002 clusternodes

四、新增節點

新增節點有兩種情況:新增主節點及從節點

1、新增主節點

命令:./ redis-trib.rb add-node192.168.253.252:7007 192.168.253.252:7001

可以看到.使用addnode命令來新增節點,第一個引數是新節點的地址,第二個引數是任意一個已經存在的節點的IP和埠.

2、新增從節點

有兩種方法新增從節點,可以像新增主節點一樣使用redis-trib命令,也可以像下面的例子一樣使用slave選項:

命令:./ redis-trib.rb add-node --slave192.168.253.252:7008 192.168.253.252:7001

此處的命令和新增一個主節點命令類似,此處並沒有指定新增的這個從節點的主節點,這種情況下系統會在其他的複製集中的主節點中隨機選取一個作為這個從節點的主節點。

你可以通過下面的命令指定主節點:

命令:./redis-trib.rb add-node --slave --master-id 6eb5af25d9ef38c3773f25a9ac4522b6d0a8d5d1192.168.253.252:7008 192.168.253.252:7001

也可以使用CLUSTER REPLICATE命令新增.這個命令也可以改變一個從節點的主節點。

例如,要給主節點192.168.253.252:7007 新增一個從節點,該節點雜湊槽的範圍1423-16383,節點 ID3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我們需要連結新的節點(已經是空的主節點)並執行命令:

redis192.168.253.252:7008>cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

五、刪除節點

只要使用 del-node命令即可:

./redis-trib del-node192.168.253.252:7001 `<node-id>`

第一個引數是任意一個節點的地址,第二個節點是你想要移除的節點地址。

使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的.如果不是空的,需要將這個節點的資料重新分片到其他主節點上.

替代移除主節點的方法是手動執行故障恢復,被移除的主節點會作為一個從節點存在,不過這種情況下不會減少叢集節點的數量,也需要重新分片資料.

六、重新分片

剛才新增的節點,由於還沒有分配到雜湊槽,故還是空的。分配雜湊槽需重新對叢集進行分片。

現在,讓我們來試試對叢集進行重新分片操作。重新分片並不會對正在執行的叢集程式產生任何影響,重新分片也可以使用 redis-trib程式來執行執行以下命令可以開始一次重新分片操作:

./redis-trib.rb reshard192.168.253.252:7001

你只需要指定叢集中其中一個節點的地址, redis-trib就會自動找到叢集中的其他節點。

目前 redis-trib只能在管理員的協助下完成重新分片的工作,要讓 redis-trib自動將雜湊槽從一個節點移動到另一個節點,目前來說還做不到

你想移動多少個槽(1 16384)?

我們嘗試從將4096個槽重新分片,除了移動的雜湊槽數量之外, redis-trib還需要知道重新分片的目標,也即是,負責接收這4096個雜湊槽的節點

如果當前環境下只想移動某個節點的雜湊槽,也可以採用非互動自動的進行遷移, 如:

./redis-trib.rb  reshard --from 6eb5af25d9ef38c3773f25a9ac4522b6d0a8d5d1 --to 2eacfc66b8293a50fa75b12ef6f94c9ea64a7f35 --slots 100 --yes 192.168.253.252:7001

--from 6eb5af25d9ef38c3773f25a9ac4522b6d0a8d5d1//表示從哪個節點進行遷移,即源節點  注:必須是主節點 

--to 2eacfc66b8293a50fa75b12ef6f94c9ea64a7f35 //遷移到哪個節點,即目標節點

--slots 100 //遷移多少槽位

--yes //無需輸入yes確認


在重新分片結束後你可以通過如下命令檢查叢集狀態:

./redis-trib.rb check 192.168.253.252:7001

參考文獻: