当前设置:我在Aerospike群集上运行了一个名称空间。命名空间中几乎没有集合。
我的用例:我想将所有记录从一个集合(具有〜100个记录)复制到同一名称空间下的另一个新集合(保持架构相同)。
我的发现:我做了一些深入研究,并使用aql
找到了一些解决方案:
asbackup/asrestore
命令。优点:可以避免手动错误。缺点:不允许在恢复过程中更改集的名称,这是我负担不起的。 Aerospike's FAQ link确实提供了一些解决方法,但同样有风险。 需要帮助:是否有任何有效的方法可以以较少的工作量和验证将数据从一组迁移到另一组?我确实考虑过编写一些Java代码,该代码将扫描整个集合并将这些记录写入另一个集合中,但是同样属于我先前解释的第一类。
谢谢!
Aerospike中的记录是使用密钥的哈希值和您的设置名称存储的。集名称与该记录一起“存储”在Aerospike中,纯粹是作为该记录的元数据。因此,您可以扫描整个命名空间,并返回属于该集合的记录,然后在扫描回调中,将每个记录作为新记录写回(由于不同的集合名称)。对于从扫描返回的每个记录,您将必须知道“您的密钥”。默认情况下,Aerospike仅将20字节哈希摘要存储为记录的键。因此,除非您使用send key为true或将其明确地存储在记录中或将其存储在bin中,否则我看不到如何识别“您的密钥”。将“您的密钥”存储在垃圾箱中是最简单的。您可能必须首先更新所有100条记录,并添加一个包含“您的密钥”的垃圾箱。然后,在扫描回调中(记录没有特定顺序),您将能够使用“您的密钥”和“新集合名称”组成一个新密钥。您将必须为此编写自己的Java代码。 (如果您在原始记录中有“您的密钥”,这很容易做到。)
我尚未对此进行测试。但是,如果原始记录在“ mykey”容器中拥有您的密钥,则类似的方法将起作用。
client.scanAll(null, "test", "set1", new ScanCallback(){
public void scanCallback (Key key, Record record) throws AerospikeException {
String mykey = (String)(record.getValue("mykey"));
String bin1data = record.getString("bin1");
//Alternate way to get string
Key reckey = new Key("test", "set2", mykey);
client.put(null, reckey, new Bin("bin1", bin1data));
}
});