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