2012-11-08 5 views
9

Für mein aktuelles Projekt haben wir uns entschieden, unsere Anwendung in einigen Linux-Boxen in Amazon Elastic Computing Cloud zu implementieren. Wir verwenden JGroups für die Gruppenkommunikation und benötigten einen zuverlässigen Erkennungsmechanismus, der keine Vorkonfiguration jeder Anwendung mit den Adressen der anderen Cluster-Mitglieder erforderte (was bei TCPPING notwendig ist und bei TCPGOSSIP mit "Sort" erforderlich ist). Da wir UDP-Multicast nicht verwenden können, schließt dies die Multicast-Erkennung aus unseren Optionen aus.EC2 JGroups Discovery

Wir haben uns mit dem S3-Ping-Protokoll beschäftigt, aber nachdem wir gelesen hatten, dass es einige Zuverlässigkeitsprobleme gab, entschieden wir uns, unser eigenes Protokoll zu erstellen, um diese Entdeckung zu erreichen.

Ich würde gerne ein Feedback über das einfache Protokoll bekommen, das wir geschrieben haben und wie es mit dem S3 Ping verglichen werden könnte. Die einzige Einschränkung ist, dass es vom AWS SDK für Java abhängt.

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

Ich kann mein Protokoll-Stack-Konfiguration bei Bedarf enthalten, aber es ist sehr ähnlich wie UDP, außer dass anstelle von Multicast-Entdeckung, verwendet es unser EC2Ping Protokoll.

Meine Hauptfragen sind wie folgt:

  1. Ist diese vorhanden, eine zuverlässigere Lösung als die S3 Ping?
  2. Negiert die Abhängigkeit vom AWS Java SDK die Nützlichkeit dieser Lösung? (in Bezug auf Beiträge zurück zu JGroups)

Alle Kommentare würden sehr geschätzt werden. Danke

Antwort

7

Sie möchten vielleicht einen Blick auf die JGroups AWS Project auf GitHub werfen. Es verwendet die AWS-APIs zum Erstellen von Clustern mithilfe von EC2-Tags. Es unterstützt auch Instanzprofile, sodass Sie den Zugriffsschlüssel und den geheimen Schlüssel aus Ihrer Konfigurationsdatei abrufen können.