1. 程式人生 > >redis4.x 主從叢集

redis4.x 主從叢集

基於Redis版本: redis-4.0.11

上一篇部落格介紹了redis主從,實際專案中,即使redis有了主從複製,但是每個redis資料庫都要儲存整個叢集中的所有資料,這樣容易形成木桶效應。而redis叢集架構可以有效的解決木桶效應。

一:準備Redis節點

// 解壓、命名、編譯安裝

tar -zxvf redis-4.0.11.tar.gz    #解壓
mv redis-4.0.11 redis            #命名
cd redis && make                 #編譯安裝

// 把安裝好的 Redis 的 src 路徑下的執行指令碼拷貝到根目錄 

cp src/redis-server ./    
cp src/redis-cli ./

// 由於叢集需要6個節點(3主3從模式),複製六份redis例項

cp -r redis 6379
cp -r redis 6380
cp -r redis 6381
cp -r redis 6382
cp -r redis 6383
cp -r redis 6384

// 修改6個節點的配置檔案

二:安裝ruby環境

由於 Redis 叢集需要使用 ruby 命令,所以我們需要安裝 ruby

yum -y install zlib ruby rubygems   
gem install redis                

若執行 gem install redis 時報錯(不報錯的童鞋直接忽略)

我用的是Centos7,Centos預設支援ruby到2.0.0,因此需要升級ruby版本

依次執行下面命令

sudo yum install curl   #安裝curl

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import  #安裝RVM
curl -L get.rvm.io | bash -s stable    

source /usr/local/rvm/scripts/rvm   #編譯

rvm list known   #檢視rvm庫中已知的ruby版本

rvm install 2.5.1   #安裝一個高於2.0.0的 ruby版本

rvm use 2.5.1   #使用2.5.1版本的ruby

ruby --version   #檢視ruby版本號

gem install redis  #執行安裝

三:建立redis叢集

啟動所有redis節點

建立叢集命令 redis-trib.rb

注意這裡不能使用127.0.0.1,否則在Jedis客戶端使用時無法連線到!

redis/src/redis-trib.rb create --replicas 1 192.168.1.212:6379 192.168.1.212:6380 192.168.1.212:6381 192.168.1.212:6382 192.168.1.212:6383 192.168.1.212:6384

--replicas 1 :表示主從複製比例為 1:1,即一個主節點對應一個從節點,redis有16383的slot(插槽),slot預設將slot平均分配給三個主節點。

檢視叢集狀態和節點資訊

cluster info

cluster nodes

四:測試

什麼情況??(error) MOVED 7638 192.168.1.212:6380  

因為當key為abc的時候,redis通過演算法得出該key對應的插槽資訊是在6380上,現在使用redis-cli連線的6379,無法完成set操作,需要客戶端跟蹤重定向。

使用 -c引數連線redis,進行操作

五:插槽(slot)

插槽的分配

整個Redis提供了16384個插槽,也就是說叢集中的每個節點分得的插槽數總和為16384。

./redis-trib.rb 指令碼實現了是將16384個插槽平均分配給了N個節點。

當我們執行set abc 123命令時,redis是如何將資料儲存到叢集中的呢?執行步驟:

1:接收命令set abc 123

2:通過key(abc)計算出插槽值,然後根據插槽值找到對應的節點。(abc的插槽值為:7638)

3:重定向到擁有7638插槽的節點執行命令

插槽和key的關係:

通過key的有效部分使用CRC16演算法計算出雜湊值,再將雜湊值對16384取餘,得到插槽值
 

六:向叢集中新增節點

tip:確保新增的redis例項沒有儲存過資料

>> 新增master節點

cp -r redis 6385            #複製一個節點
vim 6385/redis.conf         #修改配置檔案

啟動6385

6385/redis-server 6385/redis.conf 

 使用 redis-trib.rb,新增節點

語法  ./redis-trib.rb  add-node  new_host:new_port existing_host:existing_port

redis/src/redis-trib.rb add-node 192.168.1.212:6385 192.168.1.212:6379

add-node是加入叢集節點,192.168.1.212:6385 為要加入的節點,192.168.1.212:6379  表示加入的叢集的一個節點,用來辨識是哪個叢集,理論上那個叢集的節點都可以。 

已經新增成功!檢視叢集資訊:

發現沒有插槽數。

使用  redis-trib.rb 命令從 其他三個節點中轉移1000個插槽到 6385

1:輸入下列命令,進行相關操作

redis/src/redis-trib.rb reshard 192.168.1.212:6379  #連線叢集中任意一個節點

2:需要移動多少個插槽,輸入1000

3:填寫需要接收插槽的ID,輸入 6385 的節點ID

4:all:從所有的master節點平均取, done:從某一個master節點中取插槽,最後用done結束,輸入all

5:確認分配插槽,輸入yes

插槽分配完成,檢視節點資訊: 

>> 新增slave節點

cp -r redis 6386            #複製一個節點
vim 6385/redis.conf         #修改配置檔案

6386/redis-server 6386/redis.conf   #啟動 6386 例項
#將 6386 新增為 6385的從節點
redis/src/redis-trib.rb  add-node --slave 192.168.1.212:6386 192.168.1.212:6385

檢視叢集節點資訊

七:刪除節點

>> 刪除slave節點

在從節點中,我們沒有分配雜湊槽,所以刪除很簡單,直接執行命令即可

./redis-trib.rb del-node  ip:port  節點ID

#刪除6386節點
redis/src/redis-trib.rb  del-node 192.168.1.212:6383 221d76f96c95cc0af7be30f08e0490013c79023b

>> 刪除master節點

因為在主節點中存放著資料,所以我們在刪除之前,要把這些資料遷移走,並且把該節點上的雜湊槽分配到其他主節點上

redis/src/redis-trib.rb reshard 192.168.1.212:6385

2:需要移動多少個插槽,輸入1000

3:填寫需要接收插槽的ID,輸入 6379 的節點ID

4:輸入要刪除的節點ID

5:確認轉移插槽 

 

檢視叢集節點資訊

 6:刪除6385節點

redis/src/redis-trib.rb del-node 192.168.1.212:6385 0d4d77571bb0dc7dc551b798891f0b4dc78d4682