
【故障演练】 Redis Cluster集群,当master宕机,主从切换,客户
大家好,我是Tom哥
性能不够,缓存来凑
一个高并发系统肯定少不了缓存的身影,为了保证缓存服务的高可用,我们通常采用 Redis Cluster 集群模式。
描述:
集群部署采用了 3主3从 拓扑结构,数据读写访问master节点, slave节点负责备份。
随便登录一台 redis 节点,都可以看到集群的slot的槽位分步区间,以及对应的主从节点映射关系。
人为模拟,master-1 机器意外宕机
此时,Redis Cluster 集群能自动感知,并自动完成主备切换,对应的slave会被选举为新的master节点
看下 redis cluster 集群最新的主从关系
看似也没什么问题,一切正常
此时 Spring Boot 应用依然在线服务,当我们再尝试操作缓存时,会报错
问题边界还是非常清晰的。
Redis Cluster 集群已经完成了切换。
但是 Spring Boot 客户端没有动态感知到 Redis Cluster 的最新集群信息
原因分析:
SpringBoot 2.X 版本, Redis默认的连接池采用 Lettuce
当Redis 集群节点发生变化后,Letture默认是不会刷新节点拓扑
解决方案:
将 Letture 二方包仲裁掉
然后,引入 Jedis 相关二方包
编译代码,并重新启动 SpringBoot 微服务,万事俱备,只欠再次验证
重新模拟将 127.0.0.1:8001 master 节点宕机,看看系统的日志
从打印的日志来看,客户端已经感知到了主备切换,并与最新的主节点 127.0.0.1:8004 初始化了 24 个连接。
然后,回归业务功能,读写缓存 数据也都是操作最新的主节点。
还有一种方案:刷新节点拓扑视图
Lettuce 官方描述:
https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster#user-content-refreshing-the-cluster-topology-view
Lettuce 处理 Moved 和 Ask 永久重定向,由于命令重定向,必须刷新节点拓扑视图。而自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates)默认关闭
解决方案:
- 调用 RedisClusterClient.reloadPartitions
- 后台基于时间间隔的周期刷新
- 后台基于持续的断开 和 移动、重定向 的自适应更新
编写代码
本文转载自微信公众号「微观技术」
原文链接:https://mp.weixin.qq.com/s/Lwem4orGaTgGccpjEey02A
