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

时间:2019-12-27 09:54:12

标签: migration record aerospike

当前设置:
我在Aerospike群集上运行了一个名称空间。命名空间中几乎没有集合。

我的用例:
我想将所有记录从一个集合(具有约100条记录)复制到同一名称空间下的另一个新集合(保持架构相同)


我的发现:
我进行了深入研究,并使用aql找到了一些解决方案:

  1. 列出第一组中的所有记录,并将它们一个接一个地插入新组。
    优点:易于实施。
    缺点:花费时间,并且容易出现人为错误。
  2. 使用asbackup/asrestore命令。
    优点:可以避免手动错误。
    缺点:不允许在恢复过程中更改集的名称,这是我负担不起的。 Aerospike's FAQ link确实提供了一些解决方法,但同样有风险。

需要帮助:
是否有任何有效的方法可以将工作量和验证工作从一个组迁移到另一组?我确实考虑过编写一些Java代码,该代码将扫描整个集合并将这些记录写入另一个集合中,但是同样属于我先前解释的第一类。

谢谢!

1 个答案:

答案 0 :(得分:1)

Aerospike中的记录是使用密钥的哈希值和您的设置名称存储的。集名称与该记录一起“存储”在Aerospike中,纯粹是作为该记录的元数据。因此,您可以扫描整个命名空间,并返回属于该集合的记录,然后在扫描回调中,将每个记录写回新记录(由于不同的集合名称)。对于从扫描返回的每个记录,您将必须知道“您的密钥”。默认情况下,Aerospike仅将20字节哈希摘要存储为记录的键。因此,除非您使用发送密钥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));
                }
});
相关问题