外网访问redis cluster的大坑

昨天下午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集群间的通信全是走外网?那速度岂不是很慢了,而且会浪费很多带宽流量

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值