将物理节点hash和虚拟节点形成映射
private void hash() {
/**
* 将物理节点散列成虚拟节点
* */
for (INode node : this.physicalNodes) {
for (int i = 0; i < virtualCount / 4; i++) {
byte[] hashCodeBytes = (node.getKey().toString() + i).getBytes();
hashCodeBytes = Utils.md5Encode(hashCodeBytes);
for (int j = 0; j < 4; j++) {
int virtualKey = (hashCodeBytes[3 + 4 * j] & 0xFF) << 24 | (hashCodeBytes[2 + 4 * j] & 0xFF) << 16 | (hashCodeBytes[1 + 4 * j] & 0xFF) << 8 |
(hashCodeBytes[4 * j] & 0xFF);
this.sortedHashNode.put(virtualKey, node);
}
}
}
}
给定Key查找数据的物理节点逻辑
/**
* 这里是用来给定一个key来通过虚拟节点定位到于物理节点的逻辑
*
* @param key
* @return
*/
public INode locate(Key key) {
int virtualKey = key.key2VirtualKey();
if (!this.sortedHashNode.containsKey(virtualKey)) {
SortedMap<Integer, INode> sortedNodes = this.sortedHashNode.tailMap(virtualKey);
if (sortedNodes.isEmpty()) {
virtualKey = this.sortedHashNode.firstKey();
} else {
virtualKey = sortedNodes.firstKey();
}
}
return this.sortedHashNode.get(virtualKey);
}
分享到:
相关推荐
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它解决了在分布式环境中数据分片和负载均衡的问题。在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希...
- `ConHash`结构体:用于存储一致性哈希的内部信息,包括节点列表、虚拟节点映射等。 - `Node`结构体:表示一个服务器节点,包含哈希值、服务器IP和端口等信息。 - `add_node`和`del_node`函数:分别用于添加和...
【一致性哈希与Chord1】是一篇关于分布式哈希算法的文章,主要讨论了一致性哈希和普通哈希的区别,以及如何通过引入虚拟节点来优化一致性哈希的分布问题。 1. **普通哈希算法**: - Java中的`HashMap`类是一个典型...
一致性哈希算法通过将哈希值空间组织成一个虚拟的环状结构,使得每个存储节点仅负责环上的一段区域,从而有效减少了节点变化时的数据迁移量。然而,一致性哈希算法也存在一些问题,比如在节点数量较少时,节点间的...
传统的哈希算法可能会导致大量数据在节点变化时发生重新映射,而一致性哈希通过虚拟节点和哈希环的概念,使得每次节点变动只需少量的数据迁移。 二、Mycat与一致性哈希 Mycat在处理大规模数据时,通过一致性哈希...