2012-03-23 48 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))). 
相關問題