Hazelcast驱逐问题导致第一个条目进入并且配置较小

时间:2018-10-03 15:02:52

标签: hazelcast hazelcast-imap

此简单的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大小时总是出错?

2 个答案:

答案 0 :(得分:0)

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

发生的事情是,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();

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

答案 1 :(得分:0)

此处提到的Github问题已在3.10中得到解决,但它们似乎与您的工作无关。对于1个成员群集,将max_size设置为低于分区数是不可行的-不允许进行put操作,原因-1个成员将托管所有271个分区。旋转另一个节点并分配分区时,可以设置较低的 max_size

从3.10版本开始,如果将 max_size 设置为低于分区数,则在具有单个成员的群集中,每个分区最多可以进行一次放置操作。

因此,要解决此问题,请更改max_size配置或减少分区数,或者再添加一个成员并使其成为群集。