我正在研究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。这是什么意思?如何选择主节点?希望得到你的帮助。
答案 0 :(得分:4)
在多播发现中,每个节点在启动加入过程之前计算自己的maxTryCount
。 maxTryCount
是在将自己声明为主节点之前,该特定节点将发布的最大连接消息数。
使用一些参数计算,例如多播超时,IP地址和节点端口等。请参阅MulticastJoiner.calculateTryCount()
。因此,这里的主要目的是每个节点(最可能)将具有不同的最大尝试次数。
此外,当节点收到加入请求时,如果maxTryCount
内定义的pure function返回1
,则MulticastJoiner.onReceivedJoinRequest()
会增加true
:
joinRequest.getUuid().compareTo(node.localMember.getUuid()) < 0
这是为了双方maxTryCount
分歧。
一旦节点发布maxTryCount
个加入消息,它就会声明自己为主(最老的成员)并开始接受/响应加入请求。
答案 1 :(得分:0)
Hazelcast的一个主要功能是它没有主成员。每个集群成员在功能方面配置相同。 最旧的成员(在群集中创建的第一个成员)自动执行对群集成员的数据分配。
启动成员时,会在其中创建分区表。此表存储分区ID及其所属的集群成员。此表的目的是使集群中的所有成员(包括lite成员)都知道此信息,确保每个成员都知道数据的位置。
群集中最旧的成员(首先启动的成员)会定期将分区表发送给所有成员。通过这种方式,群集的每个成员都会收到有关分区所有权的任何更改的通知。例如,当新成员加入群集或成员离开群集时,可能会更改所有权。
注意:如果群集中最旧的成员发生故障,则下一个最旧的成员会将分区表信息发送给其他成员。
谢谢