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

min*_*ion 1 couchbase

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

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

Mar*_*erg 5

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

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

vbucket = hash(key) % number_of_vbuckets-1
Run Code Online (Sandbox Code Playgroud)

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

为了确定给定vBucket属于哪个服务器节点,每个服务器都具有同步的"集群映射",其基本上提供确定哪个vBucket由哪个服务器拥有的映射.客户端在初始连接阶段接收该映射,并定期更新(通过各种方式).

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

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

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

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

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

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