【问题标题】:Apache-ignite: Persistent StorageApache-ignite:持久存储
【发布时间】:2018-07-04 05:35:46
【问题描述】:

我对 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不是很清楚。有人也可以解释一下吗?

提前致谢。

【问题讨论】:

    标签: ignite


    【解决方案1】:

    节点启动时有什么异常吗?

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

    您可以设置 IGNITE_HOME 环境变量或添加代码行以显式设置 workDirectory:cfg.setWorkDirectory("C:\\workDirectory");

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

    【讨论】:

    • 不。只是性能建议。不,我没有它,因为我使用ignite 作为vertx 的一部分。我刚刚下载了 src.zip,解压缩并运行它。然后,将IGNITE_HOME 指向该目录。这是否意味着我可以省略 TcpDiscoverySpi 部分?我还添加了setWorkDirectory。运行程序后什么都没有显示。
    • 您能分享一下您 \db 的“ls -lf”吗?请尝试添加 cfg.setConsistentId("someConsistentId");设置一致的全局唯一节点 ID,该 ID 在节点重新启动后仍然存在。
    • 是的,如果默认设置适合您,您可以省略 TcpDiscoverySpi 部分。
    • 感谢您对我的耐心等待。我们可能不在同一页面上。 &lt;workDirectory&gt; 是从setWorkDirectory 设置的吗?如果是这样,它是空的。 db 文件夹未创建。而且我没有使用TcpDiscoverySpi。
    • 是的,&lt;workDirectory&gt; 是从 setWorkDirectory 设置的。空的db 文件夹表示您的应用没有启用持久性。但是,代码 sn-p 看起来不错,并且在我的最后工作正常。你能分享一个可重现的项目(pom)吗?
    猜你喜欢
    • 2023-03-19
    • 2019-02-02
    • 2021-05-23
    • 1970-01-01
    • 2019-03-20
    • 2017-03-20
    • 1970-01-01
    • 2015-04-06
    • 2018-05-19
    相关资源
    最近更新 更多