2012-03-23 49 views
3

我正在构建一个使用riak作为数据存储解决方案的node.js应用程序。 该应用程序将允许来自用户的一些数据存储。我想要一些方法来跟踪单个用户使用多少空间(1个用户 - > x桶)。我也想忽略分发的副本(只计数1副本)。你怎么找到riak中桶的大小? (以MB为单位并忽略备份)

我还没有找到任何东西来计算使用的大概空间。使用node.js脚本是好的,但我更喜欢在数据库中做的方式(以分布式方式)

有没有人有这样做的最佳方法的想法?

回答

0

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

我很抱歉,如果我想大声想......这似乎是一个有趣的问题,所以我很想看看你是如何解决它。我一直有意玩钩,但没有机会。

Commit Hooks

+0

好了,生病看看挂钩。我正在考虑map-reduce,并没有注意到任何大小的访问。 – Luigimax 2012-04-30 17:08:51

0

在桶中的数据的当前总大小(或者用于记录的任意集合)可以通过映射缩减查询检索。这将提供大小,而不考虑记录的存储位置和保存的副本数量。由于我无法找到任何实际返回数据大小的mapreduce函数,因此我创建了一个。这叫做map_datasize并且可以找到in my GitHub repository

对整个存储桶的内容运行这个mapreduce查询可能会很慢并且会给系统带来一些负担(建议不要在整个存储桶上运行mapreduce作业),但是如果大小只需要偶尔确定。

如果你总是需要一个最新的数据,我认为如另一篇文章中所建议的post-commit hook可能是一个更好的选择,尽管保持它的准确性可能有点棘手,因为我不是确定您是否有权访问正在更新的记录大小,以计算大小的变化。

3

正如在以前的文章建议有这样做的2种方式:

  1. 做一个后提交挂钩是最好的选择,如果你在一个地图实现它/减少工作,你可以在使用byte_size对象的内容(见下文)

  2. 实现一个地图/减少工作,检查https://github.com/whitenode/riak_mapreduce_utils及其map_datasize功能

二郎承诺挂钩

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