Ich habe einen Master-Master-Redis-Cluster von 3 (node1, node2, node3). Ich verwende einen Client für verteiltes Sperren über JVM. Nach dem Algorithmus RedLock, der von Redission implementiert wird, versucht er, die Mehrheit der Knoten zu sperren (in meinem Fall ist 2 die Mehrheit) und verwendet den Round-Robin-Algorithmus für den Lastausgleich. Nun ist dieser Verriegelungsmechanismus funktioniert gut, wenn wir das Netzwerk für Knoten2 oder Knoten 3. blockieren Aber wenn wir node1-Netzwerk blockieren dann schlägt es mit den folgenden FehlernRedis-Client (Redission) funktioniert nicht mehr, wenn der erste Knoten im Cluster ausgefallen ist
Exception in thread "main" org.redisson.client.RedisNodeNotFoundException: No node for slot: 15087 and command (EVAL)
at org.redisson.connection.MasterSlaveConnectionManager.getEntry(MasterSlaveConnectionManager.java:578)
at org.redisson.connection.MasterSlaveConnectionManager.connectionWriteOp(MasterSlaveConnectionManager.java:563)
at org.redisson.command.CommandAsyncService.async(CommandAsyncService.java:368)
at org.redisson.command.CommandAsyncService.evalAsync(CommandAsyncService.java:334)
at org.redisson.command.CommandAsyncService.evalWriteAsync(CommandAsyncService.java:282)
at org.redisson.RedissonLock.tryLockInnerAsync(RedissonLock.java:207)
at org.redisson.RedissonLock.tryAcquire(RedissonLock.java:139)
at org.redisson.RedissonLock.tryLock(RedissonLock.java:225)
at com.seamless.common.cache.distributed.LockManager.getLock(LockManager.java:37)
at com.testlock.app.App.main(App.java:34)
unten, wie ich die Erstellung der Redission Client
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.redisson.ClusterServersConfig;
import org.redisson.Config;
import org.redisson.ReadMode;
import org.redisson.Redisson;
import org.redisson.RedissonClient;
import org.redisson.core.RLock;
public class LockManager {
private static final Logger LOG = Logger.getLogger(LockManager.class);
private RedissonClient redissonClient;
LockManager(List<String> nodes){
Config config = new Config();
ClusterServersConfig serverConfig=config.useClusterServers();
serverConfig.setReadMode(ReadMode.MASTER);
for(String node :nodes){
serverConfig.addNodeAddress(node);
}
redissonClient = Redisson.create(config);
}
public boolean getLock(final String lockKey,int timeout){
RLock lock=redissonClient.getLock(lockKey);
try {
return lock.tryLock(0, timeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
LOG.error("Error getting lock "+e.getMessage());
}
return false;
}
public void releaseLock(final String lockKey){
RLock lock=redissonClient.getLock(lockKey);
if(lock.isHeldByCurrentThread())
lock.unlock();
}
}