Windows -- Redis集羣搭建(redis-cluster)

前述: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

                        https://www.cnblogs.com/zhangrui153169/p/12837903.html

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