Apache.Ignite.NET - 定义缓存特定关联的节点

时间:2018-02-17 09:24:59

标签: apache ignite

在Ignite.NET中,可以在“相同”节点上缓存具有相同亲和力的键值对。是否可以定义应该使用的特定节点?

这是一个测试程序,我想定义一个节点来缓存关联性“customer”,另一个节点来缓存关联性“member”。

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        using (var ignite = Ignition.Start())

        {
            var cache = ignite.GetOrCreateCache<AffinityKey, Person>(new CacheConfiguration("person-cache")
            {
                CacheMode = CacheMode.Partitioned,
            });

            cache.Put(new AffinityKey(1, "customer"), new Person { Name = "Test customer", Age = 7 });
            cache.Put(new AffinityKey(1, "member"), new Person { Name = "Test member", Age = 7 });

            foreach (var item in cache)
            {
                Console.WriteLine($"{item.Key}: {item.Value.Name} - {item.Value.Age}");
            }

            Console.ReadKey();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在您的代码中,所有客户都将进入一个分区,并且所有成员也将聚集在一个分区中,但是没有100%保证它将是两个不同的分区,这也意味着您将有错误的数据分发,因为只有两个分区,最好只能使用2个主机和2个CPU内核。

因此,对于您的情况,我建议使用两个不同的节点过滤器缓存: https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/configuration/CacheConfiguration.html#setNodeFilter(org.apache.ignite.lang.IgnitePredicate)

在谓词中,您可以指定应该使用哪个节点来存储每个缓存的数据,以及按节点分割记录。

答案 1 :(得分:1)

看起来您处于CPU Affinity的上下文中,用于将特定进程/线程分配/绑定到某个特定的CPU核心。

Apache Ignite将Affinity用于其他目的。这是collocating在同一群集节点上输入多个数据类型(缓存)的方法。因此,通过在群集的同一节点处寻址特定数据分区,亲缘关系可以提高跨缓存操作的性能,同时保持群集中的一般数据分布。

您应该使用迈克尔建议的cluster groups和/或节点过滤器。