我对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
不是很清楚。有人可以解释一下吗?
提前致谢。
答案 0 :(得分:0)
节点启动时是否有例外?
很可能,您没有配置IGNITE_HOME env变量。每次运行节点时,都会以不同的方式选择持久性工作目录。
您可以设置IGNITE_HOME env变量或添加代码行来明确设置workDirectory:cfg.setWorkDirectory("C:\\workDirectory");
TcpDiscoverySpi
提供了一种发现网格中远程节点的方法,因此起始节点可以加入群集。如果您知道IP列表,最好使用TcpDiscoveryVmIpFinder
。 TcpDiscoveryMulticastIpFinder
向网络广播UDP消息以发现其他节点。它根本不需要IP列表。
有关详细信息,请参阅https://apacheignite.readme.io/docs/cluster-config。