大數據學習初級入門教程(六) —— Redis 3.x 僞分佈式集羣的安裝、配置、啓動和測試

在上一篇文章《大數據學習初級入門教程(二) —— Redis 3.x 單節點的安裝、啓動和測試》中,介紹瞭如何在工作需要時,臨時安裝一個單節點的 Redis 庫,便於進行測試。

這一篇主要說說如何搭建 Redis 僞分佈式集羣,就是說機器不夠的情況下,模擬搭建 Redis 集羣。

集羣搭建條件:

Redis 集羣至少需要 3 個節點;

每個集羣節點都需要有從節點,即備份節點,保證集羣的高可用性,所以還需要 3 個備份節點;

服務器需要安裝 ruby 環境。

集羣搭建環境:

服務器:

CentOS release 6.9 (Final) x64

Java 環境:

java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

Redis 版本:

redis-3.2.9.tar.gz

Ruby 版本:

ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

Gem 版本:

1.3.7

Redis 和 Ruby 的接口包:

redis-3.2.1.gem

開始僞分佈式集羣部署:

由於在上篇文章中,已經安裝了 Redis 單節點,所以這裏不再需要上傳安裝包、解壓、編譯、安裝等。

第一步,創建存放集羣環境的目錄文件夾。

第二步,複製已經安裝的 redis。

把 redis 目錄下 的 bin 目錄下的所有文件複製到 redis-cluster/redis01 目錄下,redis01 會自動創建。

命令:cp -R redis/bin/ redis-cluster/redis01

第三步,刪除原 redis 目錄下的數據文件 dump.rdb。

命令:rm -f redis-cluster/redis01/dump.rdb 

第四步,修改 redis.conf 配置文件。

命令:vi redis-cluster/redis01/redis.conf 

修改幾個地方,首先修改端口號,原來默認爲 6379,現修改爲 7000。

另外需要打開集羣創建模式,原來默認是註釋掉的,直接去掉註釋即可。

修改 pid 進程文件名,默認爲 redis_6379.pid,按照端口號修改爲 redis_7000.pid。

修改 log 文件名,默認爲空,按照端口號修改爲 redis_7000.log,注意如果沒有對應的文件夾,需要提前創建。

第五步,複製出其它 5 個模擬節點。

將 redis-cluster/redis01 文件夾複製 5 份,分別爲 redis02-redis06,都在目錄 redis-cluster 下,模擬 Redis 集羣的 6 個節點。並且需要將其餘 5 個文件夾下的 redis.conf 裏面的端口號分別修改爲7001-7005。

第六步,分別啓動 6 個節點。

如果啓動麻煩,可以寫個 shell 腳本。

命令:vi redis-cluster/startAllRedis.sh 

#! /bin/bash

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
echo "所有redis服務均已啓動,進程信息如下:"
ps -ef |grep redis

exit 0

保存後,需要賦予腳本執行權限。

命令:chmod +x redis-cluster/startAllRedis.sh 

運行腳本,啓動 redis 節點。

命令:cd redis-cluster/

sh startAllRedis.sh 

第七步,安裝 ruby 運行環境。

要搭建集羣的話,需要使用一個工具(腳本文件 redis-trib.rb),這個工具在 redis 解壓文件的源代碼裏。因爲這個工具是一個 ruby 腳本文件,所以這個工具的運行需要 ruby 的運行環境,所以需要安裝ruby。

命令:yum install ruby

第八步,拷貝集羣搭建的腳本文件。

拷貝第七步中提到的腳本文件,直接放到 redis-cluster 目錄下。

命令:cp ~/redis/redis-3.2.9/src/redis-trib.rb redis-cluster/

第九步,執行搭建集羣腳本,搭建集羣。

命令:cd redis-cluster/

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

有錯誤,錯誤信息如下:

./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
        from ./redis-trib.rb:24

是因爲缺少 rubygems 組件導致的,使用 yum 安裝。

命令:yum install rubygems

再次執行創建集羣的命令。

又有出現報錯,信息如下:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from ./redis-trib.rb:25

提示不能加載 redis,是因爲缺少 redis 和 ruby 的接口,使用 gem 安裝。

命令:gem install redis

如果該命令下載不了接口包,可以手動下載並上傳服務器,安裝即可。

命令:gem install redis-3.2.1.gem

再次執行創建集羣的命令即可創建集羣成功,如果仍有錯誤,可以參考文章最後的常見錯誤解答。

[root@node100 redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
[ERR] Sorry, can't connect to node 127.0.0.1:7000
[root@node100 redis-cluster]# cd /
[root@node100 /]# find -name client.rb
./usr/lib/ruby/1.8/xmlrpc/client.rb
./usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb
[root@node100 /]# vi /usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb 
require "redis/errors"
require "socket"
require "cgi"

class Redis
  class Client

    DEFAULTS = {
      :url => lambda { ENV["REDIS_URL"] },
      :scheme => "redis",
      :host => "127.0.0.1",
      :port => 6379,
      :path => nil,
      :timeout => 5.0,
      :connect_timeout => 5.0,
      :password => "123456",
      :db => 0,
      :driver => nil,
      :id => nil,
      :tcp_keepalive => 0,
<ib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb" 574L, 14334C written
[root@node100 /]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005-bash: ./redis-trib.rb: No such file or directory
[root@node100 /]# cd /usr/redis-cluster/
[root@node100 redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: f23b3418e4a454c8336c662a5d6022130f38ff30 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 100079aaff82a2eb6bb3967c8649deea63aceb08 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: d600b4a56d1e92261d163aac266754d14a44a703 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 0a2306e861fb268b3ce5600323b76b992d8769f5 127.0.0.1:7003
   replicates f23b3418e4a454c8336c662a5d6022130f38ff30
S: e35e98e6c061fc80c85ba02f9d1de6dccba91f7f 127.0.0.1:7004
   replicates 100079aaff82a2eb6bb3967c8649deea63aceb08
S: 34210a92160dc1994f02dc50a656ed9f52515329 127.0.0.1:7005
   replicates d600b4a56d1e92261d163aac266754d14a44a703
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: f23b3418e4a454c8336c662a5d6022130f38ff30 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: e35e98e6c061fc80c85ba02f9d1de6dccba91f7f 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 100079aaff82a2eb6bb3967c8649deea63aceb08
S: 0a2306e861fb268b3ce5600323b76b992d8769f5 127.0.0.1:7003
   slots: (0 slots) slave
   replicates f23b3418e4a454c8336c662a5d6022130f38ff30
S: 34210a92160dc1994f02dc50a656ed9f52515329 127.0.0.1:7005
   slots: (0 slots) slave
   replicates d600b4a56d1e92261d163aac266754d14a44a703
M: 100079aaff82a2eb6bb3967c8649deea63aceb08 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: d600b4a56d1e92261d163aac266754d14a44a703 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node100 redis-cluster]# 

可以看到 7000、7001、7002 爲 Master,7003、7004、7005 爲 Slave。信息同時顯示了每個節點所分配的 slots(哈希槽),3 個主節點分別映射了 0-5460、5461-10922、10923-16383 solts。

第十步,使用集羣。

要使用搭建的集羣,連接集羣中任意一個節點即可,比如這裏連接 7002。

命令:./redis-cli -p 7002 -c

127.0.0.1:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_sent:2920
cluster_stats_messages_received:2920
127.0.0.1:7002> cluster nodes
e35e98e6c061fc80c85ba02f9d1de6dccba91f7f 127.0.0.1:7004 slave 100079aaff82a2eb6bb3967c8649deea63aceb08 0 1576308662000 5 connected
34210a92160dc1994f02dc50a656ed9f52515329 127.0.0.1:7005 slave d600b4a56d1e92261d163aac266754d14a44a703 0 1576308662504 6 connected
f23b3418e4a454c8336c662a5d6022130f38ff30 127.0.0.1:7000 master - 0 1576308659988 1 connected 0-5460
0a2306e861fb268b3ce5600323b76b992d8769f5 127.0.0.1:7003 slave f23b3418e4a454c8336c662a5d6022130f38ff30 0 1576308660994 4 connected
d600b4a56d1e92261d163aac266754d14a44a703 127.0.0.1:7002 myself,master - 0 0 3 connected 10923-16383
100079aaff82a2eb6bb3967c8649deea63aceb08 127.0.0.1:7001 master - 0 1576308663007 2 connected 5461-10922
127.0.0.1:7002> 

到此,redis 僞分佈式集羣搭建完成了。

常見錯誤解答

報錯信息:[ERR] Sorry, can't connect to node 127.0.0.1:7000

可能原因:

1)redis 服務沒啓動。。。(這個最坑!!!)

2)由於配置文件 redis.conf 中設置了密碼導致。

解決方法:

方法一:可以刪除節點配置文件中的密碼,再次創建集羣則無報錯。

當這種方法會導致 redis 沒有密碼,不安全。如果仍想配置密碼,還要搭建集羣,則看方法二。

方法二:配置文件中還是配置密碼,如果要執行創建集羣的命令,則需要修改 client.rb 文件中的配置信息。client.rb 的路徑不固定,可以通過 find 命令查找該文件。

命令:find -name client.rb

編輯配置信息中的密碼部分:

報錯信息:(error) MOVED 14041 127.0.0.1:7002

可能原因:這種情況一般是因爲啓動 redis-cli 時沒有設置集羣模式所導致的。

解決方法:

啓動客戶端時使用 -c 參數來啓動集羣模式:

命令:./redis-cli -p 7000 -a 123456 -c

報錯信息:/usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb:113:in `call': ERR Slot 4648 is already busy (Redis::CommandError)

可能原因:運行 rb,點擊 yes 後就報錯了,一般和 nodes-conf 文件有關。

解決方法:只要把全部的 redis 節點目錄下的 nodes.conf 刪除即可。

其它錯誤待補充。。。

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