【问题标题】:Problem with Hazelcast eviction the firsts entries and small size in configurationHazelcast驱逐第一个条目和配置中的小尺寸的问题
【发布时间】:2018-10-03 15:02:51
【问题描述】:

这个简单的 JUnit 测试总是失败(Hazelcast 3.9.1):

测试类是:

public class TestHZ {

    @Test
    public void testEviction() {

        Config config = new XmlConfigBuilder(getXml()).build();
        config.setInstanceName("myTestInstance");
        HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);

        IMap<Integer, Integer> cache2 = hz.getMap("MyTest2");       
        cache2.put(123, 456);
        assertNotNull(cache2.get(123));   // <--- ALWAYS OK: conf LRU and 6000 entries

        IMap<Integer, Integer> cache = hz.getMap("MyTest");     
        cache.put(123, 456);
        assertNotNull(cache.get(123));    // <--- ALWAYS ERROR: conf LRU and 200 entries

    }

    private InputStream getXml() {
        System.out.println(MY_CONF_XML);
        return new ByteArrayInputStream(MY_CONF_XML.getBytes());
    }

以及具有此值的配置常量:

private static final String MY_CONF_XML = 
        "<hazelcast xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n" + 
        "   xsi:schemaLocation=\"http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.9.xsd\"\r\n" + 
        "   xmlns=\"http://www.hazelcast.com/schema/config\">\r\n" + 
        "\r\n" + 
        "   <map name=\"MyTest\">\r\n" + 
        "       <eviction-policy>LRU</eviction-policy>\r\n" + 
        "       <max-size policy=\"PER_NODE\">200</max-size>\r\n" + 
        "   </map>\r\n" + 
        "\r\n" + 
        "   <map name=\"MyTest2\">\r\n" + 
        "       <eviction-policy>LRU</eviction-policy>\r\n" + 
        "       <max-size policy=\"PER_NODE\">6000</max-size>\r\n" + 
        "   </map>\r\n" + 
        "\r\n" + 
        "</hazelcast>\r\n" + 
        "";

当地图配置包含最大大小为 200 个条目时,我总是无法尝试离开第一个条目。

其他人有同样的错误吗?

为什么,配置 6000 时总是顺利,而配置 200 时总是出错?

【问题讨论】:

    标签: hazelcast hazelcast-imap


    【解决方案1】:

    我找到了问题的解释和测试的解决方案。

    Hazelcast 默认将每张地图分为 271 个部分。见:Why hazelcast has default partition count of 271 and what are the parameters to chose one?

    对于小于 271 的地图尺寸,它会失败。

    要测试(JUnit)那么最好将分区数设置为较低的数字。例如 11:

    @Test
    public void testEviction() {
    
        // Only for tests
        System.setProperty("hazelcast.partition.count", "11");
    
        Config config = new XmlConfigBuilder(getXml()).build();
    

    然后测试已经正常工作了。

    【讨论】:

    • PER_NODE 是每个节点的条目数,预计不会出错。您可以发布有关获取操作的详细错误消息吗?此外,错误是在多节点集群中发生还是仅在您有一个成员时发生?
    • 当我注释 setProperty 行时,跟踪中会出现以下 Hazelcast 错误行:ADVERTENCIA: [180.113.65.119]:5701 [dev] [3.9.1]地图“MyTest”不允许地图中的任何数据。鉴于当前集群大小为 1 个成员和 271 个分区,最大大小应至少为 271。 而且测试也失败了。
    • 我找到了这个网站,也发生了同样的事情:github.com/hazelcast/hazelcast/issues/11646
    【解决方案2】:

    此处提到的 Github 问题已在 3.10 中解决,但它们似乎与您正在做的事情无关。对于 1 个成员集群,将 max_size 设置为低于分区计数预计不会起作用 - 不允许 put 操作,原因 - 1 个成员将托管所有 271 个分区。当您启动另一个节点并分配分区时,您可以设置较低的 ma​​x_size

    自 3.10 起,如果 ma​​x_size 设置为低于分区计数,则现在允许在单个成员的集群中每个分区最多进行一次 put 操作。

    所以要解决这个问题 - 要么更改 max_size 配置,要么减少分区数,要么再添加一个成员并使其成为一个集群。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      相关资源
      最近更新 更多