Я использую привязки C ++, чтобы иметь избыточность в моем приложении. Наряду с основным узлом C ++, я запускаю ванильный узел Java через ignite.sh
в качестве резервной копии на другом узле. Я хотел бы назначить этот ванильный узел 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
в classpath. Согласно документации, переменные среды могут быть прочитаны через 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
переменная окружения, установленная в качестве основных узлов.