Cassandra num_tokens - 这真的是num_token_partitions吗?

时间:2013-11-15 07:03:39

标签: cassandra cassandra-2.0

我是Cassandra的新手。我正在阅读cassandra.yml文件中虚拟节点的num_tokens参数。我不认为我完全理解这是做什么或如何分配令牌/分区。这是怎么回事?

如果我们真的在谈论令牌/节点的数量,那么默认值256没有任何意义。 num_tokens真的是num_token_partitions / node吗?

让我们选择2个节点A和B开始,添加第3个节点C,然后尝试解释工作原理。首先,每个节点都配置了256的num_tokens。现在,当A和B出现时

  1. A和B加入群集时会获得多少令牌? A和B得到什么分区范围,如何确定?
  2. Cassandra中存储了哪种元数据,以了解A和B携带的分区范围。
  3. 当C加入时会发生什么? Cassandra如何确定C得到的分区范围?应该在C上放多少个分区?
  4. 当C加入时,A和B的分区范围是如何确定的?
  5. 有人为了每个人的利益而详细澄清吗?

3 个答案:

答案 0 :(得分:21)

4)分区范围是通过向每个节点授予从其可用令牌到下一个指定令牌的范围来确定的。

2)通过八卦细节交换数据,哪些节点具有哪些令牌。该元数据允许每个节点知道哪个节点负责哪个范围。 Keyspace /复制设置也会更改实际保存数据的位置。

实施例: 1)A获得256个范围B获得256个范围。但是为了使这个简单,让他们给每个2个令牌并假装令牌范围是0到30

给定代币:A 10,15和B 3,11 节点负责以下范围

(3-9:B)(10:A)(11-14:B)(15-30,0-2:A)

3)如果C也加入2个令牌20,5 节点现在将负责以下范围

(3-4:B)(5-9:C)(10:A)(11-14:B)(15-19:A)(20-30,0-2:C)

Vnode非常强大,因为现在当C加入集群时,它从多个节点(B中的5-9和来自A的20-30,0-2)中获取数据,共享这些机器之间的负载。在这个玩具示例中,您可以看到只有2个令牌允许某些节点承载大部分数据,而其他节点几乎没有。随着Vnode的数量增加,节点之间的平衡随着范围越来越随机地细分而增加。在256个节点上,您极有可能向集群中的每个节点分配了大量数据。

了解更多信息 VNodes:http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2

答案 1 :(得分:0)

  

在256个节点上,您极有可能向群集中的每个节点分配了大量数据。

除非当然不是。随机Vnode令牌范围分配与平衡负载无关。平衡负载是令牌范围ENGINEERED是平衡的,而不是猜测。

然后,令牌范围分配CASSANDRA-6388CASSANDRA-7032中的错误都没有固定在今天生产的任何群集中。然后有256个VNODE集群的主要问题,并试图重建它们或支持它们,这是不可能的,字面上。

重建和恢复需要WEEKS。并尝试在生产中对vnodes运行hadoop。为VNODE冰雹玛丽放弃一个设计的令牌范围集群,这将带来危险。

答案 2 :(得分:0)

RussS的回答也是正确的,我认为这很难理解。

这个想法与其说是令牌分配,不如说是因为这是Cassandra用于分配对数据的访问权的技术手段。

重要的是复制因子和环,以了解其意义。

复制的工作方式是在接下来的两个节点上复制节点的数据。因此,如果您在节点A上,则分配给A的数据将复制到B和C上。分配给B的数据将复制到C和D上,依此类推。

如果您只有3个节点,并且复制3个节点,则没有任何区别。

如果您有100个节点,则复制3和num_tokens: 1,则恰好3个节点复制它们分配的数据,并且始终是节点的整个数据集。在上面的示例中,这意味着可以从A,B或C中读取所有已分配数据A的数据,并且只能从这三个节点读取数据。因此,如果您尝试频繁地加载特定数据,而不那么频繁地加载其余数据,则您的集群将变得非常不平衡。

对于v节点,数据在子分区中分解。一台计算机代表许多虚拟节点。因此,假设num_tokens: 5,旧计算机A现在可以代表A,D,G,J,M。

接下来,我们要响。建立环网时,计算机之间的连接方式将使同一台计算机之间不会相互连接(A不会直接与D通讯,反之亦然)。

现在,这意味着一台物理计算机将连接到num_tokens×replication_factor - 1其他计算机。因此,将num_tokens设置为5并复制3,您将连接到另外10台计算机。这意味着负载将在10台计算机之间共享,而不是3台计算机共享(否则将暗示复制因素。)

因此,有16个节点,num_tokens: 256replication: 3,这是一个奇怪的设置,因为这意味着所有节点之间相互连接512次。话虽这么说,以后必须更改num_tokens才能使集群花费一些时间来适应新值。特别是如果您的安装较大。因此,如果您预见到会有大量的节点,那么从一开始就建议使用较大的num_tokens

作为副作用,它还将在每个节点上的各个表(文件)之间分配数据。这也可以帮助更快地查找数据。实际上,建议您每次创建Elassandra群集时都使用大量实例(16到64个)以简化搜索。