hazelcast使用什么算法来查找主节点

时间:2017-01-21 06:32:28

标签: hazelcast multicast

我正在研究hazelcast用于以多播方式查找主节点的算法。首先我找到找到主节点的函数:com.hazelcast.cluster.MulticastJoiner.findMasterWithMulticast()

private Address findMasterWithMulticast() {
    try {
        if (logger.isFinestEnabled()) {
            logger.finest("Searching for master node. Max tries: " + maxTryCount.get());
        }
        JoinRequest joinRequest = node.createJoinRequest();
        while (node.isActive() && currentTryCount.incrementAndGet() <= maxTryCount.get()) {
            joinRequest.setTryCount(currentTryCount.get());
            node.multicastService.send(joinRequest);
            if (node.getMasterAddress() == null) {
                //noinspection BusyWait
                Thread.sleep(PUBLISH_INTERVAL);
            } else {
                return node.getMasterAddress();
            }
        }
    } catch (final Exception e) {
        if (logger != null) {
            logger.warning(e);
        }
    } finally {
        currentTryCount.set(0);
    }
    return null;
}

该函数所做的只是将joinRequest发送到相同集群中的其他节点。 函数com.hazelcast.cluster.MulticastJoiner.onReceivedJoinRequest(JoinRequest)处理joinRequest。

public void onReceivedJoinRequest(JoinRequest joinRequest) {
    if (joinRequest.getUuid().compareTo(node.localMember.getUuid()) < 0) {
        maxTryCount.incrementAndGet();
    }
}

它只增加了trycount。这是什么意思?如何选择主节点?希望得到你的帮助。

2 个答案:

答案 0 :(得分:4)

在多播发现中,每个节点在启动加入过程之前计算自己的maxTryCountmaxTryCount是在将自己声明为主节点之前,该特定节点将发布的最大连接消息数。

使用一些参数计算,例如多播超时,IP地址和节点端口等。请参阅MulticastJoiner.calculateTryCount()。因此,这里的主要目的是每个节点(最可能)将具有不同的最大尝试次数。

此外,当节点收到加入请求时,如果maxTryCount内定义的pure function返回1,则MulticastJoiner.onReceivedJoinRequest()会增加true

joinRequest.getUuid().compareTo(node.localMember.getUuid()) < 0

这是为了双方maxTryCount分歧。

一旦节点发布maxTryCount个加入消息,它就会声明自己为主(最老的成员)并开始接受/响应加入请求。

答案 1 :(得分:0)

Hazelcast的一个主要功能是它没有主成员。每个集群成员在功能方面配置相同。 最旧的成员在群集中创建的第一个成员)自动执行对群集成员的数据分配。

启动成员时,会在其中创建分区表。此表存储分区ID及其所属的集群成员。此表的目的是使集群中的所有成员(包括lite成员)都知道此信息,确保每个成员都知道数据的位置。

群集中最旧的成员(首先启动的成员)会定期将分区表发送给所有成员。通过这种方式,群集的每个成员都会收到有关分区所有权的任何更改的通知。例如,当新成员加入群集或成员离开群集时,可能会更改所有权。

注意:如果群集中最旧的成员发生故障,则下一个最旧的成员会将分区表信息发送给其他成员。

谢谢