Apache Ignite sql 查询 returns 仅缓存内容,而不是来自数据库的完整结果

Apache Ignite sql query returns only cache contents, not complete results from database

我的 Ignite 节点(2 个服务器节点 - 我们称它们为 A 和 B)配置如下:

ccfg.setCacheMode(CacheMode.PARTITIONED);
ccfg.setAtomicityMode(CacheMode.TRANSACTIONAL);
ccfg.setReadThrough(true);
ccfg.setWriteThrough(true);
ccfg.setWriteBehindEnabled(true);
ccfg.setWriteBehindBatchSize(10000);

先启动节点A,命令行如下:

apache-ignite-fabric-2.2.0-bin>bin/ignite.bat config/default-config.xml

节点 B 由 运行

从 java 代码启动
public static void main(String[] args) throws Exception {
    Ignite ignite = Ignition.start(ServerConfigurationFactory.createConfiguration());
    ignite.cache("MyCache").loadCache(null);
...
}

(包含 ServerConfigurationFactory 的 jar 放在 apache-ignite-fabric-2.2.0-bin\libs 目录中,因此节点 A 和 B 在同一集群上..否则会出错)

我有一个查询应该从数据库中得到 return 9061 个结果。在节点 B 中的缓存加载过程之后,我转到 Web 控制台并 运行 一个针对缓存的简单计数 SQL 语句。有一个按钮 "Execute on selected node" 允许您选择要查询的特定缓存。我查询了节点 A 并得到了 2341 的计数,在节点 B 上我得到了 2064 的计数。如果我只使用 "Execute" 按钮,我得到 4405,这只是节点 A 和 B 的总和。显然它们丢失了4656 条记录(数据库中的总记录数为 9061 - 节点 A 和 B 中的记录数为 4405)。我还在 Java 代码中使用 SqlFieldsQuery 运行 相同的计数查询,我也得到 4405.

由于 readThrough 设置为 true,我预计 Ignite 也会 return 不在内存中的结果。但事实并非如此,因为它只是 returns 缓存中的任何内容。我在这里做错了什么吗?谢谢。

Read though 仅适用于键值 API,因此 SQL 引擎假定所有必需的数据都在 运行 查询之前从数据库中预加载。

如果你的数据集不适合内存并且你不能预加载所有数据,你可以使用本机 Ignite 持久性存储:https://apacheignite.readme.io/docs/distributed-persistent-store