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());
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
Code: Select all
redis.clients.jedis.exceptions.JedisClusterOperationException: Cluster retry deadline exceeded.
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
Code: Select all
1) 1) (integer) 0
2) (integer) 16383
3) 1) "172.29.0.2"
2) (integer) 6379
3) "b47f7da9be31ce953d4b4fbf9e3a737d1c9b7a58"
4) (empty array)
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.
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"));
}
```