跨集群复制密钥时,Riak 二级索引未使用 Java 客户端保留

Riak secondary indexes not preserved using Java client when copying keys cross-cluster

所以我正在将一堆数据从 Riak 集群 A(1.4 集群)复制到 Riak 集群 B(2.0 集群),因为一堆恼人的(并且与我的问题无关)环境限制导致无法升级任何其他方式的群集。

我正在使用 Java 1.4 Riak 客户端与两个集群通信。我从我的 1.4 集群中读入密钥,并且 - 保持完全相同的 IRiakObject - 将它写出到 2.0 集群。

如果我在调试器中 运行 this 并检查所述 IRiakObject,我发现二级索引实际上填充在该对象上。

但是当我实际上 运行 这个时,我看到 2.0 集群不接受二级索引 - 当我在 2.0 集群上为此键执行 GET 时,它们返回空的。

我做错了什么?

示例代码如下。请注意,这是从 Scala 汇编而来的,但它使用的是 Java 库。注意 sourceRiakClient 和 destRiakClient 不对应同一个服务器。 (getBucket 和 cloneBucket 是我写的方法。)

val srcBucket : Bucket = getBucket(sourceRiakClient, bucketName)
val destBucket: Bucket = cloneBucket(destRiakClient, bucketName, srcBucket)
val value: IRiakObject = bucket.fetch(key).execute()
destBucket.store(key, value.getValue).withoutFetch().execute()

其他集群是否配置为使用 Leveldb 后端?默认情况下 2.0 使用 Bitcask。 Bitcask 不支持二级索引。

事实证明,通过调用 value.getValue,我将 IRiakObject 转换为 byte[] 并剥离了二级索引信息。当我简单地存储值本身时,我得到了我期望的行为。