我一直在寻找这个答案,但没有人证明如何成功地做到这一点。所以,我从Redis failover with StackExchange / Sentinel from C#获取了一些代码并创建了一个简单的代码块:
public static void Failover()
{
List<RedisConnection> redisConnections = _GetRedisConnections();
ConfigurationOptions configOpt = _CreateRedisConfiguration(CommandMap.Sentinel, null, redisConnections);
ConnectionMultiplexer cm = ConnectionMultiplexer.Connect(configOpt);
cm.GetSubscriber().Subscribe("+switch-master", WriteToConsole);
}
private List<RedisConnection> _GetRedisConnections()
{
List<RedisConnection> redisConnections = new List<RedisConnection>();
RedisConnection rc1 = new RedisConnection("localhost", 26379);
redisConnections.Add(rc1);
return redisConnections;
}
private ConfigurationOptions _CreateRedisConfiguration(CommandMap commandMap, string password, List<RedisConnection> connections)
{
ConfigurationOptions connection = new ConfigurationOptions
{
CommandMap = commandMap,
AbortOnConnectFail = true,
AllowAdmin = true,
TieBreaker = string.Empty
};
connections.ForEach(s => {connection.EndPoints.Add(s.Host, .Port);});
return connection;
}
private void WriteToConsole(RedisChannel channel, RedisValue value)
{
Debug.WriteLine("Hello!");
}
这里,在应用程序启动时调用Failover()
方法。在此方法中,我只是创建与部署到当前服务器的Sentinel服务器的连接。然后我尝试订阅Sentinel的“+ switch-master”事件。事件处理程序WriteToConsole
是一个简单的方法,只是告诉我我的应用程序实际上是在监听事件。
我希望最终能够在WriteToConsole
占位符方法中添加逻辑,以切换到新的主Redis服务器。
但是此设置无效。当我停止有问题的Sentinel监控的主Redis服务器时,我看不到对应用程序有任何影响或控制台对话框弹出。我究竟做错了什么?我正朝着正确的方向前进吗?