Apache-ignite:持久存储

时间:2018-01-25 02:59:20

标签: ignite

我对Ignite Persistent Storage的理解是,数据不仅保存在内存中,还写入磁盘。

重新启动节点时,它应该从磁盘读取数据到内存。

所以,我正在使用这个example来测试它。但是我稍微更新了一下因为我不想使用xml。

这是我略微更新的代码。

public class PersistentIgniteExpr {
    /**
     * Organizations cache name.
     */
    private static final String ORG_CACHE = "CacheQueryExample_Organizations";

    /** */
    private static final boolean UPDATE = true;

    public void test(String nodeId) {
        // Apache Ignite node configuration.
        IgniteConfiguration cfg = new IgniteConfiguration();
        // Ignite persistence configuration.
        DataStorageConfiguration storageCfg = new DataStorageConfiguration();

        // Enabling the persistence.
        storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

        // Applying settings.
        cfg.setDataStorageConfiguration(storageCfg);

        List<String> addresses = new ArrayList<>();
        addresses.add("127.0.0.1:47500..47502");
        TcpDiscoverySpi tcpDiscoverySpi = new TcpDiscoverySpi();
        tcpDiscoverySpi.setIpFinder(new TcpDiscoveryMulticastIpFinder().setAddresses(addresses));
        cfg.setDiscoverySpi(tcpDiscoverySpi);
        try (Ignite ignite = Ignition.getOrStart(cfg.setIgniteInstanceName(nodeId))) {
            // Activate the cluster. Required to do if the persistent store is enabled because you might need
            // to wait while all the nodes, that store a subset of data on disk, join the cluster.
            ignite.active(true);

            CacheConfiguration<Long, Organization> cacheCfg = new CacheConfiguration<>(ORG_CACHE);

            cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
            cacheCfg.setBackups(1);
            cacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
            cacheCfg.setIndexedTypes(Long.class, Organization.class);

            IgniteCache<Long, Organization> cache = ignite.getOrCreateCache(cacheCfg);

            if (UPDATE) {
                System.out.println("Populating the cache...");

                try (IgniteDataStreamer<Long, Organization> streamer = ignite.dataStreamer(ORG_CACHE)) {
                    streamer.allowOverwrite(true);

                    for (long i = 0; i < 100_000; i++) {
                        streamer.addData(i, new Organization(i, "organization-" + i));

                        if (i > 0 && i % 10_000 == 0)
                            System.out.println("Done: " + i);
                    }
                }
            }

            // Run SQL without explicitly calling to loadCache().
            QueryCursor<List<?>> cur = cache.query(
                    new SqlFieldsQuery("select id, name from Organization where name like ?")
                            .setArgs("organization-54321"));

            System.out.println("SQL Result: " + cur.getAll());

            // Run get() without explicitly calling to loadCache().
            Organization org = cache.get(54321l);

            System.out.println("GET Result: " + org);
        }
    }
}

当我第一次运行时,它按预期工作。

运行一次后,我假设数据写入磁盘,因为代码是关于持久存储的。

当我第二次跑步时,我评论了这一部分。

if (UPDATE) {
    System.out.println("Populating the cache...");

    try (IgniteDataStreamer<Long, Organization> streamer = ignite.dataStreamer(ORG_CACHE)) {
        streamer.allowOverwrite(true);

        for (long i = 0; i < 100_000; i++) {
            streamer.addData(i, new Organization(i, "organization-" + i));

            if (i > 0 && i % 10_000 == 0)
                System.out.println("Done: " + i);
        }
    }
}

这是写入数据的部分。执行sql query后,它将返回null。那意味着数据不会写入磁盘?

另一个问题是我对TcpDiscoverySpi不是很清楚。有人可以解释一下吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

节点启动时是否有例外?

很可能,您没有配置IGNITE_HOME env变量。每次运行节点时,都会以不同的方式选择持久性工作目录。

您可以设置IGNITE_HOME env变量或添加代码行来明确设置workDirectory:cfg.setWorkDirectory("C:\\workDirectory");

TcpDiscoverySpi提供了一种发现网格中远程节点的方法,因此起始节点可以加入群集。如果您知道IP列表,最好使用TcpDiscoveryVmIpFinderTcpDiscoveryMulticastIpFinder向网络广播UDP消息以发现其他节点。它根本不需要IP列表。 有关详细信息,请参阅https://apacheignite.readme.io/docs/cluster-config