5

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

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

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

错误:

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

这是我的连接字符串:

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。

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

有任何想法吗?

编辑

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

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

编辑 2

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

例外:无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。PING 连接字符串删除时的SocketFailure :6380,密码 =密码删除,ssl=True 连接连接字符串删除:6380/交互式... BeginConnect:连接字符串删除:6380 指定了 1 个唯一节点 请求平局从连接字符串删除:6380

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

谁能破译这个?

4

3 回答 3

2

我是 Azure Web Apps 团队的一员——看起来你的 VNET 进入了一个特别奇怪的状态,并且正在中断你的应用程序的网络连接。我已经修复了这种行为。

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

于 2015-06-24T18:26:34.323 回答
0

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

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

这种操纵的一部分帮助了我。

于 2015-09-29T20:11:20.387 回答
0

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

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

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

于 2015-07-22T12:20:36.937 回答