Cluster集群可以基于一致性哈希算法么?
作者:程序员马丁
note
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
回答话术
首先,由于数据要分片存储在不同的服务器节点上,因此当用户发起请求时,我们会需要一个哈希算法保证对某个 Key 的请求总是 路由到指定的服务器节点。传统的哈希算法基于长度(也就是节点数量)进行取模,因此当扩容和缩容时会需要对大量的数据进行迁移。而一致性哈希算法则用于解决这个问题。
在一致性哈希中,规定了一个固定大小的哈希环,环上均匀分布有 2^32 个节点,服务器节点也分布在环上。当用户发起请求时,将会根据 Key 的哈希值计算出落点,若 Key 的落点没有对应的服务器节点,则顺时针寻找最近的服务器节点。当扩容时,仅需要对新节点与上一节点之间的数据进行迁移,而缩容亦同理。
一致性哈希的优点在于避免了传统哈希算法中扩容和缩容时的大规模数据迁移,但是它也有缺点,那就是当节点在环上分布不均匀就可能导致数据倾斜。因此,当节点掉线或缩容时,可能因为将全部数据压到下一节点而导致服务雪崩。为了解决这个问题,我们需要允许一个节点在环上映射出多个虚拟节点,这样就能尽可能的使请求均匀的打到不同的服务器上。
Redis 集群采用的哈希槽方案同样基于固定数量(2^14)的哈希槽实现,不过相对于一致性哈希,每个节点拥有的哈希槽是可以直接分配的:
- 我们可以直接根据服务器的性能而为它们分配不同数量的哈希槽位,一致性哈希虽然也可以通过改变某个服务器对应虚拟节点的数量做到类似的效果,不过显然没有这么精准。
- 当扩容和缩容的时候,我们可以手动指定将哪些槽位转移到哪些节点,而一致性哈希则做不到类似的效果。
总的来说,哈希槽在使用上比一致性哈希更加灵活,并且实现上也更加简单。