首页 > 数据库 >【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性

【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性

时间:2024-07-02 20:31:21浏览次数:1  
标签:ioredis AKS Redis redis TCP 连接 客户端

问题描述

在AKS中连接Redis,当遇到Azure Redis 升级或者Failover时,NodeJS应用中使用ioredis sdk 在很长一段时间内无法恢复和 Azure Redis服务端的连接,对于这种想象的可能性推断。

 

问题解答

使用 Azure Cache for Redis 时,一个服务器是主节点,另一个服务器是副本。 主节点通常负责为来自客户端的写入和读取请求提供服务。 在执行写入操作时,它会向其内部内存提交一个新密钥和密钥更新,并立即回复客户端。 它以异步方式将操作转发给副本。

当发生升级或者是Failover时,Azure Redis服务会执行以下操作:

  1. 首先修补副本节点(Replica)。
  2. 修补的副本以协作方式将自身提升为主副本。 这种升级被视为计划性故障转移。
  3. 以前的主节点将重新启动以接受新的更改,并作为副本节点备份。
  4. 副本节点连接到主节点并同步数据。
  5. 数据同步完成后,将对剩余的节点重复修补过程。

 

在Redis的升级/故障转移(Failover)中,会出现之前的链接全部断开,然后重连的情况。所以非常考验Redis SDK的复原设计能力。

在公网上搜索,遇见有类似的问题: 一个关于 redis 长链接的问题 · Issue #1615 

当 redis1 挂掉以后(比如直接电源关机),这个时候 node 客户端这边大约要等10 分钟左右才能成功连接成功 ....

 

Redis SDK中,Redis Client使用的TCP Connection依赖TCP的重连机制,如果遇到Redis的Failover,TCP连接将一直尝试重传,直到十几分钟后才会创建一个新的TCP连接, 这部分在Azure Redis的文档中(

Linux 托管客户端应用程序的 TCP 设置) 有非常详细的介绍:

某些 Linux 版本中的默认 TCP 设置可能会导致 Redis 服务器连接失败 13 分钟或更长时间。 默认设置可以防止客户端应用程序检测关闭的连接,并在连接未正常关闭的情况下防止自动还原这些关闭的连接。

如果网络连接中断或 Redis 服务器脱机进行计划外维护,重新建立连接可能会失败。

建议使用以下 TCP 设置:

设置
net.ipv4.tcp_retries2 5

有关此方案的详细信息,请参阅在 Linux 上运行时,长达 15 分钟无法重新建立连接。 虽然此讨论与 StackExchange.Redis 库有关,但 Linux 上运行的其他客户端库也会受到影响。 该说明仍然有用,可以通用化到其他库。

 

所以,继续查看 ioredis文档的重连配置,寻找可以避免出现长达十分钟以上无法连接Redis服务的问题:

Auto-reconnect 自动重新连接

默认情况下,当与 Redis 的连接丢失时,ioredis 会尝试重新连接,除非通过 redis.disconnect() 或 redis.quit() 手动关闭连接。

使用 retryStrategy 选项可以非常灵活地控制断开连接后等待多长时间重新连接:

const redis = new Redis({
  // This is the default value of `retryStrategy`
  retryStrategy(times) {
    const delay = Math.min(times * 50, 2000);
    return delay;
  },
});

retryStrategy 是一个在连接丢失时将被调用的函数。

参数 times 表示这是第 n 次重新连接,返回值表示等待重新连接的时间(以毫秒为单位)。

当返回值不是数字时,ioredis将停止尝试重新连接,如果用户不手动调用 redis.connect() ,连接将永远丢失。

 

 

参考资料

ioredis auto-reconnect: https://github.com/redis/ioredis?tab=readme-ov-file#auto-reconnect

Linux 托管客户端应用程序的 TCP 设置:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-best-practices-connection#tcp-settings-for-linux-hosted-client-applications

一个关于 redis 长链接的问题 : https://github.com/redis/ioredis/issues/1615

 

标签:ioredis,AKS,Redis,redis,TCP,连接,客户端
From: https://www.cnblogs.com/lulight/p/18280507

相关文章

  • Redis Sentinal(哨兵模式详解)
    参考文章https://www.cnblogs.com/wzh2010/p/180309071、什么是哨兵模式在实际生产环境中,服务器难免会遇到一些突发状况:服务器宕机,停电,硬件损坏等等,一旦发生,后果不堪设想。哨兵模式的核心还是主从模式的演变,只不过相对于主从模式,在主节点宕机导致不可写的情况下,多了探活,以及竞......
  • 23- Redis 主从复制是怎么实现的?
    之前介绍过AOF和RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量丢失)。不过,由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:如果服务器发生了宕机,由于数据恢复是需要时间的,那么这个期间是无法服务新的请求的;如果这台服务器的硬盘出现了......
  • 保存到redis中的token乱码了
    示图:原因是缓存保存到redis需要序列化操作,没有序列化会出现这样的问题序列化redis第一步:packagecom.abliner.test.configure.redis;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom......
  • 十四、Redis应用问题解决
    文章目录一、缓存穿透1.1问题描述1.2解决方案二、缓存击穿2.1问题描述2.2解决方案三、缓存雪崩3.1问题描述3.2解决方案四、分布式锁4.1问题描述4.2解决方案:使用redis实现分布式锁4.3编写代码4.4优化之设置锁的过期时间4.5优化之UUID防误删4.6优化之LUA脚......
  • 十三、Redis集群
    文章目录一、问题二、什么是集群三、删除持久化数据四、制作6个实例6379,6380,6381,6389,6390,63914.1配置基本信息4.2rediscluster配置修改4.3修改好redis6379.conf文件,拷贝多个redis.conf文件4.4使用查找替换修改另外5个文件4.5启动6个redis服务......
  • 2024 Redis面试题
    Redis为什么快?1.纯内存KV操作        Redis的操作都是基于内存的,CPU不是Redis性能瓶颈,,Redis的瓶颈是机器内存和网络带宽。        在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。redis的操作都是基于内......
  • Redis Stream 作为消息队列的详尽笔记
    概述RedisStream是Redis5.0版本引入的数据结构,用于消息传递。基础概念结构:消息链表,每个消息有唯一ID和内容。命名:每个Stream有唯一名称,对应RedisKey。消费组(ConsumerGroup):可挂载多个消费组,需手动创建。每个组有游标last_delivered_id,记录消费进度。消费......
  • Redis配置文件详解
    在Redis中,Redis的根目录中有一个配置文件(redis.conf)。您可以通过RedisCONFIG命令获取和设置所有Redis配置。查看Redis配置句法CONFIGGET命令的基本语法:redis127.0.0.1:6379>CONFIGGETCONFIG_SETTING_NAME查看日志等级的配置redis127.0.0.1:6379>CONFIGGETlog......
  • python中对于redis依赖的一些版本记录
    一、redis不同版本对于集群和单节点的区别:1.在redis版本高于等于4.1.0支持集群方式链接(官网实例:https://redis-py.readthedocs.io/en/stable/clustering.html)推荐只使用redis官方依赖该与4.1.0的稳定版本进行支持 2.如果使用redis-py-cluster,进行对redis集群的连接,安装依赖时......
  • Redis 搜索日期范围内的查询
    目录Redis搜索日期范围内的查询1.存储日期数据2.查询日期范围3.使用有序集合总结Redis搜索日期范围内的查询Redis是一种快速、高效的数据存储和检索工具,常用于缓存和实时数据处理。虽然Redis设计并不专注于日期范围查询,但可以通过一些技巧实现该功能。本文将介绍......