导航菜单

眼部扁平疣-Go 完成一致性哈希算法与高可用集群署理

Go言语中文网,致力于每日共享编码常识,欢迎重视我,会有意想不到的收成!

假定N为后台服务节点数,当前眼部扁平疣-Go 完成一致性哈希算法与高可用集群署理台带着关键字key建议恳求时,咱们通常将key进行hash后选用模运算(hash(key)%N)来将恳求分发到不同的节点上。

对前台恳求于后台无状况服务节点不灵敏的场景而言,只需恳求key具有必定的随机性,哪怕节点动态增删,该算法于后台而言已能够到达很好的负载均衡作用。

但关于散布式缓存,或许散布式数据库等场景而言,上述方法就不适宜了。因后台节点的增删会引起简直一切key的从头映射。这样,于散布式缓存而言,均发作cache miss;于散布式数据库而言发作数据紊乱,其影响是灾难性的。

而一致性哈希算法的方针是,当K个恳求key建议恳求时。后台增减节点,只会引起K/N的key发作从头映射。即一致性哈希算法,在后台节点稳守时,同一key的每次恳求映射到的节点是相同的。而当后台节点增减时,该算法尽量将K个key映射到与之前相同的节点上。

1)一致性哈希算法原理

一致性哈希算法是将每个Node节点映射到同一个圆上。将各Node的k眼部扁平疣-Go 完成一致性哈希算法与高可用集群署理ey选用hash核算,可得到一个整数数组。将该数组排序后,首尾相连便是一个圆。如下图所示,Node的key散布在圆的不同弧段上。同理,若有一恳求key,hash后落入该圆的某眼部扁平疣-Go 完成一致性哈希算法与高可用集群署理一弧段(下图三角点所示),顺时针方向寻得离其最近的节点即为其服务节点(下图Node2)。这样每个节点覆盖了圆上从上一节点到其自身的一段弧段区间。如某一节点失效,之前落入其弧段区间的恳求即会顺时针移到与其相邻的节点(下图如Node2失效,之前落入Node3至Node2弧段的恳求会落入Node1)。而未落入失效弧段区间的节点则不受影响(之前落入Node2至Node3弧段的恳求,当Node2失效后不受影响)。添加节点的场景与此相似,新的节点承载一段新区间,这样,落入失效节点至新节点弧段的恳求会被新节点所承载。

在节点固定的情况下,为了添加节点在圆上散布的均匀性与涣散性,能够设置节点的replicas(副本数)。下图将replicas设置为2,各节点承载的弧段规模已愈加精密且于全体而言散布愈加涣散。所以恰当调理replicas参数能够进步算法的均衡性。

2)Golang一致性哈希算法完成代码

本文的hash函数,是对key先做一次md5Sum,然后选用crc32做checkSum得到一个正数。

3)均匀性剖析

构建服务节点时,为模仿节点key在圆上的散布,简略选用id(0,1,2)做初始key,replicas为100。依据点距离等比例区分圆后得到其方位,五颜六色小圆点为其对应的节点(红绿蓝对应0,1,2);

三角点代表外部恳求的三个字符串(10.10.10.10,10.10.20.11,10.10.30.12)hash后按算法取到的服务节点;

运用Python matplotlib东西描点绘图如下。

从图可知,节点虽少(3个),但扩展副本量后,key的散布已具有必定的均匀性与涣散性,外部key恳求的终究落地节点于全体服务节点而言也是比较均匀的。

4)Golang高可用集群署理代码

一致性哈希算法具有很广泛的运用场景。如做恳求分流与负载均衡,散布式缓存,散布式存储等。如下代码调用Golang反向署理类库,结合上述一致性哈希算法,依据恳求头符号做分发,数行代码,即可构建一个细巧高可用的署理服务器。

参考资料

[1] https://en.m.wikipedia.org/wiki/Consistent_hashing

[2] http://michaelnielsen.org/blog/consistent-hashing/

[3] http://www8.org/w8-黄粱一梦papers/2a-webserver/caching/paper2.html

原文链接:https://leileiluoluo.com/posts/consistent-hashing-and-high-available-cluster-proxy.html

本文作者:磊磊落落的博客,原创授权发布。

二维码