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

Laravel + predis+Redisクラスター-移動/127.0.0.1:6379への接続なし

    TL; DR:

    • 'cluster' => true 複数のノードを処理する1つの集約クライアントを作成するにはtrueである必要があります。
    • 'options' => ['cluster' => 'redis'] defaultの兄弟として構成に追加する必要があります (子ではありません)Azureが提供するサーバー側のクラスタリングを処理するようにPredisに指示するため。
    • サーバー側クラスタリングでauthを使用する場合、'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] 新しく検出されたクラスターノードを認証するために必要になります。

    全文

    redis構成では、複数のredisインスタンスへの複数の接続を設定できます。 cluster オプションは、Laravelにそれらの複数の定義された接続を処理する方法を指示します。

    clusterの場合 falseに設定されています 、Laravelは個別の\Predis\Clientを作成します 各接続のインスタンス。各接続には個別にアクセスでき、別の接続とは関係ありません。

    clusterの場合 trueに設定されています 、Laravelは集約\Predis\Clientを作成します 定義されたすべての接続を使用するインスタンス。他の構成がない場合、これは一種の「偽の」クラスターです。クライアント側のシャーディングを使用してキースペースを分散し、適切なキーの負荷分散を確保するために外部の監視とメンテナンスが必要になる場合があります。

    ただし、発生している問題は、Azureが(おそらく)実際のサーバー側のRedisクラスターを実装していることです。これは、キースペースの自動シャーディングを処理します。この場合、ノードは相互に認識し、相互に通信し、上下する可能性があります。ここがMOVED およびASK 応答はから来ます。

    Predis ライブラリはこれらの応答を自動的に処理できますが、必要であると指示した場合に限ります。この場合、Predisに伝える必要があります クラスタリングを処理する必要があるクライアント。これは、Laravelがoptionsを介して行います。 redisの配列 構成。

    redisについて 構成、options キーは接続の兄弟である必要があります(つまり、default )、子供ではありません。さらに、オプションはkey => valueとして指定する必要があります ペア。

    したがって、構成は次のようになります。

    'redis' => [
        'cluster' => true,
    
        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    
        'options' => [
            'cluster' => 'redis',
        ],
    ],
    

    cluster redisの下のキー configはLaravelに集約Predis\Clientを作成するように指示します 複数のノードを処理する可能性のあるインスタンス、およびcluster optionsの下のキー arrayは、クライアント側のクラスタリングではなく、サーバー側のクラスタリングを処理する必要があることをそのインスタンスに通知します。

    認証

    元の接続パラメーター(認証を含む)は、-MOVEDを介して検出された新しいノードへの接続と共有されません および-ASK 反応。したがって、以前に-MOVEDから取得したエラーはすべて 応答はNOAUTHに変換されるようになりました エラー。ただし、サーバー側の'cluster' 構成により、'parameters'が可能になります 新しく検出されたノードで使用するパラメーターのリストを定義する兄弟。ここに、認証パラメータを配置して新しいノードで使用できます。

    これは次のようになると思います:

    'redis' => [
        'cluster' => true,
    
        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    
        'options' => [
            'cluster' => 'redis',
            'parameters' => ['password' => env('REDIS_PASSWORD', null)],
        ],
    ],
    

    公正な警告、これは私が調査とコードダイビングから得たすべての情報です。 LaravelでRedisを使用しましたが、サーバー側のクラスタリングを(まだ)使用していないため、これでも機能しない可能性があります。

    これを調べているときに出くわしたいくつかの有用な情報:

    redis-clusterへの接続に関するPredisの問題:
    https://github.com/nrk/predis/issues/259#issuecomment-117339028

    Predisをredis-clusterを使用するように構成しなかったようですが、代わりに、従来のクライアント側のシャーディングロジック(これはデフォルトの動作でもあります)で使用しています。値redisを使用してオプションクラスターを設定するクライアントを構成して、redis-clusterと一緒に再生する必要があることをクライアントに通知する必要があります。簡単な例:

    $client = new Predis\Client([$node1, $node2, ...], ['cluster' => 'redis']);

    そうすることで、クライアントがRedisノードからの-MOVEDまたは-ASK応答を自動的に処理できるようになります。

    redisキャッシュでのクラスタリングについて説明しているMSの記事:
    https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- to-my-cache-when-clustering-is-enabled

    クラスタリングが有効になっていないキャッシュに接続するときに使用するのと同じエンドポイント、ポート、およびキーを使用して、キャッシュに接続できます。 Redisはバックエンドでクラスタリングを管理するため、クライアントからクラスタリングを管理する必要はありません。

    Predis\Clientを作成するためのLaravelコード インスタンス:
    https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66



    1. SpringDataMongoDBとJava8LocalDate MappingException

    2. Spring Data RedisTemplate:値とHashValueのシリアル化

    3. Kubernetesから透過的な巨大ページを無効にする

    4. Mac OS 10.15(Catalina)にアップグレードした後、MongoDBがデータディレクトリを見つけることができません