我只是想多了解一点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)?