首页 > 解决方案 > Cassandra vnodes 副本

问题描述

设置上下文:Cassandra 当前实现了 vnode。256 默认情况下可以在 cassandra.yaml 文件 Vnodes 中进行调整,据我所知是令牌范围/哈希范围。例如。(x...y],其中 y 是 vnode 的令牌编号。Cassandra 中的每个物理节点都随机分配了 256 个令牌,每个令牌都是哈希/令牌范围的边界值。分配的令牌在2^-63 到 2^63-1 的范围(murmur3 具有分区器可能生成的哈希数范围)。到目前为止一切顺利。

问题: 1. 一个token range(vnode)是不是一个固定的范围。设置后,此令牌范围将被复制到其他 Cassandra 节点以满足复制因素,例如令牌范围(vnode)是一起传播的基本数据块(令牌)。只有在集群中启动新节点的情况下,此令牌范围(vnode)可能会分解以分配给其他节点。

  1. 骑在最后一个命题上,(假设最后一个命题是真的)。那么一个 vnode 必须只包含属于给定键空间的令牌。因为每个键空间(列族/表的容器)都有定义的复制策略和复制因子。Cassandra 集群中键空间的复制因子很可能会有所不同。考虑一个例子。“system_schema”键空间的 RF 为 1,而我用 RF 3 创建了一个键空间“test_ks”。如果一行 system_schema 键空间的令牌编号为 2(比如说),而我的一行 test_ks 的令牌编号为 5(比如说)。这两个令牌不能放在同一个令牌范围(vnode)中。如果一个 vnode 是一致的令牌范围块,假设令牌 2 和 5 属于令牌编号为 10 的 vnode。因此必须将 vnode 10 放置在 3 个不同的物理节点上以满足 test_ks 的 RF = 3,

这个命题是否正确,一个 vnode 只专用于给定的键空间?归结为物理节点上的 256 个令牌...... 20(比如说)vnodes 当前属于“系统”键空间,80 个 vnodes(比如说)属于 test_ks。

  1. 再次基于上述命题,这意味着每个节点都应该拥有集群中当前可用的 keyspace-wise vnode 的信息。这样,当一个键空间的新写入进入时,协调节点将为该键空间定位集群中的所有 vnode,并为新行分配一个令牌编号,该编号落在这些键空间的令牌范围内。在这种情况下,我可以知道当前有多少 vnodes 属于整个集群/或给定节点上的一个键空间。

如果我错了,请纠正我。我一直在关注以下博客和视频来了解这个概念:

https://www.scribd.com/document/253239514/Virtual-Nodes-Strategies-for-Apache-Cassandra

https://www.youtube.com/watch?v=GddZ3pXiDys&t=11s

提前致谢

标签: cassandra

解决方案


没有固定的令牌范围,令牌只是随机生成的。这是实现 vnode 的原因之一——其想法是,如果有更多的令牌,则生成的令牌范围更有可能在节点之间更均匀地分布。

令牌生成最近在 3.0 中得到了改进,允许 Cassandra 更智能地放置新令牌(请参阅CASSANDRA-7032)。您也可以手动配置令牌(请参阅initial_token),尽管在扩展集群时保持平衡可能会变得很棘手,除非您计划将节点数量增加一倍。

集群中的令牌总数是集群中的节点数乘以每个节点的 vnode 数。

关于副本的放置,分区的第一个副本放置在拥有该分区令牌的节点中。额外的n 个副本按顺序放置在环中位于同一数据中心的下n 个节点上。令牌和键空间之间没有关系。

当新的写入进入协调器节点时,协调器节点通过散列分区键来确定哪个节点拥有分区。请注意,为了获得更好的性能,如果您使用TokenAwarePolicy,这实际上可以由驱动程序完成。协调器将写入发送到拥有分区的节点,如果需要复制数据,协调器节点还会将副本顺序写入令牌空间中的下两个节点。

例如,假设我们有 3 个节点,每个节点都有一个令牌:node1: 10, node2: 20& node3: 30。如果我们将其分区键散列到22, 的记录写入具有 RF3 的键空间,则第一个副本转到 node2,第二个转到 node3,第三个转到 node1。请注意,每个副本都同样有效——“第一个”副本没有什么特别之处,只是它恰好存储在“第一个”副本节点上。

Vnodes 不会改变这个过程,它们只是通过允许每个节点拥有多个令牌来划分每个节点的令牌范围。例如,如果我们的集群现在每个节点有 2 个 vnode,它可能看起来像这样: node1: 10, 25, node2: 20, 3& node3: 30, 21。现在我们写的散列到22node3因为它拥有范围 from 21-24),副本到node1and node2


推荐阅读