簡體   English   中英

Azure Redis SSL群集+生菜Java(編輯:生菜版本<4.2)

[英]Azure Redis SSL Cluster + Lettuce Java (EDIT: lettuce version < 4.2)

我需要使用Azure Redis群集,密碼,SSL和流水線支持。

到目前為止,我一直在使用Jedis,但它不支持cluster + ssl + password + pipelining組合。

我嘗試了生菜( https://github.com/mp911de/lettuce/releases/tag/4.1.2.Final ),目前遇到了我自己無法解決的連接問題。

連接到Azure Redis群集(2 * P4)無需使用SSL,但不能使用。 另外,我可以使用SSL但不支持群集來連接到單個節點。 問題是當組合cluster + 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

啟用S​​SL:

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錯誤?

我檢查了lettuce的Wiki 頁面 ,發現該問題不是由庫錯誤或Azure Redis錯誤引起的,不幸的是,僅lettuce不支持帶SSL的Redis群集,請參閱“ Connecting to Redis using String RedisURI ”小節中的以下內容Connecting to Redis using String RedisURI Wiki頁面的Connecting to Redis using String RedisURI

lettuce僅在常規Redis連接上支持SSL。 不支持使用Redis Sentinel或Redis Cluster進行主解析,因為這兩種策略都向本機端口提供Redis地址。 Redis Sentinel和Redis Cluster無法提供SSL端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM