sql >> データベース >  >> NoSQL >> Redis

RedisSentinel

    Redis Sentinelは、既存のRedisマスターインスタンスとスレーブインスタンスをアクティブに監視して、それぞれが期待どおりに機能していることを確認するために、多数の追加のRedisセンチネルプロセスを実行することにより、可用性の高いRedis構成を実行するための公式の推奨事項です。コンセンサスにより、マスターが使用できなくなったと判断された場合、マスターは自動的にフェイルオーバーし、複製されたスレーブの1つを新しいマスターとして昇格させます。センチネルは、利用可能なredisインスタンスの信頼できるリストも維持し、クライアントが接続できる利用可能なインスタンスを検出するための中央リポジトリを提供します。

    Redis Sentinelのサポートは、RedisSentinelで利用できます。 利用可能なSentinelをリッスンして、利用可能なマスター、スレーブ、およびその他のSentinel Redisインスタンスのリストを取得し、Redisクライアントマネージャーの構成と保守に使用して、報告されたとおりにフェイルオーバーを開始するクラス。

    使用法#

    新しいSentinelサポートを使用するには、Redisクライアントマネージャーにマスターインスタンスとスレーブインスタンスの接続文字列を入力する代わりに、単一のRedisSentinelを作成します。 実行中のRedisセンチネルの接続文字列で構成されたインスタンス:

    var sentinelHosts = new[]{ "sentinel1", "sentinel2:6390", "sentinel3" };
    var sentinel = new RedisSentinel(sentinelHosts, masterName: "mymaster");
    

    これは、RedisSentinelを構成する典型的な例を示しています。 これは、3つのセンチネルホストを参照します(つまり、ノードの障害に耐えることができる高可用性セットアップの最小数)。また、mymasterを参照するように構成されています 構成セット(デフォルトのマスターグループ)。

    情報

    Redis Sentinelsは、それぞれが異なるマスターグループ名を持つ複数のマスター/スレーブグループを監視できます。

    番兵のデフォルトのポートは26379 (指定されていない場合)RedisSentinelは他のセンチネルを自動検出できるため、必要な最小構成は次のとおりです。

    var sentinel = new RedisSentinel("sentinel1");
    

    情報

    ScanForOtherSentinels=falseを使用すると、他のセンチネルのスキャンと自動検出を無効にできます。

    センチネルの監視を開始します#

    構成が完了すると、Redis Sentinelサーバーの監視を開始し、次のコマンドで事前構成されたクライアントマネージャーにアクセスできます。

    IRedisClientsManager redisManager = sentinel.Start();
    

    以前と同様に、ご希望のIOCにシングルトンとして登録できます。 インスタンス:

    container.Register<IRedisClientsManager>(c => sentinel.Start());
    

    高度なセンチネル構成#

    RedisSentinelは、デフォルトで、構成済みのPooledRedisClientManagerを管理します 読み取り/書き込み用に両方のマスターRedisクライアントを解決するインスタンスGetClient() および読み取り専用のスレーブGetReadOnlyClient() API。

    これは、新しいRedisManagerPoolを使用するように変更できます。 と:

    sentinel.RedisManagerFactory = (master,slaves) => new RedisManagerPool(master);
    

    カスタムRedis接続文字列#

    RedisSentinelが構成されているホストは、そのSentinelホストにのみ適用されます。カスタムのHostFilterを指定することで、Redis接続文字列の柔軟性を使用して個々のRedisクライアントを構成できます。 :

    sentinel.HostFilter = host => "{0}?db=1&RetryTimeout=5000".Fmt(host);
    

    これにより、データベース1と5秒の再試行タイムアウト(新しい自動再試行機能で使用)を使用するように構成されたクライアントが返されます。

    その他のRedisSentinel構成#

    上記は通常使用される一般的なSentinel構成をカバーしていますが、RedisSentinelのほぼすべての側面 動作は以下の構成でカスタマイズ可能です:

    OnSentinelMessageReceived SentinelワーカーがSentinelサブスクリプションからメッセージを受信したときに発生します
    OnFailover SentinelがRedisClientManagerを新しいマスターにフェイルオーバーしたときに発生します
    OnWorkerError RedisSentinelWorker接続が失敗したときに発生します
    IpAddressMap Sentinelsから返された内部RedisホストIPを外部IPにマッピングします
    ScanForOtherSentinels 他のセンチネルホストを定期的にスキャンするかどうか(デフォルトはtrue)
    RefreshSentinelHostsAfter 他のセンチネルホストをスキャンする間隔(デフォルトは10分)
    WaitBetweenFailedHosts 失敗してから次のredisインスタンスに接続するまでの待機時間(デフォルトは250ms)
    MaxWaitBetweenFailedHosts スローする前にホストへの接続を再試行する時間(デフォルトは60秒)
    WaitBeforeForcingMasterFailover フェイルオーバーの強制試行が連続して失敗した後の時間(デフォルトは60秒)
    ResetWhenSubjectivelyDown Sentinelがredisが主観的にダウンしていると報告したときにクライアントをリセットします(デフォルトはtrue)
    ResetWhenObjectivelyDown Sentinelがredisが客観的にダウンしていると報告したときにクライアントをリセットします(デフォルトはtrue)
    SentinelWorkerConnectTimeoutMs Sentinelワーカーの最大接続時間(デフォルトは100ミリ秒)
    SentinelWorkerSendTimeoutMs Sentinelワーカーの最大TCPソケット送信時間(デフォルトは100ミリ秒)
    SentinelWorkerReceiveTimeoutMs Sentinelワーカーの最大TCPソケット受信時間(デフォルトは100ms)

    Redis Sentinelサーバーの構成#

    redis configプロジェクトは、単一(または複数)のWindows、OSX、またはLinuxサーバーで最小限の高可用性Redis Sentinel構成を即座にセットアップするための開始/停止スクリプトを含む、高可用性マルチノードRedisSentinel構成のセットアップと実行を簡素化します。このシングルサーバー/マルチプロセス構成は、単一の開発ワークステーションまたはリモートサーバーで動作するセンチネル構成をセットアップするのに理想的です。

    redis-configリポジトリにはMSOpenTechWindows redisバイナリも含まれており、ソフトウェアをインストールする必要はありません。

    Windowsの使用法#

    含まれているSentinel構成を実行するには、実行するサーバーにredis-configリポジトリのクローンを作成します。

    git clone https://github.com/ServiceStack/redis-config.git
    

    次に、1xマスター、2xスレーブ、3xSentinelのredisサーバーを次のコマンドで起動します。

    cd redis-config\sentinel3\windows
    start-all.cmd
    

    開始されたインスタンスのシャットダウン:

    stop-all.cmd
    

    開発ワークステーションでローカルにredisプロセスを実行している場合、実行中のインスタンスに接続するための最小限の構成は次のとおりです。

    var sentinel = new RedisSentinel("127.0.0.1:26380");
    container.Register(c => sentinel.Start());
    

    ローカルホストとネットワークIPの#

    センチネル構成は、すべてのredisインスタンスが 127.0.0.1でローカルに実行されていることを前提としています 。代わりに、ネットワーク内のすべての開発者がアクセスできるようにするリモートサーバーで実行している場合は、*.confのIPアドレスを変更する必要があります。 サーバーのネットワークIPを使用するファイル。それ以外の場合は、デフォルトのままにして、RedisSentinelを使用できます。 ネットワーク上の各PCが接続できるネットワークIPにローカルホストIPを透過的にマップするIPアドレスマップ機能。

    例えば。これが10.0.0.9のリモートサーバーで実行されている場合 ネットワークIP、次のように構成できます:

    var sentinel = new RedisSentinel("10.0.0.9:26380") {
        IpAddressMap = {
            {"127.0.0.1", "10.0.0.9"},
        }
    };
    container.Register(c => sentinel.Start());
    

    Google Cloud-クリックしてRedisをデプロイする#

    マルチノードを即座にセットアップできる、私たちが見つけた最も簡単なクラウドサービス-Redis Sentinel Configurationは、GoogleCloudのクリックを使用してDeploy&Manageの下のGoogleCloudConsoleから利用できるRedis機能をデプロイします :

    デプロイをクリックします ボタンをクリックすると、Redis VMをデプロイするタイプ、サイズ、および場所を構成できます。 Google Cloudで高可用性Redis構成を設定および検査するためのウォークスルーについては、完全なClick toDeployRedisガイドをご覧ください。

    RedisManagerPoolを使用するように変更#

    デフォルトでは、RedisSentinelはPooledRedisClientManagerを使用します 、これは、新しいRedisManagerPoolを使用するように変更できます。 と:

    sentinel.RedisManagerFactory = (master,replicas) => new RedisManagerPool(master);
    

    センチネルの監視を開始します#

    構成が完了すると、Redis Sentinelサーバーの監視を開始し、次のコマンドで事前構成されたクライアントマネージャーにアクセスできます。

    IRedisClientsManager redisManager = sentinel.Start();
    

    以前と同様に、ご希望のIOCにシングルトンとして登録できます。 インスタンス:

    container.Register<IRedisClientsManager>(c => sentinel.Start());
    

    Redis Sentinelサーバーの構成#

    単一(または複数)のWindows、OSX、またはLinuxサーバーで複数のredisインスタンスを即座に実行するための開始/停止スクリプトを含む、最小限の高可用性Redis Sentinel構成をセットアップする簡単な方法については、redis構成プロジェクトを参照してください。

    Redis統計#

    RedisStatsを使用できます 実行中のインスタンスの可視性と内省のためのクラス。 Redis Stats wikiには、利用可能な統計が一覧表示されます。

    自動再試行#

    クライアント接続の復元力を向上させるには、RedisClient 10ms から始まる指数バックオフで、ソケットとI/Oの例外が原因で失敗したRedis操作を透過的に再試行します RetryTimeoutまで 10000ms 。これらのデフォルトは次のように調整できます:

    RedisConfig.DefaultRetryTimeout = 10000;
    RedisConfig.BackOffMultiplier = 10;
    

    1. 外部インジェクション攻撃からMongoDBを保護する

    2. Redisクラスターでパターンに一致するキーを削除する方法

    3. MongoDBの起動に失敗しました-***fassert()の失敗後に中止します

    4. 集約データのMongoDB正しいスキーマ