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