连接复原能力

重试命令

将客户端连接配置为使用指数退避重试命令。

测试复原

使用重启来模拟某个补丁,测试系统对连接中断的复原能力。 有关如何测试性能的详细信息,请参阅性能测试

Linux 托管客户端应用程序的 TCP 设置

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

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

建议使用以下 TCP 设置:

设置
net.ipv4.tcp_retries2 5

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

将 ForceReconnect 与 StackExchange.Redis 一起使用

在极少数情况下,Stackexchange.redis 在连接中断后无法重新连接。 在这些情况下,重新启动客户端或创建新的 ConnectionMultiplexer 可解决此问题。 建议使用单一实例 ConnectionMultiplexer 模式,同时允许应用定期强制重新连接。 请查看与应用程序使用的框架和平台最匹配的快速入门示例项目。 在我们的快速入门中,可以查看此代码模式的示例。

ConnectionMultiplexer 的用户必须处理因处置该类的旧实例而可能发生的任何 ObjectDisposedException 错误。

针对 RedisConnectionExceptionsRedisSocketExceptions 调用 ForceReconnectAsync()。 也可以针对 RedisTimeoutExceptions 调用 ForceReconnectAsync(),但前提是你使用大量的 ReconnectMinIntervalReconnectErrorThreshold。 否则,建立新连接可能会导致超时的服务器发生连锁故障,因为服务器已过载。

配置适当的超时

在连接复原能力方面必须考虑两个超时值:connect timeoutcommand timeout

连接超时

connect timeout 是指客户端等待与 Redis 服务器建立连接的时间。 将客户端库配置为使用 5 秒的 connect timeout,这样,即使在 CPU 负载较高的情况下,系统也有足够的时间建立连接。

如果 connection timeout 值很小,则无法保证在该期限内建立连接。 如果出现问题(客户端 CPU 负载过高、服务器 CPU 负载过高,等等),则使用很短的 connection timeout 值会导致连接尝试失败。 此行为通常会使问题变得更糟。 使用较短的超时不仅无助于解决问题,而且会加剧问题,这会强制系统重启尝试重新连接的进程,从而可能导致出现“连接 -> 失败 -> 重试”循环。

命令超时

大多数客户端库为 command timeouts(客户端等待 Redis 服务器做出响应的时间)使用另一种超时配置。 尽管我们建议使用不到 5 秒的初始设置,但请根据你的方案和存储在缓存中的值的大小来调高或调低 command timeout

如果 command timeout 太小,则连接可能不稳定。 但是,如果 command timeout 太大,则应用程序可能需要等待很长时间才能确定命令是否会超时。

避免出现客户端连接高峰

在连接断开后重新连接时,避免同时创建多个连接。 与使用很短的连接超时可能导致长时间的服务中断一样,同时发起多个重新连接尝试也会增大服务器负载,并延长所有客户端成功重新连接所需的时间。

如果要重新连接许多客户端实例,请考虑错开新的连接,以避免连接的客户端数出现陡峰。

注意

使用 StackExchange.Redis 客户端库时,请在连接字符串中将 abortConnect 设置为 false。 建议让 ConnectionMultiplexer 处理重新连接。 有关详细信息,请参阅 StackExchange.Redis 最佳做法

避免残余连接

缓存对每个缓存层的客户端连接数施加了限制。 确保客户端应用程序在重新创建连接时关闭并删除旧连接。

提前发出维护通知

使用通知来通告即将进行维护。 有关详细信息,请参阅我是否可以提前收到计划内维护的通知

计划维护时段

调整缓存设置以顺应维护工作。 有关创建维护时段以降低对缓存造成的任何负面影响的信息,请参阅计划更新

可实现复原的其他设计模式

应用设计模式来实现复原。 有关详细信息,请参阅如何使我的应用程序能够复原

空闲超时

Azure Cache for Redis 目前的连接空闲超时为 10 分钟,因此客户端应用程序中的空闲超时设置应小于 10 分钟。 大多数常用客户端库都有一个配置设置,客户端库可通过此设置自动定期将 Redis PING 命令发送到 Redis 服务器。 但是,如果使用的客户端库没有这种类型的设置,则客户应用程序本身将负责保持连接的活动状态。

后续步骤