【问题标题】:StackExchange.Redis ConnectionMultiplexer.Connect() Intermittently WorksStackExchange.Redis ConnectionMultiplexer.Connect() 间歇性工作
【发布时间】:2014-06-03 07:34:47
【问题描述】:

我正在使用StackExchange.Redis 与 3 个不同的 Redis 实例通信:1 个在同一子网上,2 个远程。这是我的配置代码:

var configurationOptions = new ConfigurationOptions
{
    EndPoints =
    {
        { host, port }
    },
    KeepAlive = 180,
    Password = password,
    DefaultVersion = new Version("2.8.5"),
    // Needed for cache clear
    AllowAdmin = true
};

var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions );

最后一行大约 70% 的时间会引发连接异常:

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

为什么这是间歇性的和/或我做错了什么?当我在命令提示符下 ping Redis 服务器时,丢包率为 0%,响应时间小于 1 毫秒。网络稳定。

谢谢!

编辑

以下是失败时的日志输出:

10.48.68.28:6379,keepAlive=180,version=2.8.5

1 unique nodes specified
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:01 to respond...
10.48.68.28:6379 did not respond
10.48.68.28:6379 failed to nominate (WaitingForActivation)
No masters detected
10.48.68.28:6379: Standalone v2.8.5, master; keep-alive: 00:03:00; int: Connecting; sub: ConnectedEstablished, 1 active; not in use: DidNotRespond
10.48.68.28:6379: int ops=0, qu=4, qs=0, qc=0, wr=0, socks=1; sub ops=2, qu=0, qs=0, qc=0, wr=0, subs=1, sync=2, socks=1
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0+2=2 (0.20 ops/s; spans 10s)
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
Starting heartbeat...

【问题讨论】:

  • 如果你传入一个 TextWriter 作为日志参数(StringWriter 工作正常) - 它说明了什么?
  • LSO:这在第一次启动时是否正确?第一次?我想知道 JIT / Fusion / DNS / etc 是多少
  • 在启动时,第一次。当我将同步超时扩展到 30000 毫秒时,它没有帮助。总是等待最大值并失败。现在尝试BookSleeve 看看它是否有效。
  • qu=4 对我来说非常很有趣 - 它表明作者没有开始。你能告诉我你使用的是什么版本吗?基本上 qu 是未发送队列:有 4 条消息由于某种原因尚未发送。这让我很困扰。
  • 它正在连接而不是建立连接这一事实也很有趣

标签: c# redis booksleeve stackexchange.redis


【解决方案1】:

当连接到 Redis 时,我可以通过在客户端上设置 ConnectTimeout 来解决这个问题。 这是我的代码

 ConnectionMultiplexer connection = 
        ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000");

【讨论】:

    【解决方案2】:

    这似乎是一个比较常见的问题:https://github.com/StackExchange/StackExchange.Redis/issues/42

    我刚刚下载了新版本,并没有再次发现问题。然而。

    【讨论】:

      【解决方案3】:

      我可以通过这样做来解决上述问题:

      您遇到的错误通常表明您没有在连接字符串中设置 abortConnect=false。 abortConnect 的默认值为 true,这使得 StackExchange.Redis 在某些情况下不会自动重新连接到服务器。我们强烈建议您在连接字符串中设置 abortConnect=false,以便 SE.Redis 在发生网络中断时在后台自动重新连接。

      来源:https://stackoverflow.com/a/30918632/2236811

      所以我的 init() 看起来像这样

       ConfigurationOptions co = new ConfigurationOptions()
              {
                  SyncTimeout = 500000,
                  EndPoints =
                  {
                      {url,portNumber }
                  },
                  AbortOnConnectFail = false // this prevents that error
              };
      
              seClient = ConnectionMultiplexer.Connect(co);
      

      谢谢

      【讨论】:

        【解决方案4】:

        对我来说,这个错误是因为连接总数达到了最大限制,即 10K。重新启动客户端并杀死其中一些解决了问题。您可以检查 Azure 门户并确定您是否已达到任何资源的最大限制。

        【讨论】:

          猜你喜欢
          • 2017-06-13
          • 1970-01-01
          • 1970-01-01
          • 2019-11-22
          • 2015-12-02
          • 2020-06-12
          • 2012-08-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多