在 leveldb 上使用 Riak 是否有一种有效的方法来处理数据过期/大量删除(释放 space)?
Is there an efficient way to process data expiration / massive deletion (to free space) with Riak on leveldb?
在 Riak 上:
- 有没有办法处理数据到期或将旧数据转储到释放一些space?
- 效率高吗?
编辑:感谢乔提供答案及其解决方法(向下回答)。
应该从一开始就考虑数据过期,因为它需要使用 map-reduce 算法的附加索引。
简短回答:不,没有发布商提供的到期时间。
更长的答案:在您希望过期的每个值的二级索引条目中包括写入时间,以整数表示形式(如 Unix 纪元)。 运行 一个在非高峰时段的定期作业,用于执行范围 2I 查询以获取从 0 到(现在 - TTL)的任何条目。这可以用作 map/reduce 作业的输入来执行实际删除。
至于恢复磁盘space,leveldb 在这方面非常慢。当一个值写入 leveldb 时,它从第 0 级开始,然后随着每个级别的填充,压缩将值移动到下一个级别,因此您最近最少写入的数据驻留在磁盘上的最低级别。当你删除一个值时,一个逻辑删除被写入 0 级,它掩盖了较低级别的先前值,并且当正常压缩发生时,逻辑删除将像任何其他值一样向下移动。在逻辑删除达到相同级别之前,旧值消耗的磁盘 space 不会被回收。
我写了一个小的 c++ 工具,它使用 leveldb 内部函数 CompactRange 来执行这个任务。 Here you can read the article about this.
有了这个,我们就可以删除整个存储桶(逐个键)并擦除所有墓碑。释放了 75Gb 中的 50Gb!
不幸的是,这仅在将 leveldb 用作后端时才有效。
在 Riak 上:
- 有没有办法处理数据到期或将旧数据转储到释放一些space?
- 效率高吗?
编辑:感谢乔提供答案及其解决方法(向下回答)。 应该从一开始就考虑数据过期,因为它需要使用 map-reduce 算法的附加索引。
简短回答:不,没有发布商提供的到期时间。
更长的答案:在您希望过期的每个值的二级索引条目中包括写入时间,以整数表示形式(如 Unix 纪元)。 运行 一个在非高峰时段的定期作业,用于执行范围 2I 查询以获取从 0 到(现在 - TTL)的任何条目。这可以用作 map/reduce 作业的输入来执行实际删除。
至于恢复磁盘space,leveldb 在这方面非常慢。当一个值写入 leveldb 时,它从第 0 级开始,然后随着每个级别的填充,压缩将值移动到下一个级别,因此您最近最少写入的数据驻留在磁盘上的最低级别。当你删除一个值时,一个逻辑删除被写入 0 级,它掩盖了较低级别的先前值,并且当正常压缩发生时,逻辑删除将像任何其他值一样向下移动。在逻辑删除达到相同级别之前,旧值消耗的磁盘 space 不会被回收。
我写了一个小的 c++ 工具,它使用 leveldb 内部函数 CompactRange 来执行这个任务。 Here you can read the article about this.
有了这个,我们就可以删除整个存储桶(逐个键)并擦除所有墓碑。释放了 75Gb 中的 50Gb!
不幸的是,这仅在将 leveldb 用作后端时才有效。