代码编织梦想

起因:

最近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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lixia0417mul2/article/details/127002914

redis集群配置-爱代码爱编程

文章目录 redis集群配置主从复制哨兵模式集群搭建 redis集群配置 不熟悉redis请先看:redis6学习 主从复制 主从模式指的是使用一个redis实例作为主机,其余的实例作为备份机。主机和从机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取,也就是说,客户端可以将数据写入到主机,由主机自

Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)-爱代码爱编程

Redis的集群方案大致有三种:1)redis cluster集群方案;2)master/slave主从方案;3)哨兵模式来进行主从替换以及故障恢复。 一、sentinel哨兵模式介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本

【八股文】11 redis_wieky的博客-爱代码爱编程

1. 谈下你对 Redis 的了解? Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。 2. Redis 一般都有哪些使用场景? Redis 适合的场景 缓存:减轻 MySQL 的

redis_stephen30java的博客-爱代码爱编程

[[toc]] Redis 一、大型网站的系统特点 1.高并发、大流量 大型网站系统需要面对高并发用户,大流量访问。Google日均PV数35亿,日均IP访问数3亿;腾讯QQ的最大在线用户数1.4亿(2011年数据);微信用户量已超11亿;2019年天猫双十一交易额突破2500亿。 2.高可用 系统7×24小时不间断服务。大型互联网站的宕机事件

redis主从复制+哨兵模式_small stones的博客-爱代码爱编程

Redis主从复制 **Tips:**准备三台虚拟机,配置好主机名、IP地址和redis环境。为了演示方便,利用多个实列的方式在一台主机上运行。 环境准备 配置多个实列 cp /opt/software/redis-

mysql----innodb存储引擎_彼岸的饭碗的博客-爱代码爱编程

innoDB ---- 一个程序员都应该了解的概念 1. innoDB逻辑存储结构 2. innoDB整体架构 2.1 内存架构 Buffer Pool Change Buffer Adaptive

redis实现消息队列(双端队列的模式,发布订阅模式)_dream21st的博客-爱代码爱编程

文章目录 1 采用双端队列的模式 1.1 入队出队操作 1.2 生产者编写 1.3 消费者编写 1.4 测试 2 采用发布订阅模式

redis知识-实战篇(4)_吹个七彩泡泡吧的博客-爱代码爱编程

详细代码在我的Github上,地址: https://github.com/CodeTeng/RedisCase 感兴趣的朋友可以去我的语雀平台进行查看更多的知识。 https://www.yuque.com/ambitio