Настройка: Привет, ребята, у меня есть простая настройка Apache Ignite с двумя экземплярами Ignite, настроенными как серверные узлы более C#, и одним экземпляром Ignite как клиентским узлом более java.
Какова цель: Заполнить данные в экземпляре 1 и экземпляре 2, но избегать перемещения данных между ними. Другими словами, данные, полученные на каждом узле, должны оставаться в узле. Затем с помощью клиента java запускайте запросы к двум узлам либо вместе (распределенное соединение), либо на каждом узле (с использованием привязки).
Проблема: С одним серверным узлом все работает как ожидается, однако на более чем одном узле сервера данные кластера балансируются между узлами-членами x, даже если я явно установил CacheRebalanceMode
на None
, что должно отключить перебалансировку между этими узлами. Время вставки увеличивается в 4-10 раз, функция зависит от заполненных данных каждого узла.
PS Я пробовал изменить режим кеширования с Partitioned
на Local
, где каждый узел будет изолировать данные в нем внутренняя база данных H2, однако в этом случае клиент Java не может обнаружить узлы или прочитать какие-либо данные из кеша каждого узла.
Java Клиентский узел
IgniteConfiguration cfg = new IgniteConfiguration();
// Enable client mode.
cfg.setClientMode(true);
// Setting up an IP Finder to ensure the client can locate the servers.
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setAddresses(Collections.singletonList("127.0.0.1:47500..47509"));
cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(ipFinder));
// Configure Ignite to connect with .NET nodes
cfg.setBinaryConfiguration(new BinaryConfiguration()
.setNameMapper(new BinaryBasicNameMapper(true))
.setCompactFooter(true)
// Start Ignite in client mode.
Ignite ignite = Ignition.start(cfg);
IgniteCache<AffinityKey, Trade> cache0 = ignite.cache(CACHE_NAME);
IgniteCache<AffinityKey, BinaryObject> cache = cache0.withKeepBinary();
// execute some queries to nodes
C# Узел сервера
IIgnite _ignite = Ignition.Start(IgniteUtils.DefaultIgniteConfig()));
// Create new cache and configure queries for Trade binary types.
// Note that there are no such classes defined.
var cache0 = _ignite.GetOrCreateCache<AffinityKey, Trade>("DEALIO");
// Switch to binary mode to work with data in serialized form.
_cache = cache0.WithKeepBinary<AffinityKey, IBinaryObject>();
//populate some data ...
public static IgniteConfiguration DefaultIgniteConfig()
{
return new IgniteConfiguration
{
PeerAssemblyLoadingMode = PeerAssemblyLoadingMode.CurrentAppDomain,
BinaryConfiguration = new BinaryConfiguration
{
NameMapper = new BinaryBasicNameMapper { IsSimpleName = true },
CompactFooter = true,
TypeConfigurations = new[] {
new BinaryTypeConfiguration(typeof(Trade)) {
Serializer = new IgniteTradeSerializer()
}
}
},
DiscoverySpi = new TcpDiscoverySpi
{
IpFinder = new TcpDiscoveryMulticastIpFinder
{
Endpoints = new[] { "127.0.0.1:47500..47509" }
},
SocketTimeout = TimeSpan.FromSeconds(0.10)
},
Logger = new IgniteNLogLogger(),
CacheConfiguration = new[]{
new CacheConfiguration{
PartitionLossPolicy=PartitionLossPolicy.Ignore,
RebalanceMode=CacheRebalanceMode.None,
Name = CACHE_NAME,
CacheMode = CacheMode.Partitioned,
Backups = 0,
QueryEntities = new[] {
new QueryEntity(typeof(AffinityKey), typeof(Trade))
}
}
}
};
}