为什么使用Aerospike的QueryNode方法';s Java客户端只返回主对象

为什么使用Aerospike的QueryNode方法';s Java客户端只返回主对象,aerospike,Aerospike,我有一个3号的Aerospike集群,我的复制因子是3。假设我有10000个对象,那么每个节点将容纳大约3333个主对象和6666个复制对象。我想我有默认设置 我意识到Java客户机的QueryNode方法只返回节点上的主对象,因此我总是会得到大约1/3的对象,即使节点上有复制对象。此外,Query方法使用QueryNode从每个节点获取结果 在我的例子中,我发现这并不理想:有一次,所有3个节点都在运行,但从1个节点到客户端程序的网络连接中断。因此,Query方法只能从2个节点获取主对象,但在服

我有一个3号的Aerospike集群,我的复制因子是3。假设我有10000个对象,那么每个节点将容纳大约3333个主对象和6666个复制对象。我想我有默认设置

我意识到Java客户机的QueryNode方法只返回节点上的主对象,因此我总是会得到大约1/3的对象,即使节点上有复制对象。此外,Query方法使用QueryNode从每个节点获取结果

在我的例子中,我发现这并不理想:有一次,所有3个节点都在运行,但从1个节点到客户端程序的网络连接中断。因此,Query方法只能从2个节点获取主对象,但在服务器端,所有3个节点都在运行,因此主对象分布均匀,因此,使用Query方法只能获取大约2/3的对象

我可以写一些初始检查来验证我的网络连接是否都正常,但是,既然每个节点上都有所有对象(主对象或复制对象),为什么只获取主对象呢?

您应该阅读Java客户端的文档,以及它的主对象

扫描和查询之间有区别,除非您使用的是不带谓词的查询(它转换为扫描)。如果要使用谓词,则需要在要查询的bin上添加一个谓词

查询和扫描都只返回主对象。副本对象的目的是确保节点停机时数据不会丢失。您不应该期望从这两个服务器中获取副本对象


实际上可以读取副本对象的情况是将读取策略更改为时。读取可能会转到主记录或其中一个副本,而不是只读取主记录(默认值为master)。

为什么需要查询来返回主记录和prole记录的数量?@BenBates实际上我们需要获取一组中的所有记录。我们最初使用了扫描,但是扫描速度太慢了,我们无法真正使用它们。我确实是基于一个具有二级索引的bin查询我的集合。因此,如果我需要获得满足查询条件的所有记录,我必须查询所有活动节点?您可以使用query而不是QueryNode-客户端将其并行发送到集群中的所有节点。类似地,除非出于某种原因(比如编写备份工具)需要扫描单个节点,否则我不会使用ScanNode。我确实在使用Query,但正如我所说的,因为我只得到了预期结果的2/3,并且从1个节点到客户端的网络连接中断,所以我假设Query在内部使用QueryNode,这就是我得到预期结果的2/3的原因,我的假设正确吗?当一个节点下降时,Aerospike节点将自动重新聚集(一旦他们都注意到下降节点的心跳失败)。当这种情况发生时,数据将重新平衡。在数据迁移期间(重新平衡的一部分),您将获得不可靠的数据进行扫描和查询,这就是为什么这两种策略都允许您在集群更改时失败的原因。你可以选择这一政策,然后等待再平衡。或者你可以接受数字可能是错的。