Riak 正在 bitcask 桶类型中创建过期密钥的兄弟姐妹

Riak is creating siblings of expired keys in bitcask bucket types

我有一个使用 multi 后端存储的 Riak 服务器,配置如下:

...
storage_backend = multi
multi_backend.bitcask_mult.storage_backend = bitcask
multi_backend.bitcask_mult.bitcask.expiry = 10s
...

我已检查以下步骤顺序是否正确。

  1. 使用键key-1输入一个新值。
  2. 获取键 key-1 的值 returns 预期值。
  3. 等待 15 秒。
  4. 尝试用key-1获取值。这 returns 没什么,因为密钥已过期。

到目前为止一切顺利。

但是,如果现在我再次使用相同的键值...

  1. 使用键输入一个新值 key-1
  2. key-1returns两个兄弟姐妹一起取值!

我在第 4 步和第 5 步之间等了几个小时(以防过期必须被刷新或类似的事情),但没有成功。

我可以解决处理兄弟姐妹的这种情况,无论如何我都会为我使用的其他一些存储桶做这件事,但我没想到必须处理 "expired siblings"!

我读过一些关于 automatic expiration and Riak Search 的内容,但我认为情况并非如此。

我是不是做错了什么?我错过了什么吗?

谢谢。

无效,过期有效,但您 运行 遇到了问题,我会打电话给 "Expiration <> Delete"。当一个对象在 Bitcask 中过期时,Bitcask 和后端 returns not_found 会创建一个墓碑,以响应对该对象的任何请求 该对象不会被删除。当 Bitcask 数据文件中最旧的对象过期并且整个文件都过期时,对象会得到 "deleted"。此时会创建一个新文件。

在 Bitcask 中创建新文件之前,对象实际上仍然存在,即使 Bitcask 正在返回 not_found。当您写入 "deleted" 键时,Bitcask 的最后修改时间正在更新,本质上是复活它。

要检验这个理论,您实际上可以停止 Riak 并重新启动它。重新启动 Riak 将导致 Bitcask 创建一个新的数据文件,并阻止你获得兄弟姐妹。

长话短说,在这种情况下,您仍然需要处理兄弟姐妹。