你怎么在riak找到一个水桶的大小? (以MB为单位并忽略备份)

时间:2012-03-23 22:21:43

标签: node.js riak

我正在使用riak作为数据存储解决方案构建node.js应用程序。 该应用程序将允许用户进行一些数据存储。我想用一些方法来跟踪单个用户正在使用多少空间(1个用户 - > x存储桶)。我也想忽略分发的副本(只计数1份)。

我无法找到任何可以计算使用的大致空间的东西。使用node.js脚本很好,虽然我更喜欢在数据库中这样做(以分布式方式)

有没有人知道最好的方法呢?

3 个答案:

答案 0 :(得分:3)

正如之前的帖子中所建议的,有两种方法可以做到这一点:

  1. 执行post post hooks是最好的选择,如果你在map / reduce作业中实现它,你可以对对象的内容使用byte_size(见下文)

  2. 实施地图/缩小工作,查看https://github.com/whitenode/riak_mapreduce_utils及其map_datasize功能

  3. erlang commit hook

    update_bucket_size_hook(Object) ->
    my_hooks_utils:update_bucket_size(riakc_obj:key(Object), 
      erlang:byte_size(riak_object:get_value(Object))).
    

答案 1 :(得分:0)

我是Riak noob,但基于我所知道的我的第一直觉是查看Post-Commit钩子,在那里你可以访问对象和属性 - 包括大小,我相信。然后,您可以在跟踪使用情况的单独存储桶中调整值。但是,不确定提前挂钩或提交后挂钩是否仅限于触发挂钩的对象上的操作。也许在post-commit钩子中可以使用文件大小向相关对象添加二级索引,以后可以通过MapReduce访问。

我道歉,如果我正在大声思考......这似乎是一个有趣的问题,所以我很想知道你是如何解决它的。我一直想要自己玩钩子,但没有机会。

Commit Hooks

答案 2 :(得分:0)

可以通过mapreduce查询检索存储桶(或任意记录集)中当前数据的总大小。这将提供尺寸,而不管记录的存储位置和保留的份数。由于我无法找到任何实际返回数据大小的mapreduce函数,因此我创建了一个。这称为 map_datasize ,可以找到in my GitHub repository

对整个存储桶的内容运行此mapreduce查询可能会非常慢并且会对系统施加一些负载(不建议在整个存储桶上运行mapreduce作业),但如果只需要大小,则可以使用偶尔确定。

如果你总是需要一个最新的数字,我认为一个post-commit钩子,正如另一篇文章所建议的那样,可能是一个更好的选择,虽然保持准确可能有点棘手,因为我不确定是否可以访问更新时要替换的记录的大小,以便计算大小的变化。

相关问题