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 会话状态提供程序故障转移方案的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL Azure 从会话状态提供程序(实体框架)持续接收“超时时间已过”
无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动