- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一致性哈希应用于负载均衡的一致性哈希及java实现
应用于负载均衡的一致性哈希及java实现这几天看了几遍一致性哈希的文章,但是都没有比较完整的实现,因此试着实现了一下,这里我就不讲一致性哈希的原理了,网上很多,以一致性哈希用在负载均衡的实例来说,一致性哈希就是先把主机ip从小大到全部放到一个环内,然后客户端ip来连接的时候,把客户端ip连接到大小最接近客户端ip且大于客户端ip的主机。当然,这里的ip一般都是要先hash一下的。我的程序运行结果如下:? ??添加客户端,一开始有4个主机,分别为s1,s2,s3,s4,每个主机有100个虚拟主机:101客户端(hash:-3872430075274208315)连接到主机-s2-102客户端(hash:-6461488502093916753)连接到主机-s1-103客户端(hash:-3272337528088901176)连接到主机-s3-104客户端(hash:7274050343425899995)连接到主机-s2-105客户端(hash:6218187750346216421)连接到主机-s1-106客户端(hash:-8497989778066313989)连接到主机-s2-107客户端(hash:2219601794372203979)连接到主机-s3-108客户端(hash:1903054837754071260)连接到主机-s3-109客户端(hash:-2425484502654523425)连接到主机-s1-删除主机s2-的变化:hash(-8497989778066313989)改变到-s4-hash(7274050343425899995)改变到-s2-hash(-3872430075274208315)改变到-s4-hash(7274050343425899995)改变到-s1-增加主机s5-的变化:hash(1903054837754071260)改变到-s5-hash(1903054837754071260)改变到-s5-hash(-3272337528088901176)改变到-s5-最后的客户端到主机的映射为:hash(-8497989778066313989)连接到主机-s4-hash(-6461488502093916753)连接到主机-s1-hash(-3872430075274208315)连接到主机-s4-hash(-3272337528088901176)连接到主机-s5-hash(-2425484502654523425)连接到主机-s1-hash(1903054837754071260)连接到主机-s5-hash(2219601794372203979)连接到主机-s3-hash(6218187750346216421)连接到主机-s1-hash(7274050343425899995)连接到主机-s1-看结果可知:一开始添加到9个客户端,连接到主机s1,s2,s3,s4的客户端分别有3,3,3,0个,经过删除主机s2,添加主机s5,最后9个客户端分别连接到主机s1,s2,s3,s4,s5的个数为4,0,1,2,2.这里要说明一下删除主机s2的情况,hash尾号为9995的客户端先连接到s2,再连接到s1,为什么会出现这种情况呢?因为每一个真实主机有n个虚拟主机,删除s2却打印“hash(7274050343425899995)改变到-s2-”是因为删除了s2的其中一个虚拟主机,跳转到另一个虚拟主机,但还是在s2上,当然,这里是打印中间情况,以便了解,真实的环境是删除了s2后,所有他的虚拟节点都会马上被删除,虚拟节点上的连接也会重新连接到另一个主机的虚拟节点,不会存在这种中间情况。以下给出所有的实现代码,大家共同学习:public class ShardNode { // S类封装了机器节点的信息,如name、password、ip、port等static private TreeMapLong, Node nodes; // 虚拟节点到真实节点的映射static private TreeMapLong,Node treeKey; //key到真实节点的映射static private ListNode shards = new ArrayListNode(); // 真实机器节点private final int NODE_NUM = 100; // 每个机器节点关联的虚拟节点个数boolean flag = false;public Shard(ListNode shards) {super();this.shards = shards;init();}public static void main(String[] args) {//System.out.println(
文档评论(0)