2016-04-20 5 views
1

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(); 
} 
} 

Antwort

0

Sie haben RedissonRedLock und 3 Schlösser für RedLock Algorithmus verwenden:

RLock lock1 = redisson.getLock("lock1"); 
RLock lock2 = redisson.getLock("lock2"); 
RLock lock3 = redisson.getLock("lock3"); 

RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3); 
lock.lock(); 

//... 

lock.unlock(); 
Verwandte Themen