如何在主要使用 C++ 绑定时提供 AffinityFunction.BackupFilter

How do I provide AffinityFunction.BackupFilter when mainly using C++ bindings

本文关键字:定时 绑定 BackupFilter AffinityFunction C++      更新时间:2023-10-16

我正在使用C++绑定在我的应用程序中实现冗余。除了主C++节点外,我还通过ignite.sh运行一个普通的Java节点作为另一个节点上的备份。我想指定这个普通的 Java 节点始终保持备份节点,而不是主节点,只要有一个正在运行的C++节点。另外,我需要C++节点始终保持为主节点。使用PRIMARY_SYNC同步时,少量数据丢失是可以接受的。

我的研究使我找到了AffinityFunction.BackupFilter属性来过滤C++节点作为主节点。似乎还有一些函数可以为节点提供属性。所以我想我可以在C++节点上设置一个特定的属性,并过滤它们以始终保持为主节点。

但是,C++绑定显然既不提供设置备份筛选器的方法,也不允许在启动的节点上设置属性。我注意到有些模块通过ignite-dir/libs插入,但没有关于添加AffinityFunction的方法的教程。我怎样才能实现我需要的?我需要插入一个自定义亲和函数,同时使用 C++ 作为主要节点和区分C++节点的方法。

这在Apache Ignite用户论坛上讨论过:http://apache-ignite-users.70518.x6.nabble.com/How-do-I-provide-AffinityFunction-BackupFilter-when-mainly-using-C-bindings-td11930.html

Ignite 将ignite_dir/libs中的文件添加到类路径中。根据文档,可以通过ClusterNode.attribute()方法读取环境变量。所以我把下面的java代码放到libs/文件夹中:

import java.util.List;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.lang.IgniteBiPredicate;
import org.apache.ignite.cache.affinity.*;
public class RendezvousAffinityFunction extends org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction {
@Override
public List<List<ClusterNode>> assignPartitions(AffinityFunctionContext affCtx) {
System.out.println("Assigning partitions...");
List<List<ClusterNode>> partitions = super.assignPartitions(affCtx);
for (List<ClusterNode> nodes : partitions) {
for (int i = 0; i < nodes.size(); ++i) {
ClusterNode node = nodes.get(i);
boolean is_primary_instance = ((Object)node.attribute("IGNITE_PRIMARY_NODE") != null);
if (is_primary_instance && i != 0) {
// move to the top of the node list
nodes.remove(i);
nodes.add(0, node);
System.out.println("Putting node " + i + " to the head of the node list.");
}
}
}
return partitions;
}
}

显然,此方法是在拓扑更改时调用的。方法覆盖检查环境变量IGNITE_PRIMARY_NODE,如果存在,它将节点放在ClusterNode列表的开头,然后由 Ignite 用作主节点。此覆盖将首选将环境变量设置为主节点IGNITE_PRIMARY_NODE节点。