Redis服务器主从域名切换需要重启JedisCluster客户端吗

起因:

最近DBA在做Redis服务器集群数据的迁移,目的是把当前的Redis服务器集群迁移到另外ip的另一个服务器集群上去,数据不变,但是redis的ip会改变,当迁移完成后,会修改访问Redis集群的域名的地址为新的ip,也就是比如:www.myredis.com迁移前是解析到10.100.0.1这个ip地址的,迁移后会解析到10.100.0.10这个ip地址,示意图如下所示:
在这里插入图片描述
当DBA迁移完毕后,我们发现应用A除了在迁移的过程中有一些重定向错误外(应用A在迁移的过程中还一直有数据请求到redis服务),整个Redis服务器的迁移异常顺利,应用A根本不需任何操作就完全恢复对外服务了;看了服务器没有问题后,向DBA反馈应用正常,DBA反馈说旧的集群(旧ip的redis服务器)先暂时不下线回收,观察观察,在此之后,应用B有一个作业正好也访问Redis集群,观察到日志发现也可以正常获取到新Redis集群的数据,这样我自认为Redis迁移操作在应用端已经完成了,打卡下班.
在我回家路上的这段时间里,DBA通知我说旧集群的机器下线了(因为他也要下班了,反正应用正常,数据也都在新Redis集群,他也以为肯定木有问题了),可是刚回到家就发现另一个同样是访问了这个Redis集群的应用C告警,告警信息是: Jedis的MaxRedirectionException异常,收到这个信息的我一脸诧异,大量从重定向错误异常让我陡然紧张起来,观察到日志发现应用C完全不能访问新的Redis集群,直到重启应用C才能恢复访问新的Redis集群,这个结果让我完全摸不着头脑
为什么应用A,应用B,应用C都是使用同一个JedisCluster版本访问的同一个Redis集群,为什么应用A,应用B能从迁移后的Redis集群中,而应用C需要重启才能访问Redis集群呢?

为什么?

1、首先我们分析下到目前为止应用A,应用B和应用C在Redis集群数据迁移期间有什么不同,应用A,应用B和应用C都是使用的同一个JedisCluster的版本,所以排除是因为JedisCluster版本不同导致的差异
ps: jedisCluster工作原理–jedisCluster在第一次通过域名获取到某台redis服务器的ip之后,连接到这台redis服务器执行cluster slots拿到所有该redis集群的所有主从的ip和端口信息,
然后后面所有的操作都是基于获取到的集群的ip和端口进行操作的,域名解析只在第一次初始化JedisCluster集群时才会进行,此后再也不会进行域名解析的操作
2.应用A在Redis集群迁移期间一直有数据访问,应用B是在Redis集群迁移完成并且旧的集群下线之前访问了新Redis集群的数据,而应用C是在Redis集群迁移完成并且旧的集群下线之后才访问了新Redis集群的数据,导致的结果就是应用A和应用B能从Redis迁移中恢复,而应用C需要重启才能恢复,看到这里我们似乎知道了原因所在:应用C一直没有访问新的Redis集群的数据,一直到旧的集群下线之后才第一次访问新的Redis集群的数据

现在我们来回答:

一.为什么应用C需要重启才能恢复访问新的Redis集群,因为应用C的JedisCluster客户端里面保存的ip和端口都是旧集群的ip和端口信息,这些旧集群的ip和端口信息此时已经都不能访问了,而JedisCluster不会再次解析域名拿新Redis集群的Redis服务器ip,所以必须重启才能修复.
二.为什么应用A和应用B不用重启也能访问新Redis集群的数据呢?原因是虽然应用A和B的JedisCluster中保持的也是旧的集群的ip和端口信息,但是这些旧的集群还没有下线,依然还是作为新Redis集群的从库存在,所以当JedisCluster访问redis超时后被动通过旧集群的ip和端口号执行cluster slots命令更新JedisCluster本地的Redis集群信息时,旧集群机器(此时作为新集群的从库存在)的cluster slots命令能获取到新集群+旧集群的所有ip和端口地址信息,并且把这些信息更新到本地的JedisCluster中,这样JedisCluster就知道了Redis新集群的所有信息+此时作为从库存在的旧集群的所有信息,所以自然应用A和应用B不重启也可以正常访问新集群的redis

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis Cluster中,主从切换可能会导致数据丢失。当集群发生故障或分区时,Sentinel集群会重新选举一个新的Master节点来替代故障的Master节点。然而,在切换过程中可能会发生数据丢失的情况。 首先,在某种情况下,比如网络原因导致Master与Slave节点之间失去联系,Sentinel集群可能会错误地认为Master节点故障并进行切换。这时,旧的Master节点可能并没有真正发生故障,而是由于网络分区导致无法与其他节点通信。如果不及时发现问题并进行处理,旧的Master节点可能会继续接收客户端的写入请求,而新的Master节点并不包含这些数据。这样就会导致旧的Master节点中堆积大量数据,当问题被发现后,旧的Master节点需要降级为Slave来同步新的Master节点的数据,这样之前堆积的数据就会被刷新掉,造成数据丢失。 其次,集群产生脑裂也可能导致数据丢失。脑裂是指集群中的节点无法达成一致,导致部分节点认为Master节点故障,而另一部分节点认为原Master节点仍然存活。在这种情况下,两个Master节点可能同时接收写入请求,导致数据不一致。 为了尽量减少数据丢失,可以采取一些措施。首先,可以使用持久化机制来定期将数据写入磁盘,以防止节点宕机后数据丢失。然而,即使开启持久化设置,当Master节点发生故障并被切换后,旧的Master节点在故障恢复后重启时,仍然需要同步新的Master节点的数据,此时旧的Master节点中的数据会被刷新掉,仍然会造成数据丢失。 因此,在Redis Cluster中,无法完全保证数据不丢失,只能尽量减少数据丢失的风险。对于高可用性的要求,可以采用更可靠的数据备份和灾难恢复措施,以确保数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值