无法使用Membase客户端lib连接到AWS ElastiCache群集以进行memcached

时间:2011-11-15 22:16:43

标签: java amazon-web-services timeout memcached amazon-elasticache

我遇到从我的EC2实例获取/设置到ElastiCache群集的问题。我收到了 - SEVERE: net.spy.memcached.OperationTimeoutException: Timeout waiting for value - 错误。

当我尝试获取或设置值时。我在本地机器上使用相同的代码(尽管与本地memcached服务器通信),一切正常。完整的堆栈跟踪可以在这里找到 - http://pastebin.com/tYcCJ6cj

我第一次看到我至少可以获得群集中所有节点的IP地址,以便我可以将其提供给我的membase客户端&我确实能够找到节点的ip地址。 我还确保将所有EC2安全组添加到默认缓存群集安全组中。

任何关于此的指示都将非常有用。

更新

用于获取特定记录的代码段。

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

用于连接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));
}

1 个答案:

答案 0 :(得分:0)

使用Amazon生产的修改后的ElastiCache群集客户端。

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

根据文档,下载ElastiCache群集客户端:

  1. 登录AWS管理控制台并在https://console.aws.amazon.com/elasticache/打开ElastiCache控制台。
  2. 在ElastiCache控制台中,单击“下载ElastiCache群集客户端”。
  3. ElastiCache Cluster Client for Java的源代码可在https://github.com/amazonwebservices/aws-elasticache-cluster-client-memcached-for-java获得。该库基于流行的Spymemcached客户端。 ElastiCache群集客户端根据亚马逊软件许可证发布。您可以根据需要随意修改源代码;您甚至可以将代码合并到其他开源Memcached库中,或者合并到您自己的客户端代码中。

    目前版本是1.0.1。一年多以来,我一直使用1.0版本没有任何问题。