3

我们正在为我们的 SignalR 应用程序实现横向扩展,并试图避免集群中的单点故障。因此,需要不止一个 Redis 消息总线服务器。

实现 Redis Sentinel 的问题在于,在故障转移时,客户端需要连接到新的端点 [地址],这将需要重新启动 SignalR 应用程序(在 Application_Start() 中定义的 Redis 端点)。

不是一个选择。

我试图了解 Booksleeve 是否/如何提供帮助,并希望有人对此进行解释。

问题是我们只能为消息总线定义一个端点。硬件解决方案目前不是一种选择。

SignalR 应用程序是否会连接到维护主/从列表的 Booksleeve 包装器?

使用 Azure 服务总线的另一种选择。但是,Wiring Up the Windows Azure Service Bus Provider 的说明表明仍然存在问题:

请注意,此网站是在 Azure Web 角色中运行的 ASP.NET 站点。从 1.0alpha2 开始,AzureWebSites 中存在一些错误,导致 ServiceBus 横向扩展方案无法正常工作。我们正在努力为未来解决这个问题

4

2 回答 2

3

我不知道 SignalR 如何进行连接的细节,但是:BookSleeve 已经为故障转移节点提供了一些让步。特别是,该ConnectionUtils.Connect方法采用一个字符串(适用于 web.config 配置值等),它可以包括多个redis 节点,然后 BookSleeve 将尝试找到最合适的节点来连接。如果字符串中提到的节点是常规的 redis 节点,它将尝试连接到主节点,否则会回退到从节点(可选地在进程中提升从节点)。如果提到的节点是哨兵节点,它将要求哨兵指定一个服务器来连接。

BookSleeve目前不提供的是会自动重新连接的冗余连接包装器。这在路线图上,但在调用代码中并不难做到。我计划在实现 redis-cluster 支持的同时为此添加更多支持。

但是:所有这些都是从 BookSleeve 的角度来看的——我不能具体评论 SignalR。

于 2012-12-21T08:35:30.037 回答
1

BookSleeve 1.3.41.0 支持 Redis sentinel。我们使用的部署配置:1个master redis,1个slave redis。每个盒子都有哨兵(一个给主人,一个给奴隶)。客户端首先连接到哨兵,然后哨兵将它们重定向到活动主服务器。

这是它在客户端代码中的实现方式:

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 盒子,只有一个这样的配置)

  1. 创建Redis服务:在redis目录下执行命令redis-server --service-install redis.conf --service-name redis
  2. 启动 Redis 服务
  3. 确保 Redis 列出端口 6379

奴隶(其他箱子)

  1. 更新 redis.conf:添加slaveof masterAddr 6379wheremasterAddr 是主模式下 redis 运行的地址,6379 是默认的 redis 端口。
  2. 创建Redis服务:在redis目录下执行命令redis-server --service-install redis.conf --service-name redis
  3. 启动 Redis 服务
  4. 确保 Redis 列出端口 6379

Sentinel(主从通用)

  1. 使用以下内容创建文件 redis-sentinel.conf: port 26379 logfile "redis-sentinel1.log" sentinel monitor WebClient masterAddr 6379 1

    其中 masterAddr 是在主模式下运行 redis 的地址,6379 是默认 redis 端口,1 是仲裁(做出决定的主机数是服务器关闭与否)。WebClient是组名。您在客户端代码中指定它ConnectionUtils.Connect("...,serviceName=WebClient...")

  2. 在redis目录下创建redis sentinel service:execute commandredis-server --service-install redis-sentinel.conf --service-name redis-sentinel --sentinel
  3. 启动 redis-sentinel 服务
于 2014-10-16T12:39:17.473 回答