2017-04-13 40 views
1

我正在使用C++绑定在我的应用程序中具有冗余。除了主要的C++节点之外,我通过ignite.sh作为另一个节点上的备份运行一个vanilla Java节点。我希望指定这个香草Java节点,以便始终保持备份节点,并且只要有C++节点正在运行,永远不会是主节点。另外,我需要C++节点始终保持为主节点。 PRIMARY_SYNC同步有一点数据丢失是可以接受的。如何在主要使用C++绑定时提供AffinityFunction.BackupFilter

我的研究导致我去AffinityFunction.BackupFilter属性过滤C++节点为主。看来还有一些功能可以将属性赋予节点。所以我想我可以在C++节点上设置一个特定的属性,并将它们过滤为始终保持为主节点。

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

回答

2

点燃添加文件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环境变量作为主节点的节点。

相关问题