2012-11-08 58 views
9

對於我目前的項目,我們決定在一些Linux機器上將我們的應用程序部署到Amazon的Elastic Computing Cloud。我們使用JGroups進行組通信,並且需要一個可靠的發現機制,不需要使用其他羣集成員的地址(這對TCPPING是必需的,並且需要使用TCPGOSSIP進行'排序')來預配置每個應用程序。由於我們不能使用UDP多播,因此不包括來自我們的選項的多播發現。EC2 JGroups發現

我們研究了使用S3 Ping協議,但在閱讀之後發現存在一些可靠性問題後,我們決定推出我們自己的協議來完成這一發現。

我很想獲得關於我們編寫的簡單協議以及它如何與S3 Ping進行比較的一些反饋。目前的限制是它依賴於適用於Java的AWS開發工具包。

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

我可以包括我的協議棧的配置,如果有必要,但它是非常相似的UDP除了代替多播發現,它使用了我們的EC2Ping協議。

我的主要問題如下:

  1. 是否比S3平安目前這個更可靠的解決方案嗎?
  2. 對AWS Java SDK的依賴性是否否定此解決方案的實用性? (在回饋給JGroups方面)

任何意見將不勝感激。謝謝

回答

7

你可能想看看在GitHub上的JGroups AWS Project。它使用AWS API來使用EC2標籤構建集羣。它還支持實例配置文件,因此您可以從配置文件中獲取訪問密鑰和密鑰。