2016-05-26 12 views
1

Ich muss mit Passwort Azure Redis Cluster, verwenden, mit SSL, mit Pipelining Unterstützung.Azure Redis SSL Cluster + Salat Java (EDIT: Salat-Version <4.2)

Ich war Jedis mit bis jetzt, aber es fehlt die Unterstützung für Cluster + ssl + Passwort + Pipelining-Combo.

Ich habe versucht, Salat (https://github.com/mp911de/lettuce/releases/tag/4.1.2.Final) und traf zur Zeit eine Verbindung Problem, das ich nicht in der Lage bin, mich frei zu lösen.

zu einer Azure Redis Cluster anschließen (2 * P4) arbeitet ohne SSL aber nicht mit. Ich kann auch mit einem einzelnen Knoten mit SSL aber ohne Cluster-Unterstützung verbinden. Problem ist, wenn Cluster + ssl kombiniert, der Auth-Anruf Zeitlimit (der Befehl wird über die Leitung gesendet aber Timeout).

Der Cluster ohne SSL Arbeits Code wie folgt aussieht:

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")); 

Es hängt während 1 Minute und log4j Protokolle wie folgt aussieht:

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")); 

Ausgabe 1

Aktivieren von SSL ist:

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) 

Keeping SSL und Deaktivieren von Cluster funktioniert:

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")); 

das ist also nicht nur ein SSL-Problem, es ist ein SSL + Cluster Combo Problem. Ich habe versucht, withStartTls zu verwenden, Peer-Verifizierung deaktivieren, das Timeout erhöhen, jede Kombination von denen ohne Glück.

Jede Idee, wenn es sich um eine Bibliothek Bug oder ein Azure Redis Fehler ist?

Antwort

2

inspizierte ich das Wiki page von lettuce, und ich bemerkte das Problem nicht durch eine Bibliothek Bug oder ein Azure Redis Fehler verursacht wurde, leider nur den einzigen lettuce nicht Redis Cluster mit SSL unterstützen, benutzen Sie bitte den Inhalt unten aus dem sehen Unterabschnitt Connecting to Redis using String RedisURI der Wiki-Seite.

kopfsalat unterstützt SSL nur auf regulären Redis-Verbindungen. Die Master-Auflösung mit Redis Sentinel oder Redis Cluster wird nicht unterstützt, da beide Strategien Redis-Adressen für den nativen Port bereitstellen. Redis Sentinel und Redis Cluster können die SSL-Ports nicht bereitstellen.

+1

Seine tatsächlich in der bevorstehenden 4.2 Release-Serie unterstützt. Wenn jemand es versuchen möchte, finden Sie die Snapshot-Builds unter https://oss.sonatype.org/content/repositories/snapshots/biz/paluch/redis/letuce/4.2-SNAPSHOT/ –

+0

@GuillaumePerrot Vielen Dank für Ihre Freigabe! –