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

时间:2015-04-13 06:45:39

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

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我一直有类似的问题,Redis作为会话存储的后备失败,并且我找不到任何允许故障转移/故障回复到另一个SessionStateProvider的东西。

我希望那里可以在内存表或类似表中同时写入Redis和SqlServer的内容,然后如果从2中读取失败则从1中读取。但是,这似乎还不存在。

答案 2 :(得分:-1)

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

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();
            }
        });