基於Redis版本: redis-6.0.5
官網地址:https://redis.io/
上一篇博客介紹了redis主從,實際項目中,即使redis有了主從複製,但是每個redis數據庫都要保存整個集羣中的所有數據,這樣容易形成木桶效應。而redis集羣架構可以有效的解決木桶效應。
一:準備Redis節點
// 解壓、命名、編譯安裝
wget http://download.redis.io/releases/redis-6.0.5.tar.gz #下載
tar -zxvf redis-6.0.5.tar.gz #解壓
mv redis-6.0.5 redis #命名
cd redis && make #編譯安裝
make命令可能出現失敗:
錯誤一:cc:命令未找到
解決方案:yum install gcc
錯誤二:致命錯誤:jemalloc/jemalloc.h:沒有那個文件或目錄
解決方案:使用 make MALLOC=libc 命令代替 make
錯誤三:突然一大推錯誤和警告,報錯信息如下
解決方案:升級gcc版本到9.1,在執行編譯
# gcc -v # 查看gcc版本
# yum -y install centos-release-scl # 升級到9.1版本
# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# scl enable devtoolset-9 bash
// 把安裝好的 Redis 的 src 路徑下的運行腳本拷貝到根目錄
cp src/redis-server ./
cp src/redis-cli ./
// 修改redis的配置文件
vim redis/redis.conf,修改以下8處
# bind 120.0.0.1 # 註釋bind,支持其他ip訪問
port 6379 # 配置端口
daemonize yes # 支持後臺啓動
pidfile /var/run/redis_6379.pid # 指定pid文件
cluster-enabled yes # 支持redis-cluster
cluster-config-file nodes-6379.conf # 指定集羣配置文件
cluster-node-timeout 1500 # 連接超時時間
appendonly yes # 開啓AOF持久化機制
// 由於集羣需要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
//將6380、6381、6382、6383、6384的配置文件中的所有端口替換一致
例如將所有的6379改成6381: %s/6379/6381
點擊Enter鍵執行
二:安裝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
上一篇:redis4.x 主從複製