2

パスワード、SSL、パイプライン サポートを備えた Azure Redis クラスターを使用する必要があります。

今まで Jedis を使用していましたが、クラスター + ssl + パスワード + パイプラインの組み合わせがサポートされていません。

レタス ( https://github.com/mp911de/lettuce/releases/tag/4.1.2.Final ) を試しましたが、現在、自分では解決できない接続の問題が発生しています。

Azure Redis クラスター (2 * P4) への接続は、SSL なしでも機能しますが、SSL ありでは機能しません。また、SSL を使用して単一ノードに接続できますが、クラスター サポートはありません。問題は、クラスター + ssl を組み合わせるときに、auth 呼び出しがタイムアウトになることです (コマンドはネットワーク経由で送信されますが、タイムアウトになります)。

SSL が機能するコードのないクラスターは次のようになります。

RedisURI redisURI = RedisURI.Builder.redis(host, 6379)
  .withPassword(password)
  .build();
RedisClusterClient client = RedisClusterClient.create(redisURI);
RedisAdvancedClusterCommands<String, String> connection = client.connect().sync();
connection.set("a", "1");
System.out.println(connection.get("a"));

出力は1

SSL を有効にする:

RedisURI redisURI = RedisURI.Builder.redis(host, 6380)
  .withPassword(password)
  .withSsl(true)
  .build();
RedisClusterClient client = RedisClusterClient.create(redisURI);
RedisAdvancedClusterCommands<String, String> connection = client.connect().sync();
connection.set("a", "1");
System.out.println(connection.get("a"));

1 分間ハングし、log4j ログは次のようになります。

2016-05-26 14:25:17,110 | TRACE | lettuce-nioEventLoop-3-1 | CommandEncoder | [/{CLIENT} -> {HOST}/{IP}:6380] Sent: *2
$4
AUTH
$44
{PASSWORD}
2016-05-26 14:26:17,134 | WARN  | main | ClusterTopologyRefresh | Cannot connect to RedisURI [host='***', port=6380]
com.lambdaworks.redis.RedisCommandTimeoutException: Command timed out
    at com.lambdaworks.redis.LettuceFutures.await(LettuceFutures.java:95)
    at com.lambdaworks.redis.LettuceFutures.awaitOrCancel(LettuceFutures.java:74)
    at com.lambdaworks.redis.AbstractRedisAsyncCommands.auth(AbstractRedisAsyncCommands.java:64)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connectToNode(RedisClusterClient.java:342)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connectToNode(RedisClusterClient.java:301)
    at com.lambdaworks.redis.cluster.ClusterTopologyRefresh.getConnections(ClusterTopologyRefresh.java:240)
    at com.lambdaworks.redis.cluster.ClusterTopologyRefresh.loadViews(ClusterTopologyRefresh.java:132)
    at com.lambdaworks.redis.cluster.RedisClusterClient.loadPartitions(RedisClusterClient.java:468)
    at com.lambdaworks.redis.cluster.RedisClusterClient.initializePartitions(RedisClusterClient.java:445)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connectClusterImpl(RedisClusterClient.java:359)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connect(RedisClusterClient.java:244)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connect(RedisClusterClient.java:231)
    at com.ubikod.ermin.reach.tools.Test.main(Test.java:20)
Exception in thread "main" com.lambdaworks.redis.RedisException: Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host='***', port=6380]]
    at com.lambdaworks.redis.cluster.RedisClusterClient.loadPartitions(RedisClusterClient.java:471)
    at com.lambdaworks.redis.cluster.RedisClusterClient.initializePartitions(RedisClusterClient.java:445)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connectClusterImpl(RedisClusterClient.java:359)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connect(RedisClusterClient.java:244)
    at com.lambdaworks.redis.cluster.RedisClusterClient.connect(RedisClusterClient.java:231)
    at com.ubikod.ermin.reach.tools.Test.main(Test.java:20)

SSL を維持し、クラスターを無効にすると、次のようになります。

RedisURI redisURI = RedisURI.Builder.redis(host, 6380)
  .withPassword(password)
  .withSsl(true)
  .build();
RedisClient client = RedisClient.create(redisURI);
RedisCommands<String, String> connection = client.connect().sync();
connection.set("a", "1");
System.out.println(connection.get("a"));

これは単なる SSL の問題ではなく、SSL とクラスターの組み合わせの問題です。を使用してwithStartTls、ピア検証を無効にし、タイムアウトを上げ、それらの組み合わせを運が悪かった。

ライブラリのバグなのか、Azure Redis のバグなのか、何か考えはありますか?

4

1 に答える 1

3

の wikiページを調べたところ、lettuceこの問題はライブラリのバグや Azure Redis のバグが原因ではないことがわかりました。残念ながら、lettuceSSL を使用した Redis クラスターがサポートされていないだけです。wiki ページのサブセクションから以下の内容を参照してConnecting to Redis using String RedisURIください。

レタスは、通常の Redis 接続でのみ SSL をサポートします。Redis Sentinel または Redis Cluster を使用したマスター解決はサポートされていません。これは、両方の戦略が Redis アドレスをネイティブ ポートに提供するためです。Redis Sentinel と Redis Cluster は SSL ポートを提供できません。

于 2016-05-27T02:53:45.023 に答える