redis6.x 集羣

基於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                
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

我用的是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  #執行安裝
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

三:創建redis集羣

啓動所有redis節點

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

創建集羣命令 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
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

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

 

查看集羣狀態和節點信息

cluster info

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

cluster nodes

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

四:測試

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

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

使用 -c參數連接redis,進行操作

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

五:插槽(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         #修改配置文件
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

啓動6385

6385/redis-server 6385/redis.conf 
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 使用 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
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

已經添加成功!查看集羣信息:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

發現沒有插槽數。

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

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

redis/src/redis-trib.rb reshard 192.168.1.212:6379  #連接集羣中任意一個節點
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

插槽分配完成,查看節點信息: 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

>> 新增slave節點

cp -r redis 6386            #複製一個節點
vim 6385/redis.conf         #修改配置文件
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

6386/redis-server 6386/redis.conf   #啓動 6386 實例
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
#將 6386 添加爲 6385的從節點
redis/src/redis-trib.rb  add-node --slave 192.168.1.212:6386 192.168.1.212:6385
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

查看集羣節點信息

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

七:刪除節點

>> 刪除slave節點

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

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

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

>> 刪除master節點

因爲在主節點中存放着數據,所以我們在刪除之前,要把這些數據遷移走,並且把該節點上的哈希槽分配到其他主節點上

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

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

4:輸入要刪除的節點ID

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

5:確認轉移插槽 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

查看集羣節點信息

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 6:刪除6385節點

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

上一篇:redis4.x 主從複製

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章