Couchbase 掉期再平衡如何运作?
How does Couchbase swap rebalance work?
我试图了解在使用交换重新平衡对数据库进行传入操作的在线升级期间如何保持数据一致性。
- 当我说swap rebalance(添加和删除1个节点)时,一个节点的数据被复制到新添加的节点。在此过渡期间,到达正在删除的节点的请求会发生什么情况?
- 在交换期间我们是否发现任何数据可用性问题?
内部重新平衡是通过在节点之间移动 vBuckets 来逐步完成的。是否添加或删除节点。
vBucket 基本上是 "Partition ID" 或 "Shard"。在集群的整个生命周期中,给定键的 vBucket 是不变的。基本上:
vbucket = hash(key) % number_of_vbuckets-1
由于vbuckets总数在集群持续期间永远不会改变,vbuckets是常量。
为了确定给定的 vBucket 属于哪个服务器节点,每个服务器都有一个同步的 "Cluster Map",它基本上提供了一个映射,确定哪个 vBucket 属于哪个服务器。此地图在初始连接阶段由客户端接收,并定期更新(通过各种方式)。
客户端,在发送数据请求(get、store)时,在请求包中注明该item实际所属的vbucket。如果一切顺利,客户端会将请求发送到正确的服务器,操作将继续。
重新平衡是将 vbucket 重新分配给其他服务器的概念。在添加节点的情况下,新节点获得了之前由其他节点持有的一些 vbuckets 的所有权;在删除节点的情况下,其余服务器各自获得旧节点拥有的额外 vbuckets。
重新平衡是增量执行的;这意味着并不是所有的 vbuckets 都被一次传输。在此过程中,客户端可能会向旧节点发送请求,以获取它不再拥有的 vbuckets。发生这种情况时,节点会响应 "NOT MY VBUCKET" 错误,本质上是告诉客户端它不再负责这个 vbucket,并且客户端应该重新配置自己。然后,客户端将在内部重新配置自身并将操作重新发送到正确的节点。
如果节点被完全删除,客户端也会以此为提示重新配置自己,再次向正确的节点重新发送操作。
如果客户端在传输前立即请求 vbucket,则传输会被简单地延迟,直到该特定操作再次传播到新节点。
在所有情况下,由于 Couchbase 体系结构,客户端和每个节点之间始终存在关于该节点是否是操作正确节点的明确协议。
在交换重新平衡期间,您是正确的,数据从删除的节点复制到新节点。在最简单的情况下,它一次 v_bucket 。在复制哈希映射期间,客户端使用指向传出节点上的 v_bucket 的点。一旦复制了所有数据,包括复制期间所做的任何更改,传出节点上的 v_bucket 将被锁定以进行更新,然后哈希映射更改为指向新节点上的 v_bucket。在 v_bucket 秒之间的切换期间会有最小的中断,但它应该全部由客户端处理,您不会期望看到任何问题,只是切换时响应时间略有增加。在重新平衡期间,所有数据仍然可用。然后它移动到下一个 v_bucket.
我试图了解在使用交换重新平衡对数据库进行传入操作的在线升级期间如何保持数据一致性。
- 当我说swap rebalance(添加和删除1个节点)时,一个节点的数据被复制到新添加的节点。在此过渡期间,到达正在删除的节点的请求会发生什么情况?
- 在交换期间我们是否发现任何数据可用性问题?
内部重新平衡是通过在节点之间移动 vBuckets 来逐步完成的。是否添加或删除节点。
vBucket 基本上是 "Partition ID" 或 "Shard"。在集群的整个生命周期中,给定键的 vBucket 是不变的。基本上:
vbucket = hash(key) % number_of_vbuckets-1
由于vbuckets总数在集群持续期间永远不会改变,vbuckets是常量。
为了确定给定的 vBucket 属于哪个服务器节点,每个服务器都有一个同步的 "Cluster Map",它基本上提供了一个映射,确定哪个 vBucket 属于哪个服务器。此地图在初始连接阶段由客户端接收,并定期更新(通过各种方式)。
客户端,在发送数据请求(get、store)时,在请求包中注明该item实际所属的vbucket。如果一切顺利,客户端会将请求发送到正确的服务器,操作将继续。
重新平衡是将 vbucket 重新分配给其他服务器的概念。在添加节点的情况下,新节点获得了之前由其他节点持有的一些 vbuckets 的所有权;在删除节点的情况下,其余服务器各自获得旧节点拥有的额外 vbuckets。
重新平衡是增量执行的;这意味着并不是所有的 vbuckets 都被一次传输。在此过程中,客户端可能会向旧节点发送请求,以获取它不再拥有的 vbuckets。发生这种情况时,节点会响应 "NOT MY VBUCKET" 错误,本质上是告诉客户端它不再负责这个 vbucket,并且客户端应该重新配置自己。然后,客户端将在内部重新配置自身并将操作重新发送到正确的节点。
如果节点被完全删除,客户端也会以此为提示重新配置自己,再次向正确的节点重新发送操作。
如果客户端在传输前立即请求 vbucket,则传输会被简单地延迟,直到该特定操作再次传播到新节点。
在所有情况下,由于 Couchbase 体系结构,客户端和每个节点之间始终存在关于该节点是否是操作正确节点的明确协议。
在交换重新平衡期间,您是正确的,数据从删除的节点复制到新节点。在最简单的情况下,它一次 v_bucket 。在复制哈希映射期间,客户端使用指向传出节点上的 v_bucket 的点。一旦复制了所有数据,包括复制期间所做的任何更改,传出节点上的 v_bucket 将被锁定以进行更新,然后哈希映射更改为指向新节点上的 v_bucket。在 v_bucket 秒之间的切换期间会有最小的中断,但它应该全部由客户端处理,您不会期望看到任何问题,只是切换时响应时间略有增加。在重新平衡期间,所有数据仍然可用。然后它移动到下一个 v_bucket.