java 两台机器时间不一致怎么处理_算法总结:左神class6—4一致性哈希解决服务器集群负载均衡问题...

【经典服务器服务】(一般应用在服务器集群上 用以实现数据缓存):

       前端为无差别服务器,收到大量用户请求,后台的服务器如何进行储存和处理呢?

使用哈希---计算出对应哪个服务器处理----查询时---计算哈希(前端所有机器带相同一份的哈希code,%后端机器个数)---去找对应的服务器去查找(前端服务器负载非常均衡)

56cca672278cdc9757cbfaa6880a651a.png

【题目】

      工程师常使用服务器集群来设计和实现数据缓存,以下是常见的策略:

l.无论是添加、查询还是删除数据,都先将数据的id通过哈希函数转换成一个哈希值,记为key。

2.如果目前机器有N台,则计算key%N 的值,这个值就是该数据所属的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行。

【经典服务器服务带来问题】:

       题目中描述的缓存策略的潜在问题是如果增加或删除机器时(N变化)代价会很高,所有的数据都不得不根据id重新计算一遍哈希值,并将哈希值对新的机器数进行取模操作,然后进行大规模的数据迁移。

       大面积的数据重新哈希的问题,主要从下面2个方向去考虑的,当节点宕机时,数据记录会被定位到下一个节点上,当新增节点的时候 ,相关区间内的数据记录就需要重新哈希。

       为了解决这些问题,下面介绍一下一致性哈希算法,这是一种很好的数据缓存设计方案。能够把数据迁移的代价变得很低,同时又负载均衡。

假设数据的id通过哈希函数转换成的哈希值范围是2^32,也就是0~(2^32)-1的数字空间中。将这些数字头尾相连,想象成一个闭合的环形,那么一个数据id在计算出哈希值之后认为对应到环中的一个位置上,如图所示。(整个环覆盖所有哈希域)

f851c100d3c446434cf6a82770bc63ad.png

     接下来三台机器在环中的位置根据机器 ip计算出的哈希值来决定。首先把该数据的 id 用哈希函数算出哈希值, 并映射到环中相应的位置,然后顺时针找寻离这个位置最近的机器,那台机器就是该数据的归属 。requst通过二分方式顺时针找到第一个大于等于哈希值的位置,也就是最近的机器。

c75b8614ca25d2d03b82e853b3fa727e.pnge6b5757888b83c3e25899205ec0b5181.png

        data1 根据其 id 计算出的哈希值为 key1,顺时针的第一台机器是machine2,所以 data1 归属 machine2。同理, data2 归属 machine3, data3 和 data4 都归属 machine1。

【一致性哈希结构】增加机器时候的处理方法:

       假设有两台机器(ml、m2)和三个数据(datal、data2、data3),数据和机器在环中的结构如图所示。

2dfa20bc918160b744de36365b16e4b5.png

       如果此时想加入新的机器m3,哈希映射算出机器m3的id在ml与m2右半侧的环中,那么发生的变化如图所示。

ccd2a059ef0fb2fb5bad7140a4a36953.pngea91ffe20b66ef543e14595287a14e20.png

        在没有添加m3之前,从ml到现在m3位置上的这一段是m2掌管范围的一部分;添加m3之后则统一归属于m3,同时要把这一段旧数据从m2迁移到m3上.由此可见,添加机器时的调整代价是比较小的。(机器较少时,无法负载均衡)

      在删除机器时也一样,只要把要删除机器的数据全部复制到顺时针找到的下一台机器上即可。比如,要在上一图中删除机器m2,m2上有数据data2,那么只用把 data2迁移到ml上即可。

      【 机器负载不均时的处理】如果机器较少,很有可能造成机器在整个环上的分布不均匀, 从而导致机器之间的负载不均衡,如下图所示的两台机器, m1 可能比 m2 面临更大的负载。

8fd1acb72346be12f31b7a20b2053e86.png

【负载均衡问题(虚拟节点技术)】
       虚拟节点机制,即给每个机器通过不同的哈希函数计算出多个哈希值,对多个位置都放置一个服务节点,称为虚拟节点。不让每个机器的ip去抢位置,而是给他们分别分配固定个数虚拟节点。

    具体做法可以在机器ip或者主机名的后面增加编号或者端口号来实现。准备路由表(从真实物理机器查找他有哪些虚拟节点,也可以反查)。由虚拟节点来抢环上的位置。虚拟节点负责的域,由对应的物理机器负责处理。

       举例解释,三个物理机器,每个机器分配1000个虚拟节点,让3000虚拟节点去抢整个哈希域组成环中的位置。每个机器抢到的1000个节点位置对应的域交给对应物理机器处理,则抢完之后每个机器需要处理的数据域几乎差不多。加入一个新机器后,将机器的1000个虚拟节点去抢环中的位置。如果减少一个机器,就减少1000个虚拟节点环的位置。这样就实现了负载均衡。

       节点数变多了,根据哈希函数性质,平衡性自然会变好。一致性哈希常用于负载均衡  分布式  服务器~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值