新节点加入时的 cassandra 数据重新分配
cassandra data redistribution when new nodes join
我是 Cassandra 的初学者。我想了解当新节点加入现有集群时如何(重新)分发数据。
让我们假设,在 10 个节点的集群中有 100 个行键。此外,为简单起见,让我们假设使用哈希函数将行均匀分布到 10 个节点,即节点 N1 的行键从 1 到 10,节点 N2 的行键从 11 到 20,依此类推。
现在,如果一个新的节点N11加入集群,如何在保持相同哈希函数的11个节点上继续进行数据分发?原因是哈希函数的范围早先被限制在 10 个节点。并且新增节点后,哈希函数的范围需要改变。
考虑到上述情况,查找旧记录(当仅存在 10 个节点时)如何成功?
在 Cassandra 1.2 之前,向集群添加节点意味着拆分令牌范围。例如,哈希函数产生 1 到 100 之间的值:
- 之前:1-10,11-20,21-30,31-40,41-50,51-60,61-70,71-80,81-90,91-100
- 之后:1-5,6-10,11-20,21-30,31-40,41-50,51-60,61-70,71 -80,81-90,91-100
第一个节点将其令牌范围的一部分提供给新节点(粗体)。
每个节点维护一个所有节点的映射并且知道哪个节点处理哪个令牌范围(包括副本)。当一个节点 added/removed 来自集群时,其他节点通过相互闲聊获得更改通知。
Since Cassandra 1.2, with the addition of virtual nodes,集群的每个节点都将其令牌范围的一部分给新节点。因此,每个节点或多或少地保持相同的令牌范围宽度和相同的负载。
我是 Cassandra 的初学者。我想了解当新节点加入现有集群时如何(重新)分发数据。
让我们假设,在 10 个节点的集群中有 100 个行键。此外,为简单起见,让我们假设使用哈希函数将行均匀分布到 10 个节点,即节点 N1 的行键从 1 到 10,节点 N2 的行键从 11 到 20,依此类推。
现在,如果一个新的节点N11加入集群,如何在保持相同哈希函数的11个节点上继续进行数据分发?原因是哈希函数的范围早先被限制在 10 个节点。并且新增节点后,哈希函数的范围需要改变。
考虑到上述情况,查找旧记录(当仅存在 10 个节点时)如何成功?
在 Cassandra 1.2 之前,向集群添加节点意味着拆分令牌范围。例如,哈希函数产生 1 到 100 之间的值:
- 之前:1-10,11-20,21-30,31-40,41-50,51-60,61-70,71-80,81-90,91-100
- 之后:1-5,6-10,11-20,21-30,31-40,41-50,51-60,61-70,71 -80,81-90,91-100
第一个节点将其令牌范围的一部分提供给新节点(粗体)。
每个节点维护一个所有节点的映射并且知道哪个节点处理哪个令牌范围(包括副本)。当一个节点 added/removed 来自集群时,其他节点通过相互闲聊获得更改通知。
Since Cassandra 1.2, with the addition of virtual nodes,集群的每个节点都将其令牌范围的一部分给新节点。因此,每个节点或多或少地保持相同的令牌范围宽度和相同的负载。