2017-08-22 4 views
1

私のチームにはLumen(Laravelに基づくマイクロフレームワーク)を使用するプロジェクトが1つあります。 Predisを使用してRedisクラスタを接続し、その上でいくつかのキュージョブを実行します。しかし、時には(我々は再生産することはできません)、システムがスローしません「にCLUSTER SLOTSのためにプールに残しませ接続を..」我々は長い間研究してきたルーメンでPRedisライブラリを使用している場合、Redisクラスタのクラスタスロットのプールに接続が残っていません

[2017-08-17 14:05:35] bookmark.ALERT: Predis\ClientException: No connections 
left in the pool for `CLUSTER SLOTS` in 
....../vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php:232 
Stack trace: 
#0 ....../vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php(260): 
Predis\Connection\Aggregate\RedisCluster->queryClusterNodeForSlotsMap(NULL) 
#1 ....../vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php(560): 
Predis\Connection\Aggregate\RedisCluster->askSlotsMap() 
... 

例外。問題はLaravelのPredisライブラリと接続プールを維持する方法にあると考えられます。 Redisは何らかの理由で接続をクローズするが、Predisライブラリは接続しようとしたときに接続を再オープンしなかったためです。

、ここで私たちのクラスタ設定構造です:

'redis' => [ 
'client' => 'predis', 

'clusters' => [ 
    // Setting for Queue 
    'default' => [ 
     'options' => [ 'cluster' => 'redis' ], 
     [ 
      'host' => 'xxx', 
      'password' => 'xxx', 
      'port' => 'xxx', 
      'timeout' => 0.15, 
      'read_write_timeout' => 0.15 
     ], 
     [ 
      'host' => 'xxx', 
      'password' => 'xxx', 
      'port' => 'xxx', 
      'timeout' => 0.15, 
      'read_write_timeout' => 0.15 
     ], 
     ... 
    ] 
] 
] 

いずれかがそれにアイデアを持っていますか?どうもありがとうございました!

答えて

0

これらの例外は断続的にしか表示されないため、'redis'構成のタイムアウト値が低すぎる可能性があります。私は、PHPとRedisサーバーの間のネットワーク上のトラフィックのバーストが、クライアント接続がタイムアウトするのに十分な通信速度を遅くすることしか想像できません(0.15秒後)。

それが、理由はおそらく、彼らはすべてタイムアウトスロット(から構成されたRedisのホストのすべてのをマップフェッチに失敗したときにPredisクライアントは `CLUSTER SLOTS`のためにプールに残ってませコネクションをスローしません)。 0.0001のような非常に小さなタイムアウト値を設定することで、この動作を再現することができます。

タイムアウト値を増やし、ネットワークの遅延を引き起こす問題を監視することを検討してください。

関連する問題