Redis 和业务应用部署在同一个 K8s 集群中,Redis Server 暴露了一个 redis-service,指向到 master 节点,业务应用通过 redis-service 连接 Redis。
问题发现
客户端:业务应用使用 lettuce 客户端
服务端:Redis server 部署架构采用 1 主 + 1 从 + 3 哨兵
Redis 和业务应用部署在同一个 K8s 集群中,Redis Server 暴露了一个 redis-service,指向到 master 节点,业务应用通过 redis-service 连接 Redis。
某个时刻起,开始发现业务报错,稍加定位,发现是 Redis 访问出了问题,搜索业务应用日志,发现关键信息:
org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: READONLY You can't write against a read only replica.
这是一个 Redis 访问的报错,看起来跟 Redis 的读写配置有关。
问题定位
首先排查下业务应用和 Redis 的连接情况
# netstat -ano | grep 6379
tcp 0 0 172.24.7.34:44602 10.96.113.219:6379 ESTABLISHED off (0.00/0/0)
其中 172.24.7.34 是业务 pod 的 ip,10.96.113.219 是 redis 的 K8s service ip,连接是 ESTABLISHED 状态,说明连接没有断。
继续排查 Redis 的 pod 是否正常:
redis-shareredis-0 2/2 Running 0
redis-shareredis-1 2/2 Running 0
redis-shareredis-sentinel-5f7458cd89-7dwpz 2/2 Running 0
redis-shareredis-sentinel-5f7458cd89-rrfz7 2/2 Running 0
redis-shareredis-sentinel-5f7458cd89-xzpmb 2/2 Running 0
无论是读写节点还是哨兵节点,都没有重启过。
既然报了只读节点的异常,索性看下 redis 节点的读写角色情况。
root@redis-shareredis-0:/data# redis-cli -h 172.24.1.95 -a xxxx role
1) "slave"
2) "172.24.1.96"
3) (integer) 6379
4) "connected"
5) (integer) 6942040980
root@redis-shareredis-0:/data# redis-cli -h 172.24.1.96 -a xxxx role
1) "master"
2) (integer) 6942173072
3) 1) 1) "172.24.1.95"
2) "6379"
3) "6942173072"
可以看到此时 redis-shareredis-0(172.24.1.95)是 slave 节点,redis-shareredis-1(172.24.1.96)是 master