9

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

我们研究过使用 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 Ping 更可靠的解决方案?
  2. 对 AWS Java 开发工具包的依赖是否否定了该解决方案的实用性?(在回馈 JGroups 方面)

任何意见将不胜感激。谢谢

4

1 回答 1

7

您可能想查看GitHub 上的JGroups AWS 项目。它使用 AWS API 使用 EC2 标签构建集群。它还支持实例配置文件,因此您可以从配置文件中获取访问密钥和密钥。

于 2012-11-12T16:35:29.907 回答