Java RIAK磁盘空间使用率高

Java RIAK磁盘空间使用率高,java,riak,Java,Riak,我正在本地桌面上使用java客户端和一些定制版本的 我担心的是,我发现每千伏大约需要920字节 那太陡了。对于100k kvs,数据目录为93 mb,之后每100k存储操作,数据目录就会线性增加。 这是意料之中的事 RiakCluster cluster = setUpCluster(); RiakClient client = new RiakClient(cluster); System.out.println("Client object s

我正在本地桌面上使用java客户端和一些定制版本的

我担心的是,我发现每千伏大约需要920字节

那太陡了。对于100k kvs,数据目录为93 mb,之后每100k存储操作,数据目录就会线性增加。 这是意料之中的事

        RiakCluster cluster = setUpCluster();
        RiakClient client = new RiakClient(cluster);
        System.out.println("Client object successfully created");
        Namespace quotesBucket = new Namespace("quotes2");
        long start = System.currentTimeMillis();
        for(int i=0; i< 100000; i++){
            RiakObject quoteObject = new RiakObject().setContentType("text/plain").setValue(BinaryValue.create("You're dangerous, Maverick"));
            Location quoteObjectLocation = new Location(quotesBucket, ("Ice"+i));
            StoreValue storeOp = new StoreValue.Builder(quoteObject).withLocation(quoteObjectLocation).build();
            StoreValue.Response storeOpResp = client.execute(storeOp);
        }
RiakCluster集群=setUpCluster();
RiakClient=新的RiakClient(群集);
System.out.println(“已成功创建客户端对象”);
名称空间quotesBucket=新名称空间(“quotes2”);
长启动=System.currentTimeMillis();
对于(int i=0;i<100000;i++){
RiakObject quoteObject=new RiakObject().setContentType(“text/plain”).setValue(BinaryValue.create(“你很危险,特立独行”);
位置quoteObjectLocation=新位置(quotesBucket,(“Ice”+i));
StoreValue storeOp=new StoreValue.Builder(quoteObject).withLocation(quoteObject Location).build();
StoreValue.Response storeOpResp=client.execute(storeOp);
}

不久前,riak用户邮件列表上有一个线程讨论了riak对象的开销,估计每个对象大约400字节。但是,这是在引入新对象格式之前,所以它已经过时了。这是一个全新的外观

首先我们需要一个本地客户

(node1@127.0.0.1)1> {ok,C}=riak:local_client().
{ok,{riak_client,['node1@127.0.0.1',undefined]}}
创建具有0字节值的新riak对象

(node1@127.0.0.1)2> Obj = riak_object:new(<<"size">>,<<"key">>,<<>>).
#r_object{bucket = <<"size">>,key = <<"key">>,
          contents = [#r_content{metadata = {dict,0,16,16,8,80,48,
                                                  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                                  {{[],[],[],[],[],[],[],[],[],[],[],[],...}}},
                                 value = <<>>}],
          vclock = [],
          updatemetadata = {dict,1,16,16,8,80,48,
                                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                 {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
          updatevalue = undefined}
仅对象的开销为36字节,但不包括上次更新时间或版本向量之类的元数据,因此将其存储在Riak中并再次检查

(node1@127.0.0.1)4> C:put(Obj).
ok
(node1@127.0.0.1)5> {ok,Obj1} = C:get(<<"size">>,<<"key">>).
{ok, #r_object{bucket = <<"size">>,key = <<"key">>,
          contents = [#r_content{metadata = {dict,3,16,16,8,80,48,
                                                  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                                  {{[],[],[],[],[],[],[],[],[],[],[[...]],[...],...}}},
                                 value = <<>>}],
          vclock = [{<<204,153,66,25,119,94,124,200,0,0,156,65>>,
                     {3,63654324108}}],
          updatemetadata = {dict,1,16,16,8,80,48,
                                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                 {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
          updatevalue = undefined}}
(node1@127.0.0.1)6> byte_size(riak_object:to_binary(v1,Obj)).
110
(node1@127.0.0.1)4> C:放置(Obj)。
好啊
(node1@127.0.0.1)5> {ok,Obj1}=C:get(,)。
{好的,#r_对象{bucket=,key=,
contents=[#r#u content{元数据={dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],[[...]],[...],...}}},
值=}],
vclock=[{,
{3,63654324108}}],
updatemetadata={dict,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
updatevalue=undefined}
(node1@127.0.0.1)6> 字节大小(riak对象:到二进制(v1,Obj))。
110
现在,版本向量中只有一个条目的空对象的开销是110字节。如果对象的后续put由不同的vnode协调,它将添加另一个条目。我选择了bucket和key名称,这样本地节点就不是preflist的成员,所以第二个put很有可能被其他节点协调

(node1@127.0.0.1)7> C:put(Obj1).
ok
(node1@127.0.0.1)8> {ok,Obj2} = C:get(<<"size">>,<<"key">>).
{ok, #r_object{bucket = <<"size">>,key = <<"key">>,
          contents = [#r_content{metadata = {dict,3,16,16,8,80,48,
                                                  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                                  {{[],[],[],[],[],[],[],[],[],[],[[...]],[...],...}}},
                                 value = <<>>}],
          vclock = [{<<204,153,66,25,119,94,124,200,0,0,156,65>>,
                     {3,63654324108}},
                    {<<85,123,36,24,254,22,162,159,0,0,78,33>>,{1,63654324651}}],
          updatemetadata = {dict,1,16,16,8,80,48,
                                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                 {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
          updatevalue = undefined}}
(node1@127.0.0.1)9> byte_size(riak_object:to_binary(v1,Obj2)).
141
(node1@127.0.0.1)7> C:put(Obj1)。
好啊
(node1@127.0.0.1)8> {ok,Obj2}=C:get(,)。
{好的,#r_对象{bucket=,key=,
contents=[#r#u content{元数据={dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],[[...]],[...],...}}},
值=}],
vclock=[{,
{3,63654324108}},
{,{1,63654324651}}],
updatemetadata={dict,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
updatevalue=undefined}
(node1@127.0.0.1)9> 字节大小(riak_对象:到二进制(v1,Obj2))。
141
这是为版本向量中的附加条目添加的另外31个字节

这些数字不包括使用值存储实际的bucket和key名称,也不包括Bitcask将它们再次存储在提示文件中,因此磁盘上的实际空间将是
2x(bucketname大小+keyname大小)+值开销+文件结构开销+校验和/哈希大小

如果您使用的是bitcask,文档中有一个计算器可以帮助您估计磁盘和内存需求:


如果您使用eLevelDB,您可以选择snappy压缩,这可以减少磁盘上的大小。

您是在单个节点上进行测试,还是使用默认的n值3?如果是这样,您必须考虑到每个值被写入3次,因此每个值实际上是920/3字节。还考虑到除了值之外还有其他的元数据写入磁盘。是的,具有所有默认配置的单个节点。谢谢你指出3的n值。因此,原则上,当我使用3个节点时,每个节点都会有1/3的数据足迹。正确吗?如果您只有3个节点,则无法保证每个副本都位于唯一的Riak节点上。使用KV的建议是,集群中至少有5个节点,因为没有一种机制可以保证三个副本中的每一个都位于不同的节点上。对于三个节点,您可能会发现某些对象的三个副本中有两个位于同一节点上。
(node1@127.0.0.1)7> C:put(Obj1).
ok
(node1@127.0.0.1)8> {ok,Obj2} = C:get(<<"size">>,<<"key">>).
{ok, #r_object{bucket = <<"size">>,key = <<"key">>,
          contents = [#r_content{metadata = {dict,3,16,16,8,80,48,
                                                  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                                  {{[],[],[],[],[],[],[],[],[],[],[[...]],[...],...}}},
                                 value = <<>>}],
          vclock = [{<<204,153,66,25,119,94,124,200,0,0,156,65>>,
                     {3,63654324108}},
                    {<<85,123,36,24,254,22,162,159,0,0,78,33>>,{1,63654324651}}],
          updatemetadata = {dict,1,16,16,8,80,48,
                                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                                 {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
          updatevalue = undefined}}
(node1@127.0.0.1)9> byte_size(riak_object:to_binary(v1,Obj2)).
141