So rufen Sie einen Redis-Cluster mit testContainers in Java aufJava

Java-Forum
Guest
 So rufen Sie einen Redis-Cluster mit testContainers in Java auf

Post by Guest »

Ich versuche, mit TestContainers einen Redis-Cluster zu erstellen, um meine Anwendung zu testen, die von einem Redis-Cluster abhängt. Folgendes habe ich bisher versucht:
Code-Snippet zum Starten des Containers:

Code: Select all

Network network = Network.newNetwork();
RedisContainer redisContainer = new RedisContainer(DockerImageName.parse("redis:7.0.5"))
.withExposedPorts(port)
.withCommand("redis-server --port " + port +
" --requirepass " + redisPassword +  // Password for clients
" --masterauth " + redisPassword +  // Password for inter-node communication
" --cluster-enabled yes" +
" --cluster-config-file nodes.conf"+
" --cluster-node-timeout 5000"+
" --appendonly yes" +
" --bind 0.0.0.0" )
.withNetwork(network)
.withNetworkMode("bridge")
.withNetworkAliases("redis-" + i)
.waitingFor(Wait.forListeningPort());
1. Einzelknoten-Cluster
Ich habe versucht, einen Einzelknoten-Cluster zu erstellen, wobei „Cluster aktiviert“ auf „Ja“ und Replikat auf „0“ gesetzt war. Ich habe versucht, eine Verbindung dazu mithilfe von JedisCluster herzustellen.< /p>
Probleme und Korrekturen:
Anfangs erhielt ich die Fehlermeldung: Cluster-Slots nicht zugewiesen. Ich habe dieses Problem gelöst, indem ich den Befehl CLUSTER ADDSLOTS ausgeführt habe, um den Steckplatzbereich zuzuweisen.
Danach habe ich den Befehl CLUSTER NODES ausgeführt und die folgende Ausgabe erhalten:

Code: Select all

1f2673c5fdb45ca16d564658ff88f815db5cbf01 172.29.0.2:6379@16379 myself,master - 0 0 1 connected 0-16383
Als ich jedoch versuchte, mit JedisCluster eine Verbindung zum Cluster herzustellen, wurde die Verbindung hergestellt und ich konnte mit der API jedisCluster.getClusterNodes() eine Knotenliste mit IP und Port abrufen. Als ich versuchte, ein Schlüssel-Wert-Paar zu schreiben, bekam ich nach ein paar Sekunden die folgende Fehlermeldung.

Code: Select all

redis.clients.jedis.exceptions.JedisClusterOperationException: Cluster retry deadline exceeded.
Seltsamerweise funktionierte das Ausführen von Befehlen über redis-cli sowohl zum Schreiben als auch zum Lesen von Daten perfekt.
Cluster-Info-Ausgabe:

Code: Select all

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:1
cluster_current_epoch:1
cluster_my_epoch:1
cluster_stats_messages_pong_sent:1
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:2
cluster_stats_messages_pong_received:1
cluster_stats_messages_meet_received:1
cluster_stats_messages_received:2
total_cluster_links_buffer_limit_exceeded:0
Cluster-Slots-Ausgabe:

Code: Select all

1) 1) (integer) 0
2) (integer) 16383
3) 1) "172.29.0.2"
2) (integer) 6379
3) "b47f7da9be31ce953d4b4fbf9e3a737d1c9b7a58"
4) (empty array)
2. Cluster mit mehreren Knoten
Ich habe auch versucht, einen Cluster mit 6 Knoten (3 Master und 3 Slaves) einzurichten.
Beobachtungen:
JedisCluster.getClusterNodes() hat die korrekten Knoteninformationen für alle drei Masterknoten (IP und Port) zurückgegeben.
Als ich jedoch versuchte, mit JedisCluster Daten in den Cluster zu schreiben, habe ich habe folgendes bekommen Fehler:

Code: Select all

redis.clients.jedis.exceptions.JedisClusterOperationException: Cluster retry deadline exceeded.
Als ich redis-cli -c zum Schreiben von Daten verwendet habe, blieb es bei der Meldung „Umleitung zu Steckplatz [] am -Knoten“ hängen.< /p>
Mögliches Problem
Ich versuche, Redis in einem Container mithilfe des TestContainer-Moduls aufzurufen. Ich vermute, dass die Knoten im Cluster nicht ordnungsgemäß miteinander kommunizieren können. Im Fall des Single-Node-Clusters fehlen möglicherweise noch einige Konfigurationen. Einige
Jede Hilfe bei der Lösung dieses Problems wäre sehr dankbar. Danke!
Bearbeiten:
JedisCluster-Konfigurationscode:

Code: Select all

// Using redisContainer in above code snippet start the container and run   to add slots and continue with below code

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(Runtime.getRuntime().availableProcessors());
poolConfig.setMaxIdle(Runtime.getRuntime().availableProcessors());
poolConfig.setMinIdle(Runtime.getRuntime().availableProcessors());
poolConfig.setMaxWaitMillis(2000);

//        Connect to the cluster using Jedis with a password
DefaultJedisClientConfig.Builder jedisClientConfig = DefaultJedisClientConfig.builder()
.password(redisPassword)
.ssl(false)
.connectionTimeoutMillis(10000)
.socketTimeoutMillis(4000);

final Set hosts = new HashSet(redisContainers.size());
int i = 0;
for(RedisContainer redisContainer : redisContainers){
String redisHost = "127.0.0.1";
int redisPort = redisContainer.getMappedPort(basePort+i);
hosts.add(new HostAndPort(redisHost, redisPort));
i += 1;
}

System.out.println("Hosts " + hosts);

try (JedisCluster jedis = new JedisCluster(hosts, jedisClientConfig.build(), 3, poolConfig)) {
Map nodes = jedis.getClusterNodes();
System.out.println("Connected cluster nodes: " + nodes);
nodes.forEach((key, value) -> System.out.println(key));
jedis.set("key", "value"); // This is where the error is seen
System.out.println("Key set in Redis Cluster: " + jedis.get("key"));
}
```

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post