9

現在のプロジェクトでは、アプリケーションをいくつかの Linux ボックスで Amazon の Elastic Computing Cloud にデプロイすることにしました。私たちはグループ通信に JGroups を使用しており、各アプリケーションを他のクラスターメンバーのアドレスで事前構成する必要のない信頼できる検出メカニズムが必要でした (TCPPING では必要であり、TCPGOSSIP では「ソート」が必要です)。UDP マルチキャストを使用できないため、マルチキャスト検出はオプションから除外されます。

S3 Ping プロトコルの使用を検討しましたが、いくつかの信頼性の問題があることを読んだ後、この発見を達成するために独自のプロトコルを展開することにしました。

私たちが作成したシンプルなプロトコルと、S3 Ping との比較についてフィードバックをいただければ幸いです。現在の 1 つの制限は、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;
    }
}

必要に応じてプロトコル スタック構成を含めることができますが、UDP と非常に似ていますが、マルチキャスト検出の代わりに EC2Ping プロトコルを使用する点が異なります。

私の主な質問は次のとおりです。

  1. これは、S3 Ping よりも信頼性の高いソリューションを提供しますか?
  2. AWS Java SDK への依存は、このソリューションの有用性を無効にしますか? (JGroups への貢献に関して)

どんなコメントでも大歓迎です。ありがとう

4

1 に答える 1

7

GitHubにあるJGroups AWS プロジェクトを参照してください。AWS API を使用して、EC2 タグを使用してクラスターを構築します。また、インスタンス プロファイルもサポートしているため、構成ファイルからアクセス キーとシークレット キーを取得できます。

于 2012-11-12T16:35:29.907 に答える