【问题标题】:Can someone explain exactly how Booksleeve and Redis work together and it's application in a SignalR app?有人可以准确解释 Booksleeve 和 Redis 如何协同工作以及它在 SignalR 应用程序中的应用吗?
【发布时间】:2012-12-08 12:50:22
【问题描述】:

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

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

不是一个选项。

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

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

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

使用 Azure 服务总线的另一个选项。但是,Wiring Up the Windows Azure Service Bus Providerinstructions 表明这仍然存在问题:

请注意,此网站是一个以 Azure Web 角色运行的 ASP.NET 站点。 从 1.0alpha2 开始,AzureWebSites 中存在一些错误,因此 ServiceBus 横向扩展方案效果不佳。我们正在努力 为将来解决这个问题

【问题讨论】:

  • 您能否对您的 Redis 端点进行 DNS 解析?因此,您只需要在故障转移后更改您的指针记录(而不是重新启动应用程序池)。
  • 您尝试阅读代码了吗? github.com/SignalR/SignalR/blob/master/src/…。这是一个单一的文件,所以并不难理解。
  • 该错误警告不是特定于 Azure 网站(而不是云服务)吗?我就是这么读的。
  • 我现在检查了 SignalR 代码,它没有使用 ConnectionUtils... 所以 目前 SignalR 只会连接到单个节点。请注意,在 redis-cluster 到来之前,多个 redis 节点并不是严格意义上的“横向扩展方案”,因为任何组只能有一个主节点。当然,您可以使用从属设备进行查询(只读)和发布/订阅监听。
  • @dfowler 不过,它确实提出了一些有趣的观点;这里有其他的连接创建选项可以提供更大的灵活性(请参阅答案)

标签: redis signalr azureservicebus booksleeve


【解决方案1】:

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

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

但是:所有这些都是从 BookSleeve 的角度来看的 - 我无法具体评论 SignalR。

【讨论】:

  • 这是最近添加到 Booksleeve 的全新逻辑,并且在 SignalR 中提交了一个错误来支持它。我们将来会使其更加灵活,以便您可以传入连接工厂或类似的东西。
  • 是的,这正是我们所需要的。 Booksleeve 将在故障转移时发布下一个活动服务器的 IP 地址/端口。问题是 SignalR 只能接受一个端点。如果发生更改,则必须重新启动应用程序。目前,我能看到的唯一解决方法是使用静态 IP 地址(负载平衡器),并且 LB 执行故障转移。其他想法?
【解决方案2】:

BookSleeve 1.3.41.0 支持 Redis 哨兵。我们使用的部署配置: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

Master(只有第一个 redis box,只有一个这样的配置)

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

从属(其他盒子)

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

哨兵(主从通用)

  1. 创建文件 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...")

  2. 创建redis哨兵服务:在redis目录redis-server --service-install redis-sentinel.conf --service-name redis-sentinel --sentinel执行命令
  3. 启动 redis-sentinel 服务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2016-06-25
    • 1970-01-01
    • 2011-07-11
    • 2011-09-12
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多