将记录迁移到 Aerospike 上的另一组

Migrating records to another set on Aerospike

当前设置:
我在 Aerospike 集群上有一个命名空间 运行。命名空间中有几组。

我的用例:
我想将一组 (有 ~100 条记录) 中的所有记录复制到同一命名空间下的另一组新记录 (保持架构相同) .


我的发现:
我做了一些深入的研究,并使用 aql:

找到了一些解决方案
  1. 列出第一个集合中的所有记录,并将它们逐条插入到新集合中。
    优点:易于实施。
    缺点: 耗时,并且容易出现手动错误。
  2. 使用 asbackup/asrestore 命令。
    优点:它不受手动错误的影响。
    缺点:它不允许在恢复过程中更改集合的名称,我负担不起。 Aerospike's FAQ link 确实提供了一些解决方法,但同样存在风险。

需要帮助:
有没有什么有效的方法可以将数据从一个集合迁移到另一个集合,而且工作量和验证更少?我确实考虑过编写一些 java 代码来扫描整个集合并将这些记录写入另一个集合,但这同样属于我之前解释的第一类。

谢谢!

Aerospike 中的记录是使用您的密钥和您的设置名称的哈希值存储的。集合名称是 "stored",Aerospike 中的该记录纯粹作为该记录上的元数据。因此,您可以扫描整个命名空间和属于该集合的 return 记录,并在扫描回调中,将它们中的每一个作为新记录写回(由于不同的集合名称)。对于从扫描返回的每条记录,您必须知道 "your key"。默认情况下,Aerospike 仅存储 20 字节的哈希摘要作为记录的键。因此,除非您使用发送密钥 true 将其显式存储在记录中或存储在 bin 中,否则我看不出您将如何识别 "your key"。将 "your key" 存储在垃圾箱中是最简单的。您可能必须先更新所有 100 条记录并添加一个包含 "your key" 的容器。然后在扫描回调中,记录没有特定的顺序,你将能够用 "your key" 和 "new set name" 组成一个新的 Key。您必须为其编写自己的 java 代码。 (如果原始记录中有 "your key" - 这很容易做到。)

我还没有测试过这个..但是假设原始记录有你的密钥在 "mykey" bin 中,沿着这些线路的东西会起作用。

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));
                }
});