在 Windows 上測試 Redis Cluster的集羣填坑筆記

redis 集羣實現的原理請參考 http://www.tuicool.com/articles/VvIZje
 
 
 
集羣環境至少須要3個節點。推薦使用6個節點配置,即3個主節點,3個從節點。
新建6個文件夾 分別是 7000/7001/7002/7003/7004/7005
 
redis.windows.conf 複製一份
 
而後修改配置文件中的下面選項 
  • port 7000 (redis 端口號)
  • daemonize yes (是否之後臺daemon方式運行 windows上不支持,能夠忽略)
  • cluster-enabled yes (開啓集羣)
  • cluster-config-file nodes.conf (集羣模式下,每一個redis節點生成一個本身的集羣配置文件,這個文件不須要人工修改,由redis本身維護)
  • cluster-node-timeout 5000 (集羣模式時,當前節點在與其餘節點保活探測時,多久沒有響應時認爲其餘節點處於fail狀態,上面是5秒)
  • appendonly yes (是否開啓appendonlylog,開啓的話每次寫操做會記一條log,這會提升數據抗風險能力,但影響效率。)
  • cluster-require-full-coverage yes ( 默認爲Yes,丟失必定比例Key後(可能Node沒法鏈接或者掛掉),集羣中止接受寫操做 no: 容許某些slot沒有active節點的時候其他slot還能用。就是其中1個實例掛掉,不會致使整個redis cluster都不可用了)
  • cluster-slave-validity-factor 10 (控制從節點FailOver相關的 設置設爲0,從節點會一直嘗試啓動FailOver.設爲正數,失聯大於必定時間(factor*節點TimeOut),再也不進行FailOver)
分別放到 上面的5個文件夾裏面
(注意:拷貝完成以後要修改 7001/7002/7003/7004/7005 目錄下面 redis.conf 文件中的 port 參數,分別改成對應的文件夾的名稱)
 
 
分別啓動這 6 個 redis 實例  
redis-server.exe H:\Tools\cluster\7000\redis.7000.conf
redis-server.exe H:\Tools\cluster\7001\redis.7001.conf
redis-server.exe H:\Tools\cluster\7002\redis.7002.conf
redis-server.exe H:\Tools\cluster\7003\redis.7003.conf
redis-server.exe H:\Tools\cluster\7004\redis.7004.conf
redis-server.exe H:\Tools\cluster\7005\redis.7005.conf
 
啓動後會看到如下日誌信息,提示Node.conf不存在,而且每一個節點建立了一個NodeID
 
 
 
最後一步
組建集羣配置
 
 源碼src文件下提供了一個叫作redis-trib.rb的腳本文件,是一個Ruby腳本用於建立集羣,檢測及從新分片等 .
但你得安裝ruby環境。
 
而後安裝 redis 的 ruby 函式庫
 
 
運行命令:
ruby  H:\Tools\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  
 
創建的過程當中 Ruby 會要求更改 nodes.conf ,就輸入 yes 就能夠了。
 
輸入yes後 我滿懷期待等到成功的消息。誰知道給我一個無限的waiting?

H:\Tools\cluster>ruby H:\Tools\cluster\redis.trib.rb create --replicas 0 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
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
>>> Performing hash slots allocation on 5 nodes...
Using 5 masters:
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
M: 6c5c8b20e7f051e19a41e96a1d0b37cc79abf647 127.0.0.1:7001
   slots:0-3276 (3277 slots) master
M: 6c5c8b20e7f051e19a41e96a1d0b37cc79abf647 127.0.0.1:7002
   slots:3277-6553 (3277 slots) master
M: 6c5c8b20e7f051e19a41e96a1d0b37cc79abf647 127.0.0.1:7003
   slots:6554-9829 (3276 slots) master
M: 6c5c8b20e7f051e19a41e96a1d0b37cc79abf647 127.0.0.1:7004
   slots:9830-13106 (3277 slots) master
M: 6c5c8b20e7f051e19a41e96a1d0b37cc79abf647 127.0.0.1:7005
   slots:13107-16383 (3277 slots) master
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..........................................................................................................................................................


NND,一時摸不着頭腦,網上一查了幾個方案 都試了仍是不行。
google查了也沒找到相關信息。
就在stackoverflow上發帖求助老外。 http://stackoverflow.com/questions/37193338/redis-cluster-error
仍是沒人鳥我啊。。多是我英語太差了 。
 
由於是用ruby的代碼去配置cluster的。
接下來就調試ruby代碼 看下究竟是哪裏出了問題才致使block在waiting的。
要修改一下redis.trib.rb文件才能夠調試,由於參數不是經過COMMAND的ARGV傳過去的。
 
調試的時候運行到下面的代碼的時候報錯了
 
錯誤信息爲: ERR Slot 6387 is already busy
 
 
ok 解決了一個問題了。
F5運行 不會報錯了 ,但TMD仍是會block在waiting。此處省略一萬頭馬。
分析了一下。這裏會7001,7002,7003,7004,7005 都會發送給7000 meet這個命令。
 
 
而後會收到簽名後纔算是分配成功
發現 
signatures
裏面全是7000的回執簽名。
不對啊。應該接收到的是 7001——7005的纔對啊。
除非都發給本身啦?
仔細一看,7000-7005的nodeId都是同樣。不出錯纔怪!
在回過頭看下以前啓動redis的命令,才發現建立的NodeID都是同樣的,一開始就錯了!!!
 
配置修改爲以下:

port 7005
appendonly yes
appendfilename "appendonly.7005.aof"
cluster-enabled yes
cluster-config-file nodes.7005.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes

而後從新來過
出現如下結果說明配置好了:

>>> Creating cluster
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
>>> 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: fa810d10bca15ffc480953329c12da988fc3f52a 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 65e347cbe71aeae7b983ce85cf14eec1f0c1e0b7 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 17739ba52d2c171db5c960962e4ec8845c6e63b0 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: d7c9a9c3982dde2f0cc551f227e023b5746373b5 127.0.0.1:7003
   replicates fa810d10bca15ffc480953329c12da988fc3f52a
S: fbac6089f7889b68726dd152daaf71834a97dd6e 127.0.0.1:7004
   replicates 65e347cbe71aeae7b983ce85cf14eec1f0c1e0b7
S: 76867e63d75e1ff00dc4a5f60a91ea4634a083aa 127.0.0.1:7005
   replicates 17739ba52d2c171db5c960962e4ec8845c6e63b0
>>> 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: fa810d10bca15ffc480953329c12da988fc3f52a 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 65e347cbe71aeae7b983ce85cf14eec1f0c1e0b7 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 17739ba52d2c171db5c960962e4ec8845c6e63b0 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: d7c9a9c3982dde2f0cc551f227e023b5746373b5 127.0.0.1:7003
   replicates fa810d10bca15ffc480953329c12da988fc3f52a
S: fbac6089f7889b68726dd152daaf71834a97dd6e 127.0.0.1:7004
   replicates 65e347cbe71aeae7b983ce85cf14eec1f0c1e0b7
S: 76867e63d75e1ff00dc4a5f60a91ea4634a083aa 127.0.0.1:7005
   replicates 17739ba52d2c171db5c960962e4ec8845c6e63b0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


測試一下node

從 port 7000 set 一個 值 而且設定過時時間爲10秒

而後從 port 7001 裏面get出來。
 
 
沒問題!

 
 
最後:建議我的玩玩就得了 生產上仍是別再windows上搞redis。
相關文章
相關標籤/搜索