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