1

假设我有一个具有以下方案的 cassandra 集群:

(76-100) Node1 - Node2 (0-25)
                 |      |
(51-75)  Node4 - Node3 (26-50)

每个节点主要负责一个范围的分区键:比如总范围为0-100,我在上面已经指明了节点负责的范围。

现在,假设节点 1 是协调器处理请求。与分区键 28 对应的读取请求到达节点 1。

节点 1 如何知道节点 2 是分区键 28 的主节点。每个节点是否都有节点 ID 到它们负责的分区键的映射。例如,

{Node1:76-100, Node2: 0-25, Node3: 26-50, Node4: 51-75}

这个映射是否作为全局配置存在于所有节点中,因为当请求以循环方式转发时,任何节点都可以充当协调器?

谢谢

4

1 回答 1

2

映射不作为全局配置存在。相反,每个节点都维护自己的集群中其他节点状态的副本。通常,集群将使用 gossip 协议频繁地与附近的几个节点交换有关集群中其他节点的信息。这样,即使有数千个节点,映射信息也会迅速传播到集群中的所有节点。

每个节点都必须知道如何将分区键映射到令牌值,并知道哪个节点负责该令牌。这样每个节点都可以充当协调器,通过将请求发送到正在处理该密钥的确切节点来处理任何请求。

更进一步,如果您使用例如当前的 java 驱动程序,您可以让客户端使用令牌感知路由策略。这由客户端驱动程序工作,还获取有关如何将键映射到节点的信息的副本。然后,当您发出请求时,它将直接发送到正在处理该密钥的节点。这提供了很好的性能提升。

通常,您无需担心键是如何映射的,因为如果您使用 vnodes 和 Murmur3Partitioner,集群将负责创建键的映射,以在添加和删除节点时平衡集群中的负载。

于 2015-01-08T01:01:22.167 回答