在Apache Cassandra中改变VNodes数量的影响
作者:互联网
在我们进行深入探讨之前,需要注意的是,一旦一个节点已经加入了集群,num_tokens这个设置参数就不应该再有任何的改变。因为这样会使得该节点在重启时将发生故障。
一个数据中心中所有节点的num_tokens值应该是一样的。从过去来说,异构的集群是允许有不同的num_tokens值的。虽然这种情况很少见,我们也不推荐这么做——但从理论上讲,如果节点的硬件规格提升两倍,你是可以将num_tokens的值加倍的。
另外,一个数据中心的节点的num_tokens值与另一个数据中心的节点的num_tokens值不同,这种情况是很常见的。这正是在保证零宕机时间的前提下,可以安全的改变一个正在运行的集群的num_tokens值的部分原因。
num_tokens这一设置影响了Cassandra如何在节点间分配数据、如何从节点中取出数据,以及如何在节点间移动数据。
在后台,Cassandra用分区算法(partitioner)来决定数据存储在集群的何处。分区算法是一个具有一致性的哈希算法,它可以将分区键(partition key,即主键的第一部分)一一映射到相应的令牌,而令牌则会决定与这些分区键相关的数据将会被存储在哪些节点。
集群中的每个节点都会被分配来自令牌环(token ring)中的一个或多个唯一的令牌值(哈希值)——这是一种形象而巧妙的说法,其实每个节点被分配的是一段首尾相接的数字范围中的一个数字。
也就是说,所谓的“被分配的数字”就是前面提到的令牌哈希值,而所谓的“首尾相接的数字范围”就是前面提到的哈希环。之所以说令牌环(哈希环)是环状的,是因为它的最大值的下一个值是它的最小值。
被分配的令牌定义了节点在令牌环上所负责的令牌范围,这个范围通常被称为“令牌区间(token range)”。
一个节点所负责的“令牌区间”的边界是两个值所定义的:一是该节点被分配的令牌值,二是在令牌环上自该令牌值向后推所得到的最小的可用哈希值。被分配的令牌值是包括在节点的令牌区间内的,不过令牌环上最小的可用令牌值则不包括在内——该值通常为前一个相邻节点占用。
一个首尾相接的令牌环意味着节点所负责的令牌可能包括了该令牌环的最大令牌值和最小令牌值。至少曾出现过一次这样的状况——在令牌环上向后推所得到的最小可用令牌值越过了令牌环中首尾相接的点,即向后推的最小令牌值越过了令牌环的最大值。
举例来说,在下面的令牌环分配图中,我们有一个令牌值范围为0-99的令牌环。令牌10被分配给了节点1。在集群中,节点1前面的节点是节点5,它被分配的令牌是令牌90。这样一来,节点1所负责的令牌值的范围就是91到10了。
标签:令牌,VNodes,令牌环,tokens,num,哈希,Apache,节点,Cassandra 来源: https://www.cnblogs.com/lang0832/p/14496036.html