redis服务器主从域名切换需要重启jediscluster客户端吗_lixia0417mul2的博客-爱代码爱编程
起因:
最近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