redis cluster 安裝配置

Redis已經推出了集羣方案,集羣實現是將不一樣的key分散到不一樣的節點上,傳統哈希算法hash(key)%n,不適用於添加和刪除節點場景,會致使大量的key沒法命中,擴展比較困難。redis 沒有采用一致性hash,而採用哈希槽( hash slot ) 方式來實現數據共享。node

    具體算法:crc16( key )%16384,從而將 16384 個槽分配至不一樣的節點上。 redis

環境:算法

    三臺機器一主一備ruby

   10.0.0.1 7000 7001bash

   10.0.0.2 7000 7001app

   10.0.0.3 7000 7001curl

redis 配置文件ui

7000 端口的配置文件url

port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /var/run/redis-7000.pid
dir /data/redis//data/7000
dbfilename dump-7000.rdb
appendfilename appendonly-7000.aof
logfile /data/redis//log/redis-7000.log

   7001 端口的配置自行替換3d

啓動

 在每一個節點上啓動兩個redis服務

redis-server ./7000.cnf
redis-server ./7001.cnf

集羣

./src/redis-trib.rb create --replicas 1 10.0.0.1:7000 10.0.0.2:7000 10.0.0.3:7000 10.0.0.1:7001 10.0.0.2:7001 10.0.0.3:7001

參數--replicas 1 爲每一個主機建立一個相應的備機

日誌展現

[root@packone redis-3.2.2]# ./src/redis-trib.rb create --replicas 1 10.0.0.1:7000 10.0.0.2:7000 10.0.0.3:7000 10.0.0.1:7001 10.0.0.2:7001 10.0.0.3:7001
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.0.0.1:7000
10.0.0.2:7000
10.0.0.3:7000
Adding replica 10.0.0.2:7001 to 10.0.0.1:7000
Adding replica 10.0.0.1:7001 to 10.0.0.2:7000
Adding replica 10.0.0.3:7001 to 10.0.0.3:7000
M: 8bb0a330855b4f3f3f6abfde8c25b1f2830de106 10.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: bb6596c4deff93bd233467323316e2c1c97dd029 10.0.0.2:7000
   slots:5461-10922 (5462 slots) master
M: d218dfad569bea27eae4420c959b04e55a55b3b1 10.0.0.3:7000
   slots:10923-16383 (5461 slots) master
S: df4abe786033d23850fbedcb74d4c54cdefaf5c1 10.0.0.1:7001
   replicates bb6596c4deff93bd233467323316e2c1c97dd029
S: 40fac62b532eb6cb9068fe0afded711306f99bb6 10.0.0.2:7001
   replicates 8bb0a330855b4f3f3f6abfde8c25b1f2830de106
S: e95bafd1226d3c921521713dcf0506700fc8709c 10.0.0.3:7001
   replicates d218dfad569bea27eae4420c959b04e55a55b3b1
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 10.0.0.1:7000)
M: 8bb0a330855b4f3f3f6abfde8c25b1f2830de106 10.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: bb6596c4deff93bd233467323316e2c1c97dd029 10.0.0.2:7000
   slots:5461-10922 (5462 slots) master
M: d218dfad569bea27eae4420c959b04e55a55b3b1 10.0.0.3:7000
   slots:10923-16383 (5461 slots) master
M: df4abe786033d23850fbedcb74d4c54cdefaf5c1 10.0.0.1:7001
   slots: (0 slots) master
   replicates bb6596c4deff93bd233467323316e2c1c97dd029
M: 40fac62b532eb6cb9068fe0afded711306f99bb6 10.0.0.2:7001
   slots: (0 slots) master
   replicates 8bb0a330855b4f3f3f6abfde8c25b1f2830de106
M: e95bafd1226d3c921521713dcf0506700fc8709c 10.0.0.3:7001
   slots: (0 slots) master
   replicates d218dfad569bea27eae4420c959b04e55a55b3b1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

錯誤

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

from ./redis-trib.rb:24

問題緣由 1是沒有ruby環境 2ruby版本過低,redis須要1.9.3以上的ruby版本

yum install -y ruby  
yum install -y rubygems

#更新ruby版本
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm install 2.3.1
gem install redis

2.[ERR] Sorry, can't connect to node

執行上面這條命令時,可能遇到錯誤「[ERR] Sorry, can't connect to node 127.0.0.1:7006」。引發該問題的緣由多是由於ruby的版本太低(運行ruby -v能夠查看ruby的版本),能夠嘗試升級ruby再嘗試,好比ruby 1.8.7版本就須要升級。對於Redis 3.0.5和Redis 3.2.0,使用Ruby 2.3.1操做正常。請注意升級到最新版本的ruby也可能遇到這個錯誤。
另外一個會引發這個問題的緣由是從Redis 3.2.0版本開始引入了「保護模式(protected mode),防止redis-cli遠程訪問」,僅限redis-cli綁定到127.0.0.1才能夠鏈接Redis server。
爲了完成添加新主節點,能夠暫時性的關閉保護模式,使用redis-cli,不指定-h參數(但能夠指定-p參數,或者-h參數值爲127.0.0.1)進入操做界面:CONFIG SET protected-mode no。

3.配置完全部主節點後,報" ERR Invalid node address specified"

因爲redis-trib.rb 對域名或主機名支持很差,故在建立集羣的時候要使用ip:port的方式

redis-trib.rb create ip1:port1 ip2:port2 ip3:port3

4.建立集羣時報某個err slot 0 is already busy (redis::commanderror)

這是因爲之間建立集羣沒有成功,須要將nodes.conf和dir裏面的文件所有刪除(注意不要刪除了redis.conf)

5.建立集羣時一直處於"Waiting for the cluster to join...................................."的狀態

這個問題緣由不知,但解決方法是在redis.conf文件中把bind 127.0.0.1本地環回口改成物理接口或者從新運行腳本

相關文章
相關標籤/搜索