前述:redis主要有集羣、主從複製、哨兵、分片幾種策略,而本文主要講解如何搭建分佈式redis集羣。
一 、所需軟件:Redis、Ruby語言運行環境、Redis的Ruby驅動redis-xxxx.gem、創建Redis集羣的工具redis-trib.rb
二、redis安裝配置
1、下載安裝配置可看上一篇博文:Windows -- Redis安裝與配置(單機版)
要讓集羣正常運作至少需要3個主節點,建議配置3個主節點,其餘3個作爲各個主節點的從節點(也是官網推薦的模式)。
所以需要6臺虛擬機。
主節點崩潰,從節點的Redis就會提升爲主節點,代替原來的主節點工作,崩潰的主Redis恢復工作後,會再成爲從節點。
2、創建redis集羣目錄
把redis解壓後,再複製五份,配置三主三從集羣。由於redis默認端口爲6379,那麼其他五個的端口可以設置爲6380、6381、6382、6383、6384,並且使用端口號爲各自目錄命名。
3、修改配置文件
打開每個Redis目錄下的文件 redis.windows.conf,修改裏面的端口號分別對應相對應的文件夾名:6379、6380、6381、6382、6383、6384;再修改集羣支持配置,將配置前面的#去掉,修改以下配置:
port 6379
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
cluster-config-file nodes-6379.conf 是爲該節點的配置信息,這裏使用 nodes-端口.conf命名方法。服務啓動後會在目錄生成該文件
4、 編寫啓動腳本,或者進入每個端口命名的文件夾下啓動服務
編寫一個 bat 來啓動 redis,在每個節點目錄下建立 startup.bat,內容如下:
title redis-6379
redis-server.exe redis.windows.conf
title命名規則 redis-相對應的端口。
三、Ruby安裝
redis的集羣使用 ruby腳本編寫,所以系統需要有 Ruby 環境 ,下載地址:https://rubyinstaller.org/downloads/
四、安裝Redis的Ruby驅動redis-xxxx.gem
下載地址:https://rubygems.org/pages/download
下載後解壓到redis集羣目錄下,使用cmd切換到解壓目錄中,執行以下命令:
ruby setup.rb
再用 GEM 安裝 Redis :切換到redis安裝目錄,需要在命令行中,執行以下命令:
gem install redis
五、安裝集羣腳本redis-trib.rb
下載地址:https://github.com/beebol/redis-trib.rb
下載解壓後,將redis-trib.rb保存在其中一個redis目錄下(不用每個都放),例如保存到6379目錄下
redis-trib.rb集羣的命令爲 :
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
--replicas 1 表示每個主數據庫擁有從數據庫個數爲1。master節點不能少於3個,所以我們用了6個redis
備註:有朋友反應上面的語句執行不成功。可以在前面加上ruby再運行。
ruby redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
六、啓動每個節點並且執行集羣構建腳本
雙擊啓動每個節點下的 startup.bat, 再切換到redis目錄在命令行中執行 集羣構建腳本:redis-trib.rb create --replicas 1
127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
這個命令只需輸入一次就好了,之後節點關閉,重啓就不需要再執行了
在出現 Can I set the above configuration? (type 'yes' to accept): 請確定並輸入 yes 。成功後的結果如下:
七、連接集羣進行測試
使用Redis客戶端Redis-cli.exe來查看數據記錄數,以及集羣相關信息
命令 redis-cli –c –h 地址 –p 端口號; c 表示集羣
如果此前有設置密碼的話,記得輸入密碼驗證,不然會報錯NOAUTH Authentication required
查詢記錄總數,命令:dbsize
查看集羣的信息,命令:cluster info
查看主從關係,命令: info replication
查看各個節點分配slot,命令 cluster nodes
可以看到有3個master,3個slave,以及可以看到master各自的slot分佈情況
存幾個值,看下分佈情況:
以6382節點爲例,管理的slots範圍爲0-5460,在6379中設置key爲test1的slot爲4768,在6382的卡槽範圍0-5460,所以客戶端也跳轉到了6382。在6382中設置key爲test2的slot爲8899,在6380的卡槽範圍5461-10922,所以客戶端又跳轉到了6380。
Redis集羣數據分配策略:
採用一種叫做哈希槽 (hash slot)的方式來分配數據,redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然後將這個key分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384
注意的是:必須要3個以上的主節點,否則在創建集羣時會失敗,三個節點分別承擔的slot 區間是:
節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383;
八、配置過程中遇到的問題
1、注意:如果出現 redis-trib.rb is not longer available! 如果redis版本是5.0以上,則使用如下命令:
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
原因是redis5.0以上不再需要redis-trib.rb了,而是使用自帶的redis-cli作爲創建集羣的命令了。
如果不是,那麼將redis-trib.rb改爲老版本就可以了。
2、使用redis-trib.rb創建帶密碼的集羣問題
設定集羣密碼,各個節點的配置中設定密碼,注意集羣模式下,下面兩行都需要
masterauth passwd123
requirepass passwd123
各個節點的配置中開啓集羣配置的相關選項,如下:
port 端口
cluster-enabled yes
cluster-config-file nodes-端口.conf
cluster-node-timeout 15000
appendonly yes
如果Redis設定了密碼,那麼通過redis-trib.rb腳本創建集羣時,是會類似這樣的錯誤的:[ERR] Sorry, can’t connect to node *.*.*.*:6379
這是因爲redis-trib.rb腳本中連接Redis時,並未設定密碼,這確實是個很大的坑。我的解決方法時,修改該腳本中連接Redis時的代碼,修改內容如下:
找到redis-trib.rb下的這一行:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60)
修改爲:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "123456")
修改過配置文件後,記得重啓服務。
其他博文參考:https://blog.csdn.net/weixin_41846320/article/details/83654766