1
架构师训练营第五周作业
发布于: 2020 年 11 月 21 日
1 一致性 hash 算法
参考网上,hash 算法没有深究
public class ConsistencyHash {
private TreeMap<Long, NodeDefine> nodes; // 虚拟节点
private List<NodeDefine> shards; // 真实机器节点
private final int NODE_NUM = 150; // 每个机器节点关联的虚拟节点个数
public ConsistencyHash(List<NodeDefine> shards) {
super();
this.shards = shards;
init();
}
private void init() { // 初始化一致性hash环
nodes = new TreeMap<Long, NodeDefine>();
for (int i = 0; i != shards.size(); ++i) { // 每个真实机器节点都需要关联虚拟节点
final NodeDefine shardInfo = shards.get(i);
for (int n = 0; n < NODE_NUM; n++)
// 一个真实机器节点关联NODE_NUM个虚拟节点
nodes.put(hash("SHARD-" + i + "-NODE-" + n), shardInfo);
}
}
public NodeDefine getShardInfo(String key) {
SortedMap<Long, NodeDefine> tail = nodes.tailMap(hash(key)); // 沿环的顺时针找到一个虚拟节点
if (tail.size() == 0) {
return nodes.get(nodes.firstKey());
}
return tail.get(tail.firstKey()); // 返回该虚拟节点对应的真实机器节点的信息
}
}
复制代码
关键是这个 TreeMap
2 测试
测试一下负载的均衡性
public static void main(String[] args) {
List<NodeDefine> shards = new ArrayList<>();
for (int i=1;i<=10;i++){
NodeDefine nodeDefine1 = new NodeDefine("node"+i);
shards.add(nodeDefine1);
}
for (int i=50;i<200;i+=10){
calSD(shards,i);
}
}
private static void calSD(List<NodeDefine> shards, int virNum) {
ConsistencyHash hashGeneroTools = new ConsistencyHash(shards,virNum);
NodeDefine nodeDefine = hashGeneroTools.getShardInfo("test003");
Map<NodeDefine,Integer> hits = new HashMap<>();
for (int i=0;i<10000000;i++){
nodeDefine = hashGeneroTools.getShardInfo("test"+i);
if (i%100000 ==0) {
//System.out.println(nodeDefine);
}
hits.put(nodeDefine, hits.get(nodeDefine)==null?1:hits.get(nodeDefine)+1);
}
Integer[] nums = hits.values().toArray(new Integer[0]);
double sd = calculateSD(nums);
System.out.println(virNum +"->" +sd);
}
public static double calculateSD(Integer numArray[])
{
double sum = 0.0, standardDeviation = 0.0;
int length = numArray.length;
for(double num : numArray) {
sum += num;
}
double avg = sum/length;
for(double num: numArray) {
standardDeviation += Math.pow(num - avg, 2);
}
return Math.sqrt(standardDeviation/length-1);
}
复制代码
方差:
50->16118.154305006514
60->16659.854933342005
70->11781.383687835652
80->7230.941487800879
90->7634.385829914545
100->7226.703660729419
110->5370.755775493799
120->8509.62398699261
130->5219.742733123922
140->5433.480541973073
150->5587.672436261333
160->4252.703399015737
170->3883.7512021240495
180->4519.301848737258
190->5608.920876603627
复制代码
从我这边测试结果,虚拟节点数大于 80,结果接近
3 第五周心得
编程是架构师的基本功,有技术才能说服他人。
划线
评论
复制
发布于: 2020 年 11 月 21 日阅读数: 40
丁乐洪
关注
还未添加个人签名 2018.10.11 加入
还未添加个人简介
评论