我们正在为SignalR应用程序实施横向扩展,并尝试避免群集中出现单点故障。因此,需要多个Redis消息总线服务器。
与实施Redis的哨兵的问题是,在故障转移,一个客户端需要连接到一个新的端点[地址],这将需要应用SignalR被重新启动(在定义的Application_Start Redis的端点())。
不是一种选择。
我正在努力了解Booksleeve是否/如何提供帮助,并希望有人解释一下。
问题是我们只能为消息总线定义一个单一端点。硬件解决方案目前不是一种选择。
SignalR应用程序是否会连接到Booksleeve包装器,它会维护主/从列表?
使用Azure Service Bus的另一个选项。但是,连接Windows Azure服务总线提供程序的instructions表示仍存在此问题:
请注意,此网站是一个以Azure Web角色运行的ASP.NET网站。 从1.0alpha2开始,AzureWebSites中存在一些错误 ServiceBus横向扩展方案不能很好地工作。我们正在努力 为将来解决这个问题
答案 0 :(得分:3)
我不知道SignalR如何进行连接的具体细节,但是:BookSleeve已经为故障转移节点提供了一些让步。特别是,ConnectionUtils.Connect
方法采用字符串(对于web.config配置值等是理想的),其中可以包含多个 redis节点,然后BookSleeve将尝试找到最合适的节点连接至。如果字符串中提到的节点是常规redis节点,它将尝试连接到主节点,否则将返回到从节点(可选择在进程中提升从节点)。如果提到的节点是sentinel节点,它将要求sentinel指定一个serer连接。
BookSleeve 目前提供的是一个冗余的连接包装器,它将自动重新连接。这是在路线图上,但在调用代码中并不难做到。我计划在实施redis-cluster支持的同时为此添加更多支持。
但是:所有这些都来自BookSleeve的观点 - 我不能专门评论SignalR。
答案 1 :(得分:1)
BookSleeve 1.3.41.0支持Redis哨兵。我们使用的部署配置:1个主机redis,1个从机redis。每个盒子都有哨兵(一个用于主人,一个用于奴隶)。客户端首先连接到sentinel,然后将sentinel重定向到活动主服务器。
这是在客户端代码中实现的方式:
public class OwinStartup
{
public void Configuration(IAppBuilder app)
{
var config = new WebClientRedisScaleoutConfiguration();
GlobalHost.DependencyResolver.UseRedis(config);
app.MapSignalR();
}
}
public class WebClientRedisScaleoutConfiguration : RedisScaleoutConfiguration
{
public WebClientRedisScaleoutConfiguration()
: base(() => getRedisConnection(), WebUIConfiguration.Default.Redis.EventKey)
{ }
private static BookSleeve.RedisConnection _recentConnection;
private static BookSleeve.RedisConnection getRedisConnection()
{
var log = new TraceTextWriter();
var connection = BookSleeve.ConnectionUtils.Connect("sentinel1:23679,sentinel2:23679,serviceName=WebClient", log);
if (connection != null)
{
_recentConnection = connection;
return connection;
}
if (_recentConnection != null)
{
return _recentConnection;
}
// Cannot return null nor throw exception -- this will break reconnection cycle.
return new BookSleeve.RedisConnection(string.Empty);
}
}
热配置redis。 常用步骤 下载Redis for windows http://redis.io/download 解压缩到c:\ redis
主人(只有第一个redis框,只有一个这样的配置)
redis-server --service-install redis.conf --service-name redis
奴隶(其他方框)
slaveof masterAddr 6379
masterAddr
是主模式下redis运行的地址,默认为6379
雷迪斯港。 redis-server --service-install redis.conf --service-name redis
Sentinel(主要和奴隶共同)
使用内容创建文件redis-sentinel.conf:
port 26379
logfile "redis-sentinel1.log"
sentinel monitor WebClient masterAddr 6379 1
其中masterAddr是运行主模式的redis的地址,
6379是默认的redis端口,1是quorum(主机的数量
决定服务器是否关闭)。 WebClient
是组名。您可以在客户端代码ConnectionUtils.Connect("...,serviceName=WebClient...")
redis-server --service-install redis-sentinel.conf --service-name redis-sentinel --sentinel