在erlang中创建Riak兄弟姐妹

在erlang中创建Riak兄弟姐妹,erlang,riak,siblings,Erlang,Riak,Siblings,假设两个进程同时对具有相同bucket的RIAK执行相同的write命令,并且相同的密钥可能正在使用allow_mult true寻址两个不同的RIAK节点,并且密钥在bucket中肯定是新的: {ok,writenObject}=riakc_pb_socket:putPid,Obj,[返回\u body] 当riakc_obj:value_countWrittenObject大于1时,两个进程是否都会返回WrittenObject,或者一个进程的值肯定为1,而另一个进程的值为2?取决于键中已存

假设两个进程同时对具有相同bucket的RIAK执行相同的write命令,并且相同的密钥可能正在使用allow_mult true寻址两个不同的RIAK节点,并且密钥在bucket中肯定是新的: {ok,writenObject}=riakc_pb_socket:putPid,Obj,[返回\u body]


当riakc_obj:value_countWrittenObject大于1时,两个进程是否都会返回WrittenObject,或者一个进程的值肯定为1,而另一个进程的值为2?

取决于键中已存储的内容以及每个put请求包含的vclock,值计数可能是1、2或3。假设没有分区事件,即非故障情况,则每个put将由密钥的preflist中的一个主Vnode进行协调,并且如果存储的对象中包含的vclock不支配已经存在的vclock,则将存储这两个值。即使这两个请求几乎同时发出,哪一个先被处理,如果两个请求都没有看到兄弟姐妹,那将是一场竞赛

编辑: 如果bucket上的allow_mult属性设置为false,Riak将根据元数据中的X-Riak-Last-Modified和X-Riak-Deleted条目选择一个要返回的值。这意味着您输入的值可能不是返回的值


只有当allow_mult为true时,您才会看到返回的多个值。

谢谢!因此,如果密钥是新的,并且两个put中都没有使用vClock,则首先处理的节点的请求将得到1,而另一个节点的请求将得到2,因为第一个节点请求已经处理,并且对象已经存储。因此,不可能发生两个副本被交叉写入的情况,即写入两次的同一对象将首先存储在两个不同的节点上,而对象的副本存储在另一个节点上,并且在复制副本时,每次写入都会在另一个节点上找到要写入的对象,对吗?这意味着put是一个原子操作,与副本的数量无关。这两个操作都不能保证“先处理”,因为每个操作都将由多个VNode处理。请求1完全有可能首先在一个vnode上处理,而请求2则首先在另一个vnode上处理,从而导致两个请求都看到了同级。不需要保证。这是一个简单的问题。由于这两个进程理论上是同时执行的,我指的是第一个由RIAK首先编写请求的进程。这两个请求是相同的。问题是两个过程中是否可能有两个兄弟姐妹。很抱歉,但还不清楚。你说过,这两个过程都可以让兄弟姐妹回来。如果是这种情况,则表示副本是交叉写入的。我们可以定义兄弟元数据在上一次编写时的样子吗?同样,只有两个进程存在并写入同一个对象。没有失败,只有复制品。这激起了我的兴趣,所以我看了一下源代码。put进程调用。因此,如果您只希望返回一个对象,并且希望它是具有最近修改时间的对象,只需将allow_mult设置为false。谢谢Joe。不幸的是,我想要最新的,这就是为什么我的问题被提出的原因。昨晚我也考虑了一下,得出了一个结论,我需要找到last_mod值最小的兄弟姐妹并写回。为此,我还需要存储进程的Pid,这样它将是唯一一个将对象更新回来的进程,而另一个进程将其保留。我准备好了,这两个过程都可以找回兄弟姐妹,尽管这意味着交叉书写对象,所以我仍然不清楚。