【问题标题】:ASP.Net Session State Provider Failover ScenarioASP.Net 会话状态提供程序故障转移方案
【发布时间】:2015-06-18 09:48:45
【问题描述】:

我们已经为我们的 Web 应用程序实现了 Redis 会话状态提供程序,它就像一个魅力,但我想知道如果 Redis 服务器出现故障或 Web 服务器无法连接到 Redis 服务器会发生什么。

有没有办法使用 InProc 会话状态管理作为 Redis 的故障转移? 我找不到任何关于声明多个会话状态提供程序的文档,所以如果 redis 失败,系统可以继续使用 inproc 工作。 (我接受在 redis 中丢失会话状态,并在失败的情况下从头开始,并在进程中再次丢失会话状态,如果 redis 可用,则从头开始)

【问题讨论】:

    标签: asp.net session redis session-state inproc


    【解决方案1】:

    你需要为你的 redis-server 定义 slave 并使用 redis sentinel 来监控你的服务器

    【讨论】:

    • 所以没有办法像 ASP.Net InProc 那样配置 redis 的替代方案
    • @alirezam 我不相信 ASP.NET Redis 会话状态提供程序支持 redis 哨兵。如果你不知道,我会很高兴错了。
    • 对不起,我的回复迟了。您使用哨兵来配置您的 redis。在 asp.net 中,您订阅哨兵服务器并在服务器更改时收听事件,并且基于新服务器,您可以更新您的 webconfig
    • 更新 web.config 不是一个好主意。有没有其他办法?
    【解决方案2】:

    我遇到了类似的问题,Redis 作为我们会话存储的支持失败,我找不到任何允许故障转移/故障回复到其他 SessionStateProvider 的东西。

    我希望有一些东西可以写入 mem 表或类似表中的 Redis 和 SqlServer,然后从 1 读取,如果从 2 读取失败。但是,这似乎还不存在。

    【讨论】:

      【解决方案3】:

      我正在使用 StackExchange 库连接到 redis 服务器。这只是一个简单的代码,它只是显示如何订阅事件而不是将其作为最终解决方案。每当哨兵选择新服务器时,您都会收到一个事件所以你可以选择新的服务器。

      ConnectionMultiplexer multiplexer =
         ConnectionMultiplexer.Connect(new ConfigurationOptions
         {
             CommandMap = CommandMap.Sentinel,
             EndPoints = { { "127.0.0.1", 26379 }, { "127.0.0.1", 26380 } },
             AllowAdmin = true,
             TieBreaker = "",
             ServiceName = "mymaster",
             SyncTimeout = 5000
         }); 
          multiplexer.GetSubscriber().Subscribe("*", (c, m) =>
              {
      
                  Debug.WriteLine("the message=" + m);
                  Debug.WriteLine("channel=" + c);
      
                  try
                  {
                      var sentinelServer = multiplexer.GetServer("127.0.0.1", 26379).SentinelGetMasterAddressByName("mymaster");
                      Debug.WriteLine("Current server=" + sentinelServer);
                      Debug.Flush();
                  }
                  catch (Exception)
                  {
                      var sentinelServer = multiplexer.GetServer("127.0.0.1", 26380).SentinelGetMasterAddressByName("mymaster");
                      Debug.WriteLine("Current server=" + sentinelServer );
                      Debug.Flush();
                  }
              });
      

      【讨论】:

      • 你不会订阅“+switch-master”事件吗?此外,您的代码并没有准确说明在应用程序中是如何进行切换的。您能否详细说明事件处理程序?
      • 您需要从 StackExchange 导入库并使用 global.asax 文件中的代码
      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多