Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cassandra中,是否可以控制分配给哪个物理机器VNode?_Cassandra - Fatal编程技术网

在cassandra中,是否可以控制分配给哪个物理机器VNode?

在cassandra中,是否可以控制分配给哪个物理机器VNode?,cassandra,Cassandra,我只是想了解更多关于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 physi

我只是想了解更多关于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的情况(这意味着丢失集群上的任何三个节点都会导致数据丢失)。在上面的示例中,由于A、D和E的VNode的交集为空集,节点ADE可能会丢失,并且不会导致数据丢失(假设所有副本都是最新的)。下面是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)是否可以实现这一点?

可以通过在每个节点上的Cassandra.yaml中指定以逗号分隔的标记列表作为初始标记来实现

我认为您所指的是分布因子(DF)——节点与之共享副本的节点数。没有vnodes(相当于将num_标记设置为1),DF=2RF-1。对于vnodes和随机分配的令牌(如果不指定任何作为初始_令牌,则会发生这种情况),DF=N(具有高概率(w.h.p.)),其中N是节点数

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

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

正如您所说,拥有更多的节点意味着多个故障靠近在一起的概率增加。然而,随着节点数量的增加,重建时间的减少弥补了这一点,至少在独立故障的假设(显然是错误的,但通常是很好的近似)下是如此。这在我的研究中得到了证实

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

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

注意永久故障和临时故障之间的区别。如果一个节点发生永久性故障,则需要重建,以便获得高DF。如果节点暂时出现故障,并且可以自行恢复,则需要低DF以最小化数据不可用的概率

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

一个不太极端的例子是多个数据中心,您希望确保每个数据中心中都有一个副本。这就是卡桑德拉的网络拓扑战略所做的。这有助于缓解整个数据中心变得不可用的相关故障


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

在Cassandra中,复制由以下人员处理:
SimpleSnitch
PropertyFileSnitch
八卦PropertyFileSnitch
EC2Snitch
EC2MultipregionSnitch
。无论如何,要完全实现您想要的场景,您可能需要创建自己的告密者(并记住复制应该完成的所有其他要求)