极客前沿

一致性哈希入门:装好环境,第一次跑通

2026-06-09 01:30
DEV Beginners
查看原文

学会一致性哈希的基本概念,安装 Python 并运行示例代码,体验数据分布与节点增删。

准备环境

你需要一台装了 Python(一种简单易学的编程语言)的电脑。如果没有,去 python.org 下载并安装,记得勾选“Add Python to PATH”。安装后打开终端(Windows 按 Win+R 输入 cmd,Mac 打开“终端”),输入 python --version 看到版本号就成功了。

安装步骤

  1. 创建一个文件夹用于存放代码,比如 consistent_hashing
  2. 在该文件夹里新建文件 hash_demo.py
  3. 复制下面的代码并粘贴到文件中:
    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)}')
  4. 在终端中进入该文件夹,运行 python hash_demo.py

验证是否成功

你会看到类似输出:data1 -> ServerA 等。移除 ServerB 后,原本属于 ServerB 的数据会重新分配给其他服务器,而其他数据位置不变。这就是一致性哈希的核心:节点变化时只影响少量数据

Tutorial Image

常见坑: 代码中的 replicas 是虚拟节点数,越多分布越均匀,但计算越慢。初学者先用 3 试试。

下一步可以做什么

  • 试着增加节点(调用 add_node)看看数据怎么迁移。
  • 把代码改成从文件读取数据列表,模拟真实场景。
  • 了解实际系统如 Redis Cluster(一种分布式缓存)如何用一致性哈希分片。

内容来源

DEV Beginners

发布时间

2026-06-09 01:30

返回 AI技术