ASP.Net 会话状态提供程序故障转移方案

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

所以没有办法像 ASP.Net InProc 那样配置 redis 的替代方案 查看这张票***.com/questions/15437334/… @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 文件中的代码

以上是关于ASP.Net 会话状态提供程序故障转移方案的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET 会话状态服务跨应用程序共享会话

非锁定进程内 ASP.NET 会话状态存储

使用 SQL Azure 从会话状态提供程序(实体框架)持续接收“超时时间已过”

无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

什么是 ASP.NET 中的默认会话超时?

Asp.net 会话越界/混淆