6

Je rencontre des problèmes avec get/set sur un cluster ElastiCache à partir de mon instance EC2. Je reçois - SEVERE: net.spy.memcached.OperationTimeoutException: Timeout waiting for value - erreur.Impossible de se connecter aux clusters AWS ElastiCache à l'aide du client client Membase pour memcached

Lorsque j'essaie d'obtenir ou de définir une valeur. J'ai utilisé le même code sur ma machine locale (bien que je communique avec un serveur memcached local) et tout fonctionne correctement. Vous trouverez la stacktrace complète ici - http://pastebin.com/tYcCJ6cj

j'ai vu que je peux au moins obtenir l'adresse IP de tous les nœuds d'un cluster afin que je puisse le nourrir à mon client membase & Je suis vraiment en mesure de trouver sur les adresses IP du nœud. J'ai également veillé à ce que tous mes groupes de sécurité EC2 soient également ajoutés au groupe de sécurité du cluster de cache par défaut.

Tout pointeur sur ce point sera grandement utile.

MISE À JOUR

extrait de code utilisé pour chercher un enregistrement particulier.

public String getCachedValue(String namespace, String key) { 
    String value = null; 

    try { 
     MemcachedClient client 
      = CacheConnectionUtil.connectToElastiCacheMemcachedServer(); 

     // Point of origin for the exception. 
     return (String) client.get(namespace + "$" + hashKey(key));   
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return value; 
} 

extrait de code utilisé pour se connecter au serveur ElastiCache

private static MemcachedClient connectToElastiCacheMemcachedServer() 
    throws IOException { 

    DescribeCacheClustersResult cacheClustersInfo = null; 
    DescribeCacheClustersRequest cacheClusterRequest 
     = new DescribeCacheClustersRequest(); 
    cacheClusterRequest.setShowCacheNodeInfo(true); 

    try { 
    cacheClustersInfo = AWSConnectionUtil 
     .getElastiCacheObject(null) 
     .describeCacheClusters(cacheClusterRequest); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new IOException("Unable to connect to ElastiCache Cluster.", e); 
    } 

    if (cacheClustersInfo == null) { 
     throw new IOException("ElastiCache Cluster Info Object is null."); 
    } 

    List<CacheCluster> clusters = cacheClustersInfo.getCacheClusters(); 

    if (clusters == null || clusters.isEmpty()) { 
     throw new IOException("No ElastiCache Clusters available."); 
    } 

    List<String> serverList = new ArrayList<String>(); 
    for (CacheCluster cluster : clusters) { 
     if (cluster != null 
      && AWSConstants 
        .CACHE_CLUSTER_ID 
        .equalsIgnoreCase(cluster.getCacheClusterId())) { 

      List<CacheNode> nodes = cluster.getCacheNodes(); 
      if (nodes != null) { 
       for (CacheNode node : nodes) { 
        if (node != null) { 
         Endpoint endpoint = node.getEndpoint(); 
         if (endpoint != null 
          && endpoint.getAddress() != null) { 
          serverList.add(endpoint.getAddress() 
              + ":" 
              + endpoint.getPort()); 
         } 
        } 
       } 
      } 
     } 
    } 

    if (serverList.isEmpty()) { 
     throw new IOException("No Cached nodes available for cluster - " 
           + AWSConstants.CACHE_CLUSTER_ID); 
    } 

    return new MemcachedClient(AddrUtil.getAddresses(serverList)); 
} 
+0

Pouvez-vous poster votre code? Il n'est pas possible de diagnostiquer ce problème sans voir ce que vous faites. La trace de pile indique simplement que l'opération a duré trop longtemps. – mikewied

+0

@mikewied veuillez voir la question mise à jour ayant l'extrait de code. Merci. – Chantz

+0

Votre code semble correct et il n'y a rien qui me saute aux yeux. Je voudrais juste vérifier que la combinaison adresse/port est correcte. Si c'est le cas, essayez de vous connecter à l'une des machines de votre cluster depuis le même endroit que ce code et vérifiez si vous pouvez faire un get. – mikewied

Répondre

0

Utilisez le client ElastiCache Cluster modifié produit par Amazon.

http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/AutoDiscovery.html#AutoDiscovery.ClusterClient

Selon la documentation, pour télécharger le ElastiCache Cluster Client:

  1. Se connecter à la console de gestion AWS et ouvrez la console ElastiCache à https://console.aws.amazon.com/elasticache/.
  2. Dans la console ElastiCache, cliquez sur Télécharger le client de cluster ElastiCache.

Le code source du client de cluster ElastiCache pour Java est disponible au https://github.com/amazonwebservices/aws-elasticache-cluster-client-memcached-for-java. Cette bibliothèque est basée sur le populaire client Spymemcached. Le client de cluster ElastiCache est publié sous la licence de logiciel Amazon. Vous êtes libre de modifier le code source comme bon vous semble. vous pouvez même incorporer le code dans d'autres bibliothèques Memcached open source, ou dans votre propre code client.

Actuellement la version est 1.0.1. J'utilise la version 1.0 sans aucun problème depuis plus d'un an.

Questions connexes