6

私のEC2インスタンスからElastiCacheクラスタへの取得/設定に問題があります。私は得ています - SEVERE: net.spy.memcached.OperationTimeoutException: Timeout waiting for value - エラー。memcachedのMembaseクライアントライブラリを使用してAWS ElastiCacheクラスタに接続できません

値を取得または設定しようとしています。ローカルのマシンで同じコードを使用しましたが(ローカルmemcachedサーバーと通信していますが)、すべて正常に動作します。 http://pastebin.com/tYcCJ6cj

私は最初に、クラスタのすべてのノードのIPアドレスを取得して、それを私のmembaseクライアントに送ることができます&私は確かに見つけることができますノードのIPアドレスを取り出します。 また、すべてのEC2セキュリティグループがデフォルトキャッシュクラスタセキュリティグループに追加されていることを確認しました。

これについてのあらゆる指針は非常に役に立ちます。特定のレコードを取得するために使用

UPDATE

コードスニペット。

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)); 
} 
+0

コードを投稿できますか?あなたのやり方を見ずにこの問題を診断することはできません。スタックトレースは、操作が完了するまでに時間がかかりすぎたと言うだけです。 – mikewied

+0

@mikewiedコードスニペットを持つ最新の質問をご覧ください。ありがとう。 – Chantz

+0

あなたのコードが正しく表示され、私に飛び出すことはありません。私はちょうどアドレス/ポートの組み合わせが正しいことを確認します。その場合は、このコードが実行されている同じ場所からクラスター内のマシンの1つにtelnetで接続し、getを実行できるかどうかを確認してください。 – mikewied

答えて

0

アマゾンによって生成修正ElastiCacheクラスタークライアントを使用するように接続するために使用スニペット。文書によると

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

、ElastiCacheクラスタークライアントをダウンロードする:AWS管理コンソールに

  1. ログインしてhttps://console.aws.amazon.com/elasticache/でElastiCacheコンソールを開きます。
  2. ElastiCacheコンソールから、[ElastiCache Cluster Clientのダウンロード]をクリックします。

Java用ElastiCache Cluster Clientのソースコードはhttps://github.com/amazonwebservices/aws-elasticache-cluster-client-memcached-for-javaです。このライブラリは、一般的なSpymemcachedクライアントに基づいています。 ElastiCache Cluster ClientはAmazon Software Licenseの下でリリースされています。ソースコードを自由に変更することができます。コードを他のオープンソースのMemcachedライブラリや独自のクライアントコードに組み込むことさえできます。

現在、バージョンは1.0.1です。私はバージョン1.0を1年以上問題なく使用しています。