0

我只是想多了解一点vnodes,我很好奇。我喜欢在单个物理节点上拥有多个 vnode 的想法,但我希望能够控制哪个物理机器是每个 vnode 的副本。例如,假设我有 8 个物理节点并且 RF=3。我想为每个节点放置副本,以便它们按以下方式布局:

Let capital letters be physical nodes
Let lowercase letters be vnodes. Vnodes in parens are located on the
  corresponding physical machine.

A(ablmno)
B(acdnop)
C(abcefp)
D(bcdegh)
E(defgij)
F(fghikl)
G(hijkmn)
H(jklmop)

需要注意的重要一点是,任何 vnode 只会复制到彼此相距 4 个节点内的机器上。例如,a复制到 ABC、b复制到 ACD、d复制到 BDE,等等。

我希望能够将复制保持在一定范围的物理节点内,这样我就不会陷入没有三个包含共同零 vnode 的 phsical 节点集的情况(这意味着丢失任何三个节点集群保证数据丢失)。在上面的示例中,节点 ADE 可能会丢失并且不会导致数据丢失(假设所有副本都是最新的),因为 A、D 和 E 的 vnode 的交集是一个空集。这是python对我之前陈述的证明:

>>> A = set(['a', 'b', 'l', 'm', 'n', 'o'])
>>> D = set(['b', 'c', 'd', 'e', 'g', 'h'])
>>> E = set(['d', 'e', 'f', 'g', 'i', 'j'])
>>> A.intersection(D).intersection(E)
set([])

我知道这可能会花费节点引导速度和节点修复速度,但我可以将 # >= RF 的节点故障导致数据丢失的概率限制在 100% 以下。我对这个问题感兴趣的主要原因是多节点故障的可能性随着集群中机器数量的增加而增加,所以我想限制由于集群中的三节点故障而导致数据丢失的概率变大。

这可能与Cassandra(撰写本文时的最新版本 1.2.8)?

4

2 回答 2

0

在 Cassandra 中,复制由snitch 处理,它带有一组可用选项,例如SimpleSnitch, PropertyFileSnitch, GossipingPropertyFileSnitch, EC2Snitch, EC2MultiRegionSnitch。无论如何,要准确实现您想要的场景,您可能需要创建自己的告密者(并记住复制应该完成的所有其他要求)

于 2013-08-03T20:03:50.920 回答
0

您可以通过在每个节点上的 cassandra.yaml 中指定一个逗号分隔的令牌列表作为 initial_token 来执行此操作。

我认为您所指的是分布因子(DF)-节点与其共享副本的节点数。没有 vnodes(相当于将 num_tokens 设置为 1),DF=2RF-1。使用 vnode 和令牌的随机分配(如果您没有指定任何作为 initial_token 时会发生这种情况),DF=N(概率很高 (whp)),其中 N 是节点数。

这里有一个紧张关系 - 低 DF 意味着多个同时发生的节点故障不太可能导致数据丢失或不可用。但是低DF意味着当添加新节点时,集群将不会保持平衡。这也意味着当节点失败时重建时间(运行nodetool removetoken以创建节点的 vnode 的额外副本的时间)很大,因为可以参与重建的节点集很少。DF=N 表示集群中的所有节点都可以参与重建,从而提供最佳的重建时间。

您可能关心的不仅仅是节点同时发生故障,您可能关心的是一个节点发生故障,然后在该节点恢复之前发生另一个故障。如果恢复时间很短,那么您可能丢失数据的窗口就很小。

正如您所说,拥有更多节点意味着多个故障紧密相连的可能性会增加。然而,随着节点数量的增加,重建时间的下降足以弥补这一点,至少在独立故障的假设(显然是错误的,但通常是一个很好的近似值)下。这在我的博文中得到了证明。

上面的论点表明,高 DF 会减少停机时间。服务可靠性通常以正常运行时间为 9 的数量来衡量。如果您的服务确实如此,那么您需要高 DF。

但是,您可能希望在某个时间范围内的任何时间段内降低数据不可用的可能性(暂时,当恢复不需要流数据时)。也许您的合同规定如果在任何时候都无法读取任何数据,您将受到处罚,但他们并不关心恢复需要多长时间。在这种情况下,您需要低 DF。

请注意永久性故障和临时故障之间的区别。如果一个节点永久失败,你需要重建所以想要高 DF。如果一个节点暂时发生故障并且可以自行恢复,则您希望低 DF 以最大程度地减少数据不可用的可能性。

在现实世界中,故障在某种程度上是相关的,这使得同时发生故障的可能性更大。举个极端的例子,你可能有一些在同一物理主机上运行 Cassandra 的 VM。这些虚拟机的故障将具有极强的相关性。如果你有这个,你想选择你的令牌,这样同一物理主机上的两个虚拟机就没有共同的副本。但除此之外,如果您想要 vnode 的好处,您希望您的 DF 尽可能高。

一个不太极端的例子是多个数据中心,您希望确保每个数据中心都有一个副本。这就是 Cassandra 的 NetworkTopologyStrategy 所做的。这有助于减轻整个数据中心变得不可用的相关故障。

总之,对于完全独立的故障,具有最大 DF 的数据丢失概率最低。为此,请使用随机令牌。具有低 DF 的数据暂时不可用的可能性最低。

于 2013-07-30T09:51:42.087 回答