一致性哈希入门:装好环境,第一次跑通
学会一致性哈希的基本概念,安装 Python 并运行示例代码,体验数据分布与节点增删。
准备环境
你需要一台装了 Python(一种简单易学的编程语言)的电脑。如果没有,去 python.org 下载并安装,记得勾选“Add Python to PATH”。安装后打开终端(Windows 按 Win+R 输入 cmd,Mac 打开“终端”),输入 python --version 看到版本号就成功了。
安装步骤
- 创建一个文件夹用于存放代码,比如
consistent_hashing。 - 在该文件夹里新建文件
hash_demo.py。 - 复制下面的代码并粘贴到文件中:
import hashlib class ConsistentHash: def __init__(self, nodes=None, replicas=3): self.replicas = replicas self.ring = {} self.sorted_keys = [] if nodes: for node in nodes: self.add_node(node) def _hash(self, key): return int(hashlib.md5(key.encode()).hexdigest(), 16) def add_node(self, node): for i in range(self.replicas): virtual_key = f"{node}:{i}" hash_val = self._hash(virtual_key) self.ring[hash_val] = node self.sorted_keys.append(hash_val) self.sorted_keys.sort() def remove_node(self, node): for i in range(self.replicas): virtual_key = f"{node}:{i}" hash_val = self._hash(virtual_key) del self.ring[hash_val] self.sorted_keys.remove(hash_val) def get_node(self, key): if not self.ring: return None hash_val = self._hash(key) for ring_key in self.sorted_keys: if ring_key >= hash_val: return self.ring[ring_key] return self.ring[self.sorted_keys[0]] # 测试 nodes = ['ServerA', 'ServerB', 'ServerC'] ch = ConsistentHash(nodes) data = ['data1', 'data2', 'data3', 'data4', 'data5'] for d in data: print(f'{d} -> {ch.get_node(d)}') print('--- 移除 ServerB ---') ch.remove_node('ServerB') for d in data: print(f'{d} -> {ch.get_node(d)}') - 在终端中进入该文件夹,运行
python hash_demo.py。
验证是否成功
你会看到类似输出:data1 -> ServerA 等。移除 ServerB 后,原本属于 ServerB 的数据会重新分配给其他服务器,而其他数据位置不变。这就是一致性哈希的核心:节点变化时只影响少量数据。
常见坑: 代码中的 replicas 是虚拟节点数,越多分布越均匀,但计算越慢。初学者先用 3 试试。
下一步可以做什么
- 试着增加节点(调用
add_node)看看数据怎么迁移。 - 把代码改成从文件读取数据列表,模拟真实场景。
- 了解实际系统如 Redis Cluster(一种分布式缓存)如何用一致性哈希分片。
内容来源
DEV Beginners
发布时间
2026-06-09 01:30