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

时间:2017-04-13 08:05:57

标签: c++ ignite gridgain

我正在使用C ++绑定在我的应用程序中具有冗余。除了主要的C ++节点,我通过ignite.sh运行一个vanilla Java节点作为另一个节点上的备份。我想指定这个vanilla Java节点始终保持备份节点,并且只要有一个C ++节点正在运行,就永远不会成为主节点。此外,我需要C ++节点始终作为主节点。 PRIMARY_SYNC同步可以接受一点数据丢失。

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

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

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

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环境变量设置为主节点的节点。