Apache Ignite CacheRebalanceMode не соблюдается узлами - PullRequest
0 голосов
/ 14 июля 2020

Настройка: Привет, ребята, у меня есть простая настройка 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))
                            }
                }
            }
            };
        }

Ответы [ 2 ]

0 голосов
/ 21 июля 2020

Заполнять данные в экземпляре 1 и экземпляре 2, но избегать перемещения данных между ними. Другими словами, данные, полученные на каждом узле, должны оставаться в узле.

Проблема в том, что Ignite работает не так. Кэш - это действительно концепция всего кластера; то есть вы помещаете данные в кеш, а не в определенный узел c. Если вы хотите хранить данные на конкретном узле c, вы можете использовать ЛОКАЛЬНЫЙ кеш, но вы уже видели обратную сторону этого.

Вместо того, чтобы принудительно передавать данные на конкретный c компьютер, воспользуйтесь использует концепцию « affinity ». Вы сообщаете ему, как данные связаны, и он автоматически сохраняет эти данные вместе.

Помещение данных в конкретную c машину работает нормально, пока вы не захотите изменить количество узлов (или есть один провал). Определяя сходство, Ignite может автоматически увеличиваться и уменьшаться.

0 голосов
/ 15 июля 2020

CacheRebalanceMode.None в основном означает «не перемещать данные на новый добавленный узел», а не «сохранять все записи локально». cache.Put по-прежнему будет отправлять данные на первичный узел для данного ключа.

Следующий код демонстрирует, как работает режим None:

var cfg = new IgniteConfiguration
{
    AutoGenerateIgniteInstanceName = true,
    CacheConfiguration = new[]
    {
        new CacheConfiguration
        {
            Name = "c",
            RebalanceMode = CacheRebalanceMode.None
        }
    }
};

var ignite1 = Ignition.Start(cfg);
var cache1 = ignite1.GetCache<int, int>("c");

// Put before starting the second node.
cache1.PutAll(Enumerable.Range(1, 10000).Select(x => new KeyValuePair<int, int>(x, x)));

var ignite2 = Ignition.Start(cfg);
var cache2 = ignite2.GetCache<int, int>("c");

Thread.Sleep(5000); // Wait for the rebalance.
Console.WriteLine(cache1.GetLocalSize());
Console.WriteLine(cache2.GetLocalSize()); // 0 with None

В режиме None вы ' Увидим нулевой размер второго кеша, и в любом другом режиме он не будет нулевым.

...