【问题标题】:What are the use cases for a Vector Clock versus a Version Vector?向量时钟与版本向量的用例是什么?
【发布时间】:2020-02-20 23:24:22
【问题描述】:

我一直无法找到适合Vector ClocksVersion Vectors 的用例示例,以及它们可能有何不同。我知道它们在很大程度上以相同的方式工作,向量时钟使用receivesend 函数,而版本向量使用sync 函数,但我不明白这两个选项之间的区别。只是表达同一事物的两种不同方式,还是它们之间的用例存在真正的差异?

我只能找到一个有点相关的问题:"When do I use a consensus algorithm like Paxos vs using a something like a Vector Clock?"

尽管链接的答案陈述了以下内容,并引用了一篇简短的文章,但我仍然不清楚其中的差异。

您可能希望将版本向量用于无领导分布式 贮存。您可能会使用相同的矢量时钟(尽管它是 更差;该文章还建议您使用它来保持一致 快照,用于在一般分布式中实现因果排序 系统等)。

【问题讨论】:

标签: data-structures synchronization replication distributed-computing distributed-system


【解决方案1】:

这两者因为相同的合并机制而令人困惑,但用例不同。

  • 向量时钟用于确定分布式系统中事件的部分顺序。它将检测因果关系违反和并发事件。

  • 版本向量用于比较多个(DB)副本中项目的状态。

Vector Clock中,我们知道事件E_aE_b没有排序,我们可以通过那里的版本找出事件顺序。

                     ***
 ┌──┐               * ┌──┐  ┌──┐
 │A0│              *  │A1│  │A2│
 │  │             *   │B2│  │B2│ <- E_a
 │  │             *   │C1│  │C1│
 └──┘             *   └──┘  └──┘
---------------INDEPENDENT---------------
          ***
 ┌──┐     *┌──┐  ┌──┐       ┌──┐
 │  │    * │  │  │  │       │  │
 │B0│   *  │B1│  │B2│       │B3│ <- E_b
 │  │   *  │C1│  │C1│       │C1│
 └──┘   *  └──┘  └──┘       └──┘
--------*------INDEPENDENT---------------
 ┌──┐  ┌──┐
 │  │  │  │
 │  │  │  │
 │C0│  │C1│
 └──┘  └──┘

Version Vector中,当我们从多个DB读取数据时,会发现有不同的version数据并合并冲突。这可以帮助状态最终保持一致

                                                 Final state
User A  │ +Egg v1              +Milk +Ham v3    │Egg+Ham+Milk, v3
        │  │   ^                  │   ^         │
        │  V   │                  V   │ Ham v3  │
Cart DB │  ok,v1    ok,v2         ok,v3         │
        │           ^   │ Egg v2                │
        │           │   V                       │
User B  │        +Ham  +Egg v2                  │Egg+Ham, v2
-------------- Time ----------->

在这种情况下,只有一个 DB,但您可以想象有很多 DB。当你读取数据时,你会得到版本的向量。

注意:当考虑复制处于 leaderless 模式(Dynamo 风格)时,会更容易理解用例。每个写入/读取请求都由应用程序而不是 leader DB 发送到每个 DB。

推荐人

【讨论】:

    【解决方案2】:

    这里有同样的问题,我仍然不是很清楚,但我发现版本向量更适合确定特定复制节点网络中事件的因果关系一个分布式系统,你唯一感兴趣的就是先发生了什么,然后发生了什么。

    相比之下,矢量时钟确定分布式系统中未确定的事件序列中的事件顺序。

    从这个意义上说,使用整数作为版本向量过于复杂,因为如果我们只想确定哪个节点 A 或 B 更新更多,假设最初 A[2,2] 和 B[2, 2](因此同步)。

    从版本向量的角度来看,A[3,2] > B[2,2] 意味着same 为 A[10,2] > B[2,2]。这可以解释为什么我们可以为版本向量使用一组固定的值,而唯一重要的操作就是同步版本

    从矢量时钟的角度来看,A[10,2] 和 A[3,2] 之间存在 区别。这意味着在此期间发生了 +7 事件。这可以解释为什么我们需要跟踪所有事件,并且有 sendreceive 操作来同步网络中的所有矢量时钟。

    无论如何,我像你一样缺少一些清晰的文档,清楚地解释了一个与另一个相比的区别和用法。

    【讨论】:

    • I'm missing like you some clear document that explains clearly the difference and the usages of one compared to the other. 您是否找到了此文档或有关版本向量的动手/实用教程?谢谢!
    猜你喜欢
    • 2016-11-09
    • 2014-02-16
    • 2012-07-20
    • 2019-07-24
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多