這里記錄下心路歷程,踩了很多坑之后終於搭建完畢;
環境
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.2.1511 (Core)
Release: 7.2.1511
Codename: Core
redis版本
3.2.8
歷程
集群剛開始是同事搭建的,后來其中一台機器遷移,導致集群不可用,然后就再也起不來了
由於項目時間緊迫(也有個人的好勝心在里面),特連夜解決此問題;
按照網上搜索到步驟安裝,所有的都進行完了,到最后一步的時候,
./redis-trib.rb create --replicas 1 192.168.1.3:7001 192.168.1.7:7001 192.168.1.45:7001 192.168.1.7:7002 192.168.1.45:7002 192.168.1.3:7002
老是報錯:
[ERR] Sorry, can't connect to node *.*.*.*:7001
然后重新檢查所有的配置,沒有問題啊,怎么會報這個錯呢,於是查找原因:
1. 是機器之間不能互通?
於是打算telnet一下,發現此工具沒有安裝,然后迅速的安裝:
sudo yum install telnet
測試:
Trying 192.168.1.3... Connected to 192.168.1.3. Escape character is '^]'.
沒有問題啊,怎么會不通呢
2. 是這個教程不好使?於是又搜了一個教程,按照教程配上,結果費了半天勁,還是這個錯誤! 崩潰。。。
配置文件哪里寫錯了?重新挨個檢查配置,特別是bind,沒錯啊,IP寫的就是 192.168.1.3啊,怎么會連不上呢
3. 既然連不上,那我試試單個節點是不是能連上,分別登錄各個機器,發現單台都是能連的,但
set wst_test wst_value_success
報了slot的錯誤(具體的錯誤信息記不清了);
既然工具(redis-trib.rb)不好用,那我就不用它了,忽然看到可以直接在redis命令行里 使用集群的相關命令:
cluster meet -- 於是手動把所有節點都加進去,但是主從關系怎么辦,往下找,
cluster replicate --- 趕緊登陸每台機器的7002節點設置主從關系,心想這次應該OK了吧
再測 set wst_test wst_value_success, 還是報錯!
希望再一次破滅。。。。。。
4. 到底是哪里的原因呢?於是查看 redis-trib.rb 的源碼
看不懂啊,趕緊的搜索個ruby的教程(http://www.runoob.com/ruby/ruby-tutorial.html),擼一把基礎。學到輸出變量的方法puts
然后就一步一步跟蹤代碼,最后發現這一行:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60)
咦!連接redis怎么不用密碼,我明明設置了密碼,難道ruby要比別的語言高級,拿出來單獨測下:
#!/usr/bin/ruby require "redis" redis = Redis.new(:host => "192.168.1.3", :port =>7001 , :password => "******") redis.ping
發現沒有報錯,說明密碼還是要加的,於是修改源碼為:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "你的密碼")
雖然這里把密碼硬編碼到這里不好,但是對ruby不是很熟,就先這樣了!
趕緊再運行下最后的那個命令,感覺應該能行
由於窗口已關,問題不能重現,正確的樣子大概如下:
./redis-trib.rb create 172.0.0.188:6379 172.0.0.180:6379 172.0.0.199:6379 172.0.0.154:6379 >>> Creating cluster >>> Performing hash slots allocation on 4 nodes... Using 4 masters: 172.0.0.188:6379 172.0.0.180:6379 172.0.0.199:6379 172.0.0.154:6379 M: 182daf01e924e405c9337f093c764c8bbc76b19d 172.0.0.188:6379 slots:0-4095 (4096 slots) master M: d5f61c3df20b7b344a3bdbc7ebff48291dc45fbe 172.0.0.180:6379 slots:4096-8191 (4096 slots) master M: 53bc0b32ef7f1906bb0fdde463b8be077ed981e3 172.0.0.199:6379 slots:8192-12287 (4096 slots) master M: f5aa21b39c76b20af5f2ac4912b22ccf8c9916b8 172.0.0.154:6379 slots:12288-16383 (4096 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
終於出現了正確的提示,好激動,問題終於解決了!!!
趕緊的測試下:
192.168.1.3:7001> 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:1 cluster_stats_messages_sent:13675 cluster_stats_messages_received:13675 192.168.1.3:7001> keys * (empty list or set) 192.168.1.3:7001> set wst_test wst_value_success OK 192.168.1.3:7001> keys * 1) "wst_test" 192.168.1.3:7001> get wst_test "wst_value_success"
太好了!問題解決完畢!可以去睡覺了!
