I have Dynomite running in remote server. The cluster has 1 rack with 2 nodes.
In the Dynomite server,
curl -X GET maritest.abc.com:22222/cluster_describe
{"dcs": [{"name":"pnp","racks": [{"name":"rack1","servers": [{"name":"0.0.0.0","host":"0.0.0.0","port":8103,
"token":4294967294
},{"name":"127.0.0.1","host":"127.0.0.1","port":8101,
"token":2147483647
}]}]}]}
In Client side, I use DynoJedisClient. I supply my own HostSupplier and TokenMapSupplier.
Host host = new Host("maritest.abc.com", null, 8102, "rack1", "pnp", Host.Status.Up);
HostSupplier customHostSupplier = new HostSupplier() {
@Override
public List<Host> getHosts() {
return Collections.singletonList(host);
}
};
String tokenMapJson = "
[{
\"token\": \"2147483647\",
\"hostname\": \"maritest.abc.com\",
\"zone\": \"rack1\",
\"dc":\ "pnp\"
}, {
\"token\": \"4294967294\",
\"hostname\": \"maritest.abc.com\",
\"zone\": \"rack1\",
\"dc\": \"pnp\"
}]
";
TokenMapSupplier tokenSupplier = new AbstractTokenMapSupplier() {
@Override
public String getTopologyJsonPayload(Set<Host> set) {
return tokenMapJson;
}
@Override
public String getTopologyJsonPayload(String hostname) {
return tokenMapJson;
}
};
Then I instantiate DynoJedisClient
dynoClient = new DynoJedisClient.Builder()
.withApplicationName(appName)
.withHostSupplier(customHostSupplier)
.withTokenMapSupplier(tokenSupplier)
.build();
In log, I get these warnings
WARN [2018-06-25 15:05:58,542] com.netflix.dyno.jedis.DynoJedisClient: DynoJedisClient for app=[webproxy] is configured for local rack affinity but cannot determine the local rack! DISABLING rack affinity for this instance. To make the client aware of the local rack either use ConnectionPoolConfigurationImpl.setLocalRack() when constructing the client instance or ensure EC2_AVAILABILTY_ZONE is set as an environment variable, e.g. run with -DEC2_AVAILABILITY_ZONE=us-east-1c [main]
WARN [2018-06-25 15:05:58,550] com.netflix.dyno.connectionpool.impl.lb.AbstractTokenMapSupplier: Local Datacenter was not defined [main]
So I added those 2 variables before I instantiate DynoJedisClient.
System.setProperty("EC2_REGION", "pnp");
System.setProperty("EC2_AVAILABILITY_ZONE", "rack1");
If I supply the above 2 variables, I get an Exception.
In Log
ERROR [2018-06-25 14:05:32,080] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: 4ec7ab819b9ca7eb [dw-51 - GET /redis/allkeys]
! com.netflix.dyno.connectionpool.exception.PoolOfflineException: PoolOfflineException: [host=Host [hostname=UNKNOWN, ipAddress=UNKNOWN, port=0, rack: UNKNOWN, datacenter: UNKNOW, status: Down, hashtag=null], latency=0(0), attempts=0]host pool is offline and no Racks available for fallback
! at com.netflix.dyno.connectionpool.impl.lb.HostSelectionWithFallback.getConnection(HostSelectionWithFallback.java:163)
! at com.netflix.dyno.connectionpool.impl.lb.HostSelectionWithFallback.getConnectionsToRing(HostSelectionWithFallback.java:256)
! at com.netflix.dyno.connectionpool.impl.ConnectionPoolImpl.executeWithRing(ConnectionPoolImpl.java:366)
! at com.netflix.dyno.jedis.DynoJedisClient.d_keys(DynoJedisClient.java:2663)
! at com.netflix.dyno.jedis.DynoJedisClient.keys(DynoJedisClient.java:2643)
In Console
java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 0
at com.netflix.dyno.jedis.DynoJedisClient$Builder.startConnectionPool(DynoJedisClient.java:4059)
at com.netflix.dyno.jedis.DynoJedisClient$Builder.createConnectionPool(DynoJedisClient.java:4031)
at com.netflix.dyno.jedis.DynoJedisClient$Builder.buildDynoJedisClient(DynoJedisClient.java:4007)
at com.netflix.dyno.jedis.DynoJedisClient$Builder.build(DynoJedisClient.java:3936)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at com.netflix.dyno.connectionpool.impl.lb.HostSelectionWithFallback.calculateReplicationFactor(HostSelectionWithFallback.java:396)
at com.netflix.dyno.connectionpool.impl.lb.HostSelectionWithFallback.initWithHosts(HostSelectionWithFallback.java:353)
at com.netflix.dyno.connectionpool.impl.ConnectionPoolImpl.initSelectionStrategy(ConnectionPoolImpl.java:627)
at com.netflix.dyno.connectionpool.impl.ConnectionPoolImpl.start(ConnectionPoolImpl.java:526)
at com.netflix.dyno.jedis.DynoJedisClient$Builder.startConnectionPool(DynoJedisClient.java:4042)