Issues with Sharding and Connectivity in Redis Enterprise Cluster Setup Using Docker Containers

Hello Redis Community,

I’m currently setting up a Redis Enterprise cluster using Docker containers and encountering issues related to data sharding and connectivity. Below are the details of my setup, the steps I’ve taken, and the problems I’m facing.

**### Setup Details:

  • Environment:
    • Docker Containers: 3 Redis Enterprise nodes
    • Redis Enterprise Image: redislabs/redis
    • Container Status: All containers are running
  • Port Mappings:
    • redis-ent-node1:
      • 12000:12000
      • 8443:8443
      • 9443:9443
    • redis-ent-node2:
      • 12001:12000
      • 8444:8443
      • 9444:9443
    • redis-ent-node3:
      • 12002:12000
      • 8445:8443
      • 9445:9443

**### Cluster Configuration:

After setting up the initial node (redis-ent-node1) and creating a database, I added two more nodes (redis-ent-node2 and redis-ent-node3) to join the cluster. I defined a fully qualified name with the endpoint:

Get Replica of source URL
redis-12000.cluster.local:12000 / 172.17.0.2:12000

**### Current Issues:

  1. Connectivity Problems:
  • Successful Connection: Connecting via localhost:12000 (redis-ent-node1) works seamlessly, allowing me to insert data into the master node.
  • Failed Connections: Attempting to connect through localhost:12001 (redis-ent-node2) and localhost:12002 (redis-ent-node3) results in the following exception:
    StackExchange.Redis.RedisConnectionException: ‘It was not possible to connect to the redis server(s). Error connecting right now. To allow this multiplexer to continue retrying until it’s able to connect, use abortConnect=false in your connection string or AbortOnConnectFail=false; in your code.’

Sharding Issues:

  • Data Distribution: Data is only being pushed to the master node (redis-ent-node1), while the other two nodes (redis-ent-node2 and redis-ent-node3) are acting as slaves with no data being sharded across them.

Node ID / IP Address Shards Memory Persistent storage CPU Network Status
node: 3 / 172.17.0.4 0 15.88 GB / 31.25 GB 7.52 GB / 1006.85 GB 10.90% 84.46 KB / 30.76 KB Running
node: 2 / 172.17.0.3 1 15.88 GB / 31.25 GB 7.52 GB / 1006.85 GB 10.90% 117.72 KB / 40.41 KB Running
node: 1 / 172.17.0.2 2 15.88 GB / 31.25 GB 7.52 GB / 1006.85 GB 10.90% 48.38 KB / 177.46 KB Running

var shards = new (string host, int port)
{
(“localhost”, 12000), // Shard 1
(“localhost”, 12001), // Shard 2
(“localhost”, 12002) // Shard 3
};

try
{
// Connect to the Redis Cluster
using (var connection = ConnectionMultiplexer.Connect(configuration))
{
// Verify connection
if (!connection.IsConnected)
{
Console.WriteLine(“Failed to connect to Redis Cluster.”);
return;
}

    // Get database instance
    IDatabase db1 = connection.GetDatabase();

    // Insert data (keys will be sharded across nodes)
    db1.StringSet("user:1000", "Alice");
    db1.StringSet("user:1001", "Bob");
    db1.StringSet("user:1002", "Charlie");

    // Read data
    Console.WriteLine(db1.StringGet("user:1000")); // Outputs: Alice
    Console.WriteLine(db1.StringGet("user:1001")); // Outputs: Bob
    Console.WriteLine(db1.StringGet("user:1002")); // Outputs: Charlie

    // Optionally, get DBSIZE
    var server = connection.GetServer("localhost", 12000);
    Console.WriteLine($"Total keys: {server.DatabaseSize()}");   
    var server1 = connection.GetServer("localhost", 12001);
    Console.WriteLine($"Total keys: {server1.DatabaseSize()}");   
    var server2 = connection.GetServer("localhost", 12002);
    Console.WriteLine($"Total keys: {server2.DatabaseSize()}");
}

}
catch (Exception ex)
{
Console.WriteLine($“Error connecting to Redis Cluster: {ex.Message}”);
}

Alice
Bob
Charlie
Total keys: 5000003

Questions:

  1. Sharding Configuration:
  • How can I ensure that the Redis Enterprise database is properly sharded across all three Docker nodes?
  • Is there a way to redistribute shards if some nodes are not receiving any shards?
  1. Connectivity Issues:
  • What could be causing the RedisConnectionException when connecting to localhost:12001 and localhost:12002?
  • How can I configure the client to correctly connect to all shards, considering the internal Docker IPs?
  1. Client Configuration:
  • Is the current approach of defining multiple endpoints in the ConfigurationOptions the correct way to handle a Redis Cluster in StackExchange.Redis?
  • Are there any specific settings or best practices for configuring StackExchange.Redis to work with a Redis Enterprise Cluster running in Docker?