假设我有一个具有以下方案的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}
此映射是否作为全局配置存在于所有节点中,因为在以轮循机制方式转发请求时,任何节点都可以充当协调器?
谢谢
映射不作为全局配置存在。 相反,每个节点都维护群集中其他节点状态的自己的副本。 通常,集群将使用 gossip 协议频繁地与附近的几个节点交换有关集群中其他节点的信息。 这样,映射信息将快速传播到群集中的所有节点,即使有数千个节点也是如此。
每个节点都必须知道如何将分区键映射到令牌值,并知道哪个节点负责该令牌。 这样,每个节点都可以充当协调器来处理任何请求,方法是将其发送到处理该密钥的确切节点。
更进一步,例如,如果您使用当前的 java 驱动程序,则可以让客户端使用令牌感知路由策略。 这可以通过客户端驱动程序获取有关如何将密钥映射到节点的信息的副本来工作。 然后,当您发出请求时,它将直接发送到处理该密钥的节点。 这提供了很好的性能提升。
通常,您无需担心密钥的映射方式,因为如果您使用虚拟节点和 Murmur3Partitioner,集群将负责创建键映射,以便在添加和删除节点时平衡集群之间的负载。