Hash vbucket如何解决切换期间的服务器数据丢失问题

Hash vbucket如何解决切换期间的服务器数据丢失问题,hash,memcached,consistent-hashing,Hash,Memcached,Consistent Hashing,memcached使用vbucket动态添加/删除服务器。我的问题是它如何比一致散列更好。此外,当添加服务器且状态从挂起更改为活动时。首先完成,然后vbucket指向新添加的服务器。因此,将要发送给旧请求的请求也必须发送给新请求,并且切换应该以原子方式进行。如何实现?首先,我不相信VBuckets实际上已经实现到memcached中。我知道它们被使用的唯一地方是Couchbase,它的Couchbase Bucket中有一个类似memcached的缓存层 我的问题是它如何比一致散列更好 VBuc

memcached使用vbucket动态添加/删除服务器。我的问题是它如何比一致散列更好。此外,当添加服务器且状态从挂起更改为活动时。首先完成,然后vbucket指向新添加的服务器。因此,将要发送给旧请求的请求也必须发送给新请求,并且切换应该以原子方式进行。如何实现?

首先,我不相信VBuckets实际上已经实现到memcached中。我知道它们被使用的唯一地方是Couchbase,它的Couchbase Bucket中有一个类似memcached的缓存层

我的问题是它如何比一致散列更好

VBuckets优于一致散列,因为它们比单个密钥更容易在服务器之间移动。如果您依赖一致散列,那么如果您想从两个服务器移动到三个服务器,那么唯一的方法就是将系统中的每个密钥重新散列到新的服务器集。如果有VBuckets,则只需将少数VBuckets移动到新服务器。这本质上提供了一种确定需要移动哪些键的简单方法,并且可以避免访问群集中的每个键

当VBucket移动到另一台服务器时,客户端如何确定向何处发送请求


在Couchbase中,每个客户端都包含一个映射,该映射将VBuckets映射到ip地址。客户端还与发送VBucket映射更改的流端口连接。当客户端获得一个新的映射时,它可以更新请求路由到的位置。

您是对的,vbucket是在couchbase中实现的,couchbase内部只包含memcached,它最初由Zynga开发(作为Membase),我在那里工作。我不明白你的意思,移动服务器很容易。在一致散列中,添加服务器时不会对密钥进行散列。您只需添加一个服务器,它就开始在环中获取在它之前的密钥。现在没有重新散列,但结果是您遇到了冷缓存问题。与其让我在这里解释,不如看看这篇文章,如果你还有问题,请告诉我。是的,你又对了:)但看看折衷。如果必须在没有家庭作业的情况下添加服务器(即紧急添加),那么一致性哈希具有好处,您所做的是:当由于添加了新服务器而出现未命中时,代码可以轻松地确定要去哪里。您需要找出最大/最小绑定逻辑,然后您可以延迟移动数据或从使用者移动数据。请记住,使用VBuckets时,每个客户端都应该在VBucket映射更改时立即从群集获得更新,因此客户端也应该始终能够在1个跃点内将请求定向到相应的服务器。我认为,在您上面提到的情况下,一个权衡是,由于VBucket被移动到新服务器上,因此在这些VBucket被移动之前,您无法使用新服务器中的额外内存。另一个权衡是,延迟移动数据会暂时增加数据库的负载,但使用VBuckets则不会。