主要使用 C++ 绑定时如何提供 AffinityFunction.BackupFilter
How do I provide AffinityFunction.BackupFilter when mainly using C++ bindings
我正在使用 C++ 绑定在我的应用程序中实现冗余。在主 C++ 节点旁边,我是 运行 普通 Java 节点,通过 ignite.sh
作为另一个节点上的备份。我想指定这个 vanilla Java 节点始终保持 backup 节点,并且只要有 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;
}
}
显然,此方法在拓扑更改时调用。方法 override 检查环境变量 IGNITE_PRIMARY_NODE
,如果它存在,它将节点放在 ClusterNode
列表的开头,然后 Ignite 将其用作主节点。此覆盖将优先选择具有 IGNITE_PRIMARY_NODE
环境变量设置为主节点的节点。
我正在使用 C++ 绑定在我的应用程序中实现冗余。在主 C++ 节点旁边,我是 运行 普通 Java 节点,通过 ignite.sh
作为另一个节点上的备份。我想指定这个 vanilla Java 节点始终保持 backup 节点,并且只要有 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;
}
}
显然,此方法在拓扑更改时调用。方法 override 检查环境变量 IGNITE_PRIMARY_NODE
,如果它存在,它将节点放在 ClusterNode
列表的开头,然后 Ignite 将其用作主节点。此覆盖将优先选择具有 IGNITE_PRIMARY_NODE
环境变量设置为主节点的节点。