【问题标题】:Can't reconnect to Azure Redis via StackExchange.Redis无法通过 StackExchange.Redis 重新连接到 Azure Redis
【发布时间】:2023-03-12 23:12:01
【问题描述】:

警告:好的,这是一个奇怪的地方,我不确定 SO 是否是正确的地方。

我有一个连接到 Azure Redis 缓存实例的 Azure 网站。 (使用 StackExchange.Redis)

一切都很好,然后有一天 - 网站无法连接到 Redis。

错误:

无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。 PING 上的 Socket 失败

这是我的连接字符串:

mycache.redis.cache.windows.net,ssl=true,password=xxxxxx,syncTimeout=5000

这是我的诊断步骤:

  1. 尝试从本地连接到 Azure Redis。结果:成功(所以代码是好的?)
  2. 尝试启动新的 Azure Redis 实例,从 Azure 连接。结果:失败(网站无法连接到任何 azure Redis 实例?)
  3. 启动新的 Azure 网站,代码与错误代码相同,指向现有的 Redis 缓存。结果:成功(嗯,什么?)
  4. 新建 MVC 网站,添加 StackExchange.Redis,部署到新的 Azure 网站,连接到 Redis。结果:成功(所以 Redis 很好?)
  5. 将上述 vanilla MVC 网站部署到 现有 Azure 网站(因此与 4 相同的代码,连接到相同的 Redis,唯一的区别是它使用旧的 Azure 网站物理机/网络)。结果:失败(wtf??)

所以 - 我认为 Redis 已将 Azure 网站“列入黑名单”? (这甚至可能吗?)我知道客户端(我的代码)不会尝试继续重新连接,但我已经多次退回该站点,它就是无法重新连接到 Redis .

启动一个 新的 Azure 网站,使用 相同的代码 连接到 相同的 Redis 实例 会成功,这一事实告诉我Azure/Redis 中出现了某种黑名单/路由问题。

有什么想法吗?

编辑

看起来问题出在 Azure VNET 上。当我的网站是 Azure 虚拟网络的一部分时,它无法连接到 Redis。但是当我将它 从网络中取出时,它连接良好。在今天之前,此设置运行良好。

所以我想知道 Azure 是否进行了更改以使 VNET 中的网站无法连接到 Azure Redis? (我知道没有意义)

编辑 2

附件是 Redis 连接尝试的日志。

异常:无法连接到 redis 服务器;到 创建一个断开连接的多路复用器,禁用 AbortOnConnectFail。 PING 上的 SocketFailure connection-string-removed:6380,password=password-removed,ssl=True 正在连接 connection-string-removed:6380/Interactive... BeginConnect: connection-string-removed:6380 1 个唯一节点 指定从 connection-string-removed:6380

请求 tie-break

__Booksleeve_TieBreak...允许端点 00:00:05 响应...等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), 工作人员:(忙=4,空闲=32763,最小=1,最大=32767)未完成所有任务 干净,IOCP:(忙碌=0,空闲=1000,最小=1,最大=1000),工人: (忙=5,空闲=32762,最小=1,最大=32767)连接字符串已删除:6380 没有响应等待任务完成,IOCP: (忙=0,空闲=1000,最小=1,最大=1000),工人: (忙碌=5,空闲=32762,Min=1,Max=32767) 并非所有任务都干净利落地完成, IOCP:(忙=0,空闲=1000,最小=1,最大=1000),工人: (忙=5,空闲=32762,最小=1,最大=32767)连接字符串已删除:6380 未能提名 (WaitingForActivation) 未检测到主机 connection-string-removed:6380:独立 v2.0.0,master;保活:00:01:00; int:连接;子:连接;未使用: DidNotRespond connection-string-removed:6380: int ops=0, qu=2, qs=0,qc=0,wr=0,socks=1;子操作=0,qu=0,qs=0,qc=0,wr=0,socks=1 循环操作计数快照; int: 0 (0.00 ops/s; 跨越 10s);子:0 (0.00 ops/s;跨越 10 秒)同步超时:0;一劳永逸:0;最后的 心跳:-1s 前重置失败的连接以重试...重试; 剩余尝试次数:2...1 个指定的唯一节点 connection-string-removed:6380 > __Booksleeve_TieBreak...允许端点 00:00:05 响应...等待任务完成,IOCP: (忙=0,空闲=1000,最小=1,最大=1000),工人: (忙碌=6,空闲=32761,Min=1,Max=32767) 并非所有任务都干净利落地完成, IOCP:(忙=0,空闲=1000,最小=1,最大=1000),工人: (忙=7,空闲=32760,最小=1,最大=32767)连接字符串已删除:6380 没有响应等待任务完成,IOCP: (忙=0,空闲=1000,最小=1,最大=1000),工人: (忙碌=7,空闲=32760,Min=1,Max=32767) 并非所有任务都干净利落地完成, IOCP:(忙=0,空闲=1000,最小=1,最大=1000),工人: (忙=7,空闲=32760,最小=1,最大=32767)连接字符串已删除:6380 未能提名 (WaitingForActivation) 未检测到主机 connection-string-removed:6380:独立 v2.0.0,master;保活:00:01:00; int:连接;子:连接;未使用: DidNotRespond connection-string-removed:6380: int ops=0, qu=2, qs=0,qc=0,wr=0,异步=3,socks=2;子操作=0,qu=0,qs=0,qc=0,wr=0, socks=2 循环操作计数快照; int: 0 (0.00 ops/s; 跨越 10s); sub: 0​​ (0.00 ops/s; 跨越 10s) 同步超时: 0;一劳永逸:0; 最后一次心跳:-1 秒前重置失败的连接以重试... 重试;剩余尝试次数:1... 1 个指定的唯一节点 连接字符串删除:6380 > __Booksleeve_TieBreak... 允许端点 00:00:05 响应... 等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), 工人:(忙碌=8,空闲=32759,最小=1,最大=32767) EndConnect: connection-string-removed:6380 (socket shutdown) 连接完成:connection-string-removed:6380 所有任务干净完成,IOCP: (Busy=0,Free=1000 ,Min=1,Max=1000),工人: (忙=11,空闲=32756,最小=1,最大=32767) connection-string-removed:6380 故障:PING 上的 SocketFailure 等待任务完成,IOCP:(Busy=0,Free=1000,Min=1,Max=1000), 工作人员:(忙=11,空闲=32756,最小=1,最大=32767)未完成所有任务 干净,IOCP:(忙碌=0,空闲=1000,最小=1,最大=1000),工人: (忙=7,空闲=32760,最小=1,最大=32767)连接字符串已删除:6380 未能提名 (WaitingForActivation) 未检测到主机 connection-string-removed:6380:独立 v2.0.0,master;保活:00:01:00; int:连接;子:连接;未使用: DidNotRespond connection-string-removed:6380: int ops=0, qu=2, qs=0,qc=0,wr=0,异步=7,socks=3;子操作=0,qu=0,qs=0,qc=0,wr=0, socks=3 循环操作计数快照; int: 0 (0.00 ops/s; 跨越 10s); sub: 0​​ (0.00 ops/s; 跨越 10s) 同步超时: 0;一劳永逸:0; 最后一次心跳:-1 秒前

谁能破译这个?

【问题讨论】:

  • @marcgravell 请到场 :)
  • Azure Redis 没有任何关于 VNET 支持或将站点列入黑名单的逻辑,因此问题不太可能出现在 Azure Redis 方面。请向 Microsoft.com 上的 azurecache 发送电子邮件,并附上您的缓存名称以及您看到故障的网站名称,我们将看看我们是否能弄清楚发生了什么...
  • 嗨@JonCole 谢谢。 :) 我已通过电子邮件发送“azurecache@microsoft.com”。有趣的是,只要我将它从 VNET 中取出,它就可以正常工作。连接到第三方 Redis 服务(例如 RedisLabs)也是如此。在 VNET 中 = 失败,在 VNET 之外 = 成功。
  • @JonCole - 我没有收到任何回复。 azurecache@microsoft.com 是正确的电子邮件吗?
  • 是的,这是正确的。我们今天会尽量回复。

标签: .net redis azure-web-app-service stackexchange.redis azure-redis-cache


【解决方案1】:

我在 Azure Web Apps 团队工作 - 您的 VNET 似乎进入了一个特别奇怪的状态,并且正在中断您的应用程序的网络连接。我已修复此行为。

对于给您带来的不便,我们深表歉意...

【讨论】:

  • 嗨,Aleks,谢谢 - 但请您确认几件事。 1)您指的是哪些 VNET/网站/Redis 实例(我们在多个环境中遇到此问题),2)问题是什么,3)您何时解决问题,4)这与我提出的票有关? (如果是这样,请您回复那里,而不是 SO)
  • 由于电子邮件,我正在回复。我会在支持票中为您提供更多信息。
【解决方案2】:

我们可能会遇到同样的问题。我能够在没有虚拟网络的情况下将测试应用程序放到 Azure 中的 Web 应用程序上,并且它开箱即用(使用 Stackexchange.Redis)。当我将相同的代码放到属于虚拟网络一部分的 Web 应用程序上时,它不起作用。

通过将 AbortOnConnectFail 设置为 false,我设法修复了第一个错误(“无法连接到 redis 服务器..”)。然后我收到错误“没有可用的连接来服务此操作:EXISTS foo”(= 在这种情况下,尝试检查键 'foo' 是否存在)。

我也可以通过将 ConnectTimeout 设置为 10 秒来解决这个问题。所以基本上,我可以让它工作,但是当(我假设)SE.Redis 失去连接并尝试重新连接时,这似乎会导致长时间的延迟。

【讨论】:

  • 是的,abortOnConnect 为我修复了初始连接问题,但有时我仍然遇到连接问题。网络故障发生了,我们只需要处理它。
  • Azure 支持帮助我们解决了这个问题,结果发现虚拟网络配置不正确。它设置了两个无效的 DNS 服务器,这导致了 Redis 问题(它还导致了其他问题,已解决)。我删除了 DNS 服务器,一切都开始工作了。
【解决方案3】:

如果以上帖子没有帮助,您可以检查:

  • 仔细检查您的密码(私钥)是否正确
  • 如果您的应用是可执行的,请尝试在项目属性中选中/取消选中“32 位首选”。
  • 尝试从 Azure redis 端(从 ui)关闭 ssl 并尝试将 useSsl 设置为 false。
  • 下载源代码(从那里:https://github.com/StackExchange/StackExchange.Redis)并尝试调试内部问题。

部分操作帮助了我。

【讨论】:

    猜你喜欢
    • 2019-09-28
    • 2015-06-16
    • 2016-12-03
    • 2022-11-13
    • 2020-04-20
    • 1970-01-01
    • 2014-07-04
    • 2023-03-12
    • 2019-08-05
    相关资源
    最近更新 更多