这里记录下心路历程,踩了很多坑之后终于搭建完毕;
环境
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"
太好了!问题解决完毕!可以去睡觉了!