2012-11-08 18 views
9

Đối với dự án hiện tại của tôi, chúng tôi đã quyết định triển khai ứng dụng của mình vào Đám mây điện toán đàn hồi của Amazon trên một số hộp Linux. Chúng tôi sử dụng JGroups để giao tiếp nhóm và cần một cơ chế khám phá đáng tin cậy mà không yêu cầu cấu hình trước từng ứng dụng với địa chỉ của các thành viên cụm khác (cần thiết với TCPPING và 'sắp xếp' cần thiết với TCPGOSSIP). Vì chúng ta không thể sử dụng multicast UDP, nó không bao gồm phát hiện multicast từ các tùy chọn của chúng ta.EC2 JGroups Discovery

Chúng tôi xem xét sử dụng giao thức S3 Ping, nhưng sau khi đọc rằng có một số vấn đề về độ tin cậy với nó, chúng tôi quyết định cuộn giao thức của riêng chúng tôi thực hiện khám phá này.

Tôi muốn nhận được một số phản hồi về giao thức đơn giản mà chúng tôi đã viết và cách nó có thể so sánh với S3 Ping. Một hạn chế mà nó hiện có là nó phụ thuộc vào SDK AWS cho 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; 
    } 
} 

Tôi có thể bao gồm cấu hình ngăn xếp giao thức nếu cần, nhưng nó rất giống với UDP ngoại trừ thay vì phát hiện Multicast, nó sử dụng giao thức EC2Ping của chúng tôi.

câu hỏi chính của tôi là như sau:

  1. Liệu một giải pháp đáng tin cậy hơn hiện nay so với S3 Ping?
  2. Sự phụ thuộc vào SDK Java AWS có phủ nhận tính hữu ích của giải pháp này không? (về việc đóng góp lại cho JGroups)

Mọi nhận xét sẽ được đánh giá cao. Cảm ơn

Trả lời

7

Bạn có thể muốn xem qua số JGroups AWS Project trên GitHub. Nó sử dụng các API AWS để xây dựng các cụm bằng cách sử dụng thẻ EC2. Nó cũng hỗ trợ các hồ sơ cá thể, do đó bạn có thể lấy khóa truy cập và khóa bí mật trong tệp cấu hình của mình.