一致性哈希的实现
目录 | 二级目录 |
---|---|
理解 | |
实现 | 类图 |
运行展示 | 开启服务,检查服务响应,配置 |
一致性哈希解决「集群中数据的存储路由(应该保存在哪台机器)」问题。
问题 | 说明 | 解决 |
---|---|---|
定位策略 | 传统哈希策略「数据key的位置 = hash(key)%服务器数量N」中,假定N是不变的,若N变化,将发生大规模数据移动 | 数据key的哈希值(对固定值取模)在哈希环中的位置为v,从v开始、顺时针方向遇到的第一个服务器,即为目标服务器 |
数据倾斜-节点太少 | 服务器节点太少时,数据在服务器中的分布可能不均匀 | 引入中间层——虚拟节点,每台物理机器映射为一组虚拟服务器,新的映射关系为「key->虚拟节点->物理节点」 |
数据倾斜-考虑服务器容量 | 若不考虑服务器容量限制,那么个别服务器可能接受过多的存储 | 设定每台服务器的容量限制,若找到的服务器的容量超过限制时、继续往前寻找 |
开启代理服务(18888端口):
go run main.go
开启kv服务(默认8081端口):
go run server/main.go
可以开启更多kv服务:
go run server/main.go -p 8082
go run server/main.go -p 8083
...
查询不同的key,并在代理服务的日志中,检查响应是否来自不同的物理服务器:
curl -i "http://localhost:18888/host?key=123"
curl -i "http://localhost:18888/host?key=4"
...
考虑服务器容量的一致性哈希:
curl -i "http://localhost:18888/hostCapacious?key=567"
可在core/algorithm.go
中更改loadBoundFactor
,并查看效果。