Couchbase如何交换重新平衡工作?

时间:2015-06-10 09:26:52

标签: couchbase

我试图了解如何在使用交换重新平衡进行数据库传入操作的在线升级期间保持数据一致性。

  • 当我说交换重新平衡(添加和删除1个节点)时,来自一个节点的数据将被复制到新添加的节点。在此转换期间,发送到正在删除的节点的请求会发生什么?
  • 在交换期间,我们是否看到任何数据可用性问题?

2 个答案:

答案 0 :(得分:5)

通过在节点之间移动vBucket来逐步完成内部重新平衡。是否添加或删除节点。

vBucket基本上是一个"分区ID"或者" Shard"。在集群的整个生命周期中,给定密钥的vBucket是不变的。基本上是:

vbucket = hash(key) % number_of_vbuckets-1

由于在群集持续时间内总的vbuckets数量永远不会改变,因此vbucket是不变的。

要确定给定vBucket属于哪个服务器节点,每个服务器都有一个同步的" Cluster Map"它基本上提供了一个映射,确定哪个服务器拥有哪个vBucket。客户端在初始连接阶段接收此映射,并定期更新(通过各种方式)。

客户端在发送数据请求(get,store)时在请求包中指示该项所属的实际vbucket。如果一切正常,客户端会将请求发送到正确的服务器,操作将继续。

重新平衡是将vbuckets重新分配给其他服务器的概念。在添加节点的情况下,新节点获得先前由其他节点保持的一些vbucket的所有权;在删除节点的情况下,其余服务器都会获得旧节点拥有的其他vbucket。

逐步执行重新平衡;这意味着并非所有vbuckets都会立即转移。在此过程中,客户端可以向旧节点发送不再拥有的vbuckets请求。当发生这种情况时,节点会响应一个" NOT MY VBUCKET"错误,基本上告诉客户端它不再负责这个vbucket,并且客户端应该重新配置自己。然后,客户端在内部重新配置自身,并将操作重新发送到正确的节点。

如果完全删除了节点,客户端也会将其作为重新配置的提示,并再次将操作重新发送到正确的节点。

如果客户端在传输之前请求vbucket,则只会延迟传输,直到该特定操作再次传播到新节点。

在所有情况下,由于Couchbase架构,客户端和每个节点之间始终存在关于节点是否是操作的正确节点的明确协议。

答案 1 :(得分:0)

在交换重新平衡期间,您是正确的,数据将从已删除的节点复制到新节点。最简单的是它一次做这个v_bucket。在复制哈希映射期间,客户端使用指向传出节点上的v_bucket的点。复制完所有数据(包括复制期间所做的任何更改)后,传出节点上的v_bucket将被锁定以进行更新,然后哈希映射将更改为指向新节点上的v_bucket。在v_buckets之间切换期间会有最小的中断,但它应该由客户端处理,你不会期望看到任何问题,只是在切换时响应时间略有增加。重新平衡期间所有数据仍然可用。然后它转到下一个v_bucket。