昨天下午3-4点开始一直到夜里12点半,在加上今天上午的两个半小时算是勉强搞定了。真闹心啊
首先我用的是oracle oci(云端的计算实例)搭建了一个三台机器(3主,3从,每一对主从在一台机器)的redis cluster 集群,redis版本是最新的5…0.7
接下来我描述一下问题的细节
三台机器A(port: 7001,7002)B(port: 7003,7004), C(port: 7005,7006),在云端要把security list对应的端口7000-7006,17000-17006(redis集群后台通信用,)打开。
集群创建完毕后,显示成功。
因为我想在本地测试,所以需要外网访问redis集群
此处为止注意点
1 redis 配置文件中 把bind取消,然后把保护模式关闭
2 创建集群的时候用外网ip
redis-cli --cluster create 外网Ip:7001 外网Ip:7002 外网Ip:7003 外网Ip:7004 外网Ip:7005
外网Ip:7006 --cluster-replicas
上面是从网上查到的,照做肯定没问题,如果不做的话是否可以我没试过(太累了,不试验了)
奇怪的问题发生了,我在jedis中连接的时候一直报错 No more cluster attempts left
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("外网ip", Integer.valueOf(7006)));
jedisClusterNodes.add(new HostAndPort("外网ip", Integer.valueOf(7002)));
jedisClusterNodes.add(new HostAndPort("外网ip", Integer.valueOf(7004)));
jedisClusterNodes.add(new HostAndPort("外网ip", Integer.valueOf(7005)));
jedisClusterNodes.add(new HostAndPort("外网ip", Integer.valueOf(7001)));
jedisClusterNodes.add(new HostAndPort("外网ip", Integer.valueOf(7003)));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 10000);
jedisCluster.set("abcde","1123");
return jedisCluster.get("abcde");
换了几次jedis驱动3.1和3.2就是 No more cluster attempts left
这个错误,网上也找不到对策,换了2.9的驱动就是time out。后来反复各种调试,无意中发现是7005(master)
连不上,只要在jedis中剔除掉7005 就可以了
继续调试,把7005停掉,它对应的slave7002(在另一台机器上)变成了新的master,在启动7005,7005变成了slave,然后一切都正常了,7005也能连上了。好神奇
继续调查,把7001(也是一台master)的reds配置文件和7005对比,发现除了端口号不同,完全一致。其实当时做集群的时候都是按照7001改的,最后无奈又复制了一份7001的配置文件到7005那台机器。
把端口号改成7000,停掉7005,把7000加入集群,作为7002的slave。一切正常了,停掉7002,7000变成了master。依然正常。
实在是找不到原因了,暂时先记录下 最后我有两点疑问 1 我不知道这个问题是不是和外网访问redis 有关
(等有时间的时候把代码考到云上去运行下试试)
2 当然redis一般来说肯定是内网访问,但是如果像我这样搭建redis
cluster,是不是redis集群间的通信全是走外网?那速度岂不是很慢了,而且会浪费很多带宽流量