EC2 JGroups Discovery

dga*_*son 9 java jgroups amazon-ec2 discovery

对于我目前的项目,我们决定在一些Linux机器上将我们的应用程序部署到亚马逊的Elastic Computing Cloud.我们使用JGroups进行组通信,并且需要一种可靠的发现机制,该机制不需要使用其他集群成员的地址预先配置每个应用程序(这对于TCPPING是必需的,并且TCPGOSSIP需要'排序').由于我们不能使用UDP多播,因此从我们的选项中排除了多播发现.

我们研究了使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,我可以包括我的协议栈配置,但它与UDP非常相似,除了它使用我们的EC2Ping协议而不是多播发现.

我的主要问题如下:

  1. 这是否比S3 Ping提供更可靠的解决方案?
  2. 对AWS Java SDK的依赖性是否否定了此解决方案的实用性?(在回馈JGroups方面)

任何评论将不胜感激.谢谢

Chr*_*ble 7

您可能希望在GitHub上查看JGroups AWS Project.它使用AWS API使用EC2标记构建集群.它还支持实例配置文件,因此您可以从配置文件中获取访问密钥和密钥.