6

Tengo problemas para obtener/establecer un clúster de ElastiCache desde mi instancia de EC2. Estoy recibiendo - SEVERE: net.spy.memcached.OperationTimeoutException: Timeout waiting for value - error.No se puede conectar a los clústeres de AWS ElastiCache con el cliente de Membase lib para memcached

Cuando intento obtener o establecer un valor. Usé el mismo código en mi máquina local (aunque comunicándome con un servidor de memcached local) y todo funciona bien. El StackTrace completa se puede encontrar aquí - http://pastebin.com/tYcCJ6cj

vi por primera vez que puedo, al menos, obtener la dirección IP de todos los nodos de un clúster de modo que pueda darle de comer a mi cliente membase & verdad soy capaz de encontrar las direcciones IP del nodo. También me aseguré de que todos mis grupos de seguridad EC2 también se agreguen al grupo de seguridad del clúster de caché predeterminado.

Cualquier sugerencia sobre esto será de gran ayuda.

ACTUALIZACIÓN

fragmento de código utiliza para buscar un registro en particular.

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

fragmento de código utiliza para conectarse al servidor 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

¿Puedes publicar tu código? No es posible diagnosticar este problema sin ver lo que estás haciendo. El seguimiento de la pila solo dice que la operación tomó demasiado tiempo para completarse. – mikewied

+0

@mikewied, vea la pregunta actualizada que tiene un fragmento de código. Gracias. – Chantz

+0

Su código aparece correcto y no hay nada que salte hacia mí. Solo verificaría que la combinación de dirección/puerto sea correcta. Si es así, intente hacer telnet a una de las máquinas de su clúster desde el mismo lugar donde se está ejecutando este código y verifique si puede hacer una obtención. – mikewied

Respuesta

0

Utilice el cliente ElastiCache Cluster modificado producido por Amazon.

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

Según la documentación, para descargar el cliente ElastiCache Cluster:

  1. sesión en AWS Management Console y abra la consola ElastiCache en https://console.aws.amazon.com/elasticache/.
  2. Desde la consola ElastiCache, haga clic en Descargar ElastiCache Cluster Client.

El código fuente para ElastiCache Cluster Client para Java está disponible en https://github.com/amazonwebservices/aws-elasticache-cluster-client-memcached-for-java. Esta biblioteca se basa en el popular cliente Spymemcached. ElastiCache Cluster Client se publica bajo la licencia de software de Amazon. Usted es libre de modificar el código fuente como mejor le parezca; incluso puede incorporar el código en otras bibliotecas Memcached de código abierto o en su propio código de cliente.

Actualmente la versión es 1.0.1. He estado usando la versión 1.0 sin ningún problema durante más de un año.

Cuestiones relacionadas