воспламенить — как я могу предоставить AffinityFunction.BackupFilter, когда в основном используются привязки C ++

Я использую привязки C ++, чтобы иметь избыточность в моем приложении. Наряду с основным узлом C ++, я запускаю ванильный узел Java через ignite.sh в качестве резервной копии на другом узле. Я хотел бы назначить этот ванильный узел Java, чтобы всегда оставаться резервное копирование узел и никогда не первичный узел, пока работает узел C ++. Кроме того, мне нужно, чтобы узлы C ++ всегда оставались первичными узлами. Небольшая потеря данных допустима с PRIMARY_SYNC синхронизации.

Мои исследования привели меня к AffinityFunction.BackupFilter свойство фильтровать узлы C ++ как первичные. Кажется, что есть также некоторые функции, чтобы дать атрибуты к узлам. Так что, я думаю, я могу установить определенный атрибут на узлах C ++ и отфильтровать их, чтобы они всегда оставались первичными узлами.

Однако привязки C ++, по-видимому, не предоставляют ни способа установки резервного фильтра, ни разрешения установки атрибутов на запущенном узле. Я заметил, что некоторые модули подключены через ignite-dir/libs но нет никакого учебника об этом подходе, чтобы добавить AffinityFunction, Как я могу достичь того, что мне нужно? Мне нужно подключить пользовательскую аффинную функцию, используя C ++ в качестве основного и способ различать узлы C ++.

1

Решение

Это обсуждается на форуме пользователей Apache Ignite: http://apache-ignite-users.70518.x6.nabble.com/How-do-I-provide-AffinityFunction-BackupFilter-when-mainly-using-C-bindings-td11930.html

3

Другие решения

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 переменная окружения, установленная в качестве основных узлов.

2

По вопросам рекламы [email protected]