3

SignalRアプリのスケールアウトを実装し、クラスター内の単一障害点を回避しようとしています。したがって、複数のRedisメッセージバスサーバーが必要です。

Redis Sentinelの実装に関する問題は、フェイルオーバー時に、クライアントが新しいエンドポイント[アドレス]に接続する必要があることです。これにより、SignalRアプリケーションを再起動する必要があります(Application_Start()で定義されたRedisエンドポイント)。

オプションではありません。

Booksleeveが役立つかどうか、どのように役立つかを理解しようとしています。これについて説明してもらいたいと思います。

問題は、メッセージバスに定義できるエンドポイントは1つだけであるということです。現在、ハードウェアソリューションはオプションではありません。

SignalRアプリケーションは、マスター/スレーブのリストを維持するBooksleeveラッパーに接続しますか?

AzureServiceBusを使用する別のオプション。ただし、Windows Azure Service Busプロバイダーの配線手順では、これにはまだ問題があることが示されています。

このWebサイトは、AzureWebロールで実行されるASP.NETサイトであることに注意してください。1.0alpha2の時点で、AzureWebSitesにいくつかのバグがあり、ServiceBusスケールアウトシナリオがうまく機能しないためです。私たちは将来のためにこれを解決するために取り組んでいます

4

2 に答える 2

3

SignalRがどのように接続するかについての詳細はわかりませんが、BookSleeveはすでにフェイルオーバーノードに対していくつかの譲歩を提供しています。特に、このメソッドは複数のConnectionUtils.Connectredisノードを含むことができる文字列(web.config構成値などに最適)を取り、BookSleeveは接続するのに最も適切なノードを見つけようとします。文字列で言及されているノードが通常のredisノードである場合、マスターへの接続を試みます。そうでない場合は、スレーブにフォールバックします(オプションでプロセスでスレーブをプロモートします)。言及されたノードがセンチネルノードである場合、接続するセレールを指名するようにセンチネルに要求します。

BookSleeveが現時点で提供していないのは、自動的に再接続する冗長接続ラッパーです。これはロードマップ上にありますが、呼び出し元のコードで行うのは難しくありません。redis-clusterサポートの実装と同時に、これに対するサポートをさらに追加する予定です。

しかし、それはすべてBookSleeveの観点からです-SignalRについて具体的にコメントすることはできません。

于 2012-12-21T08:35:30.037 に答える
1

BookSleeve 1.3.41.0は、Redisセンチネルをサポートしています。使用するデプロイメント構成:1つのマスターRedis、1つのスレーブRedis。各ボックスにはセンチネルがあります(マスター用に1つ、スレーブ用に1つ)。クライアントは最初にセンチネルに接続し、次にセンチネルはクライアントをアクティブマスターにリダイレクトします。

これは、クライアントコードでの実装方法です。

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を設定するのにホットです。 一般的な手順 Windows用のRedisをダウンロードhttp://redis.io/downloadUnzipto c:\ redis

マスター(最初のredisボックスのみ、そのような構成は1つのみ)

  1. Redisサービスの作成:redisディレクトリ内でコマンドを実行しますredis-server --service-install redis.conf --service-name redis
  2. Redisサービスを開始する
  3. Redisがポート6379をリストしていることを確認します

スレーブ(その他のボックス)

  1. slaveof masterAddr 6379redis.confを更新します。マスターモードのredisが実行されているアドレスである行を追加masterAddr します。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はクォーラム(サーバーがダウンしているかどうかを判断するホストの数)です。WebClientグループ名です。クライアントコードで指定しますConnectionUtils.Connect("...,serviceName=WebClient...")

  2. redisディレクトリ内にredissentinelservice:executeコマンドを作成しますredis-server --service-install redis-sentinel.conf --service-name redis-sentinel --sentinel
  3. redis-sentinelサービスを開始します
于 2014-10-16T12:39:17.473 に答える