0

私はphpredis(https://github.com/phpredis/phpredisから25.02.2016で構築)をphp 5.5.9で使用しています。拡張機能は、単一の redis インスタンス (バージョン 3.0.7) (リモートおよびローカルの redis インスタンス) で正常にテストされています。

これは、構成済みの redis クラスターに接続するためのコードです (センチネルなし、構成のみ)。

$cluster = new \RedisCluster(NULL, 
         array("192.168.127.203:7000", "192.168.127.203:7001", "192.168.127.203:7002"));
$cluster->setOption(RedisCluster::OPT_SLAVE_FAILOVER, RedisCluster::FAILOVER_ERROR);
var_dump($cluster->_masters());
var_dump($cluster->get('foo1'));

このコードを redis インスタンスと同じサーバーで実行すると、すべてのマスターと foo1 の値が正常に取得されます。しかし、別の Web サーバーでコードを実行すると、クラスターから次のマスターが取得されます。

array (size=3)
  0 => 
    array (size=2)
      0 => string '127.0.0.1' (length=9)
      1 => int 7005
  1 => 
    array (size=2)
      0 => string '127.0.0.1' (length=9)
      1 => int 7000
  2 => 
    array (size=2)
      0 => string '127.0.0.1' (length=9)
      1 => int 7001

値の取得は RedisClusterException で失敗し、「クラスター内のどのノードとも通信できません」というメッセージが表示されます。

それがライブラリのバグなのか、それともライブラリを間違った方法で使用しているのかはわかりません。コードはドキュメントと同じです。1 つの問題は、リモート IP ではなくローカルホスト IP でマスターを取得することだと思います。

あなたの助けに感謝します。

4

1 に答える 1

2

ついに問題が何であるかを発見しました。クライアントライブラリには何もありません。クラスターの構成にエラーがあるだけです。

作成には、ドキュメントの次のスニペットが使用されました。

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

もちろん、正しいコマンドは次のようになります。

./redis-trib.rb create --replicas 1 192.168.127.203:7000 192.168.127.203:7001 \
192.168.127.203:7002 192.168.127.203:7003 192.168.127.203:7004 192.168.127.203:7005

誰かが同様の問題を抱えている場合の情報です。

于 2016-02-24T13:45:59.437 に答える