2012-11-08 4 views
9

私の現在のプロジェクトでは、一部のLinuxボックスでAmazonのElastic Computing Cloudにアプリケーションをデプロイすることに決めました。グループ通信にはJGroupsを使用し、他のクラスタメンバーのアドレス(TCPPINGでは必要あり、TCPGOSSIPで必要な「並べ替え」)で各アプリケーションを事前に設定する必要はありませんでした。 UDPマルチキャストを使用することはできないため、オプションからのマルチキャスト検出は除外されます。EC2 JGroupsディスカバリー

S3 Pingプロトコルを使用しましたが、信頼性の問題があることを確認した後、独自のプロトコルを実行してこの発見を達成することにしました。

私が書いた簡単なプロトコルとS3 Pingとの比較方法についてのフィードバックを頂きたいと思います。現在のところ、AWS SDK for Javaに依存しています。

public class EC2Ping extends Discovery { 

    private static final Logger log = LoggerFactory.getLogger(EC2Ping.class); 

    public static final short EC2_PING_PROTOCOL_ID = 1001; 
    private static final int DEFAULT_JGROUPS_PORT = 7800; 

    static { 
     ClassConfigurator.addProtocol(EC2_PING_PROTOCOL_ID, EC2Ping.class); 
    } 

    /** The JGroups port number */ 
    private int port = DEFAULT_JGROUPS_PORT; 

    /** The EC2 client */ 
    private AmazonEC2Client client; 

    /** The EC2 instance filters */ 
    private List<Filter> filters; 

    public EC2Ping(EC2Ping src) { 
     this.client = src.client; 
     this.port = src.port; 
    } 

    public EC2Ping() { 
     // Default constructor 
    } 

    @Required 
    public void setClient(AmazonEC2Client client) { 
     this.client = client; 
    } 

    public void setFilters(List<Filter> filters) { 
     this.filters = filters; 
    } 

    public void setPort(int port) { 
     this.port = port; 
    } 

    public int getPort() { 
     return port; 
    } 

    @Override 
    public Collection<PhysicalAddress> fetchClusterMembers(String cluster_name) { 
     List<PhysicalAddress> addresses = new ArrayList<PhysicalAddress>(); 
     DescribeInstancesRequest request = new DescribeInstancesRequest(); 
     if (filters != null) { 
      request.setFilters(filters); 
     } 
     DescribeInstancesResult result = client.describeInstances(request); 
     for (Reservation res : result.getReservations()) { 
      for (Instance instance : res.getInstances()) { 
       String ipAddr = instance.getPrivateIpAddress(); 
       IpAddress addr; 
       try { 
        addr = new IpAddress(ipAddr, port); 
        addresses.add(addr); 
       } catch (UnknownHostException uhe) { 
        log.error("Unable to resolve cluster member address [" + ipAddr + "]"); 
       } 
      } 
     } 
     return addresses; 
    } 

    @Override 
    public boolean isDynamic() { 
     return true; 
    } 

    @Override 
    public boolean sendDiscoveryRequestsInParallel() { 
     return true; 
    } 
} 

必要であれば、私は自分のプロトコルスタック構成を含めることができますが、それはそれが私たちのEC2Pingプロトコルを使用して、代わりにマルチキャスト発見のものを除き、UDPと非常によく似ています。

私の主な質問

は次のとおりです。

  1. S3のPingよりも、この存在より信頼性の高いソリューションをしていますか?
  2. AWS Java SDKへの依存性がこのソリューションの有用性を否定しますか? (JGroupsへの寄稿の面で)

すべてのコメントをいただければ幸いです。ありがとう

答えて

7

あなたはGitHubのJGroups AWS Projectを見てみたいです。 AWS APIを使用してEC2タグを使用してクラスタを構築します。また、インスタンスプロファイルもサポートしているため、設定ファイルからアクセスキーと秘密鍵を取得できます。