• 一致性哈希算法的思考


    可能的实现:服务器ip经过hash后对2^32求余,服务器在hash环上的散列通过hash函数实现。缓存对象或者一个请求(请求的源地址)经过hash对2^32求余落在hash环上,顺时针寻找第一个可用服务器。

    可能的java代码实现:用数组存ip地址,下标为ip hash求余后的数。

    一致性哈希算法的用处“负载均衡”。这里的负载均衡可以是:

    1.数据库横向切割。

    2.缓存(如Redis),的负载均衡

    3.服务器的负载均衡

    思考1:为什么使用一致性哈希算法。(而不用普通的hash然后求余)

    答:假设有5个Redis实例,某个对象hash以后为13,则求余以后分配到第3个Redis实例中,当为了增加Redis的容量而将Redis扩展到6个实例的时候,原来的对象hash13对6求余会落在第2个实例上,导致缓存失效解决缓存失效的办法就是对全局的数据进行重hash,但是这个代价太大。如果使用一致性hash,那么只需要对映射到新增节点到上一个节点之间的数据重新分配。对数据库的横向切割是用一个道理,对服务器来说没有影响(请求第二个服务器和第三个没有区别)

    思考2:虚拟节点的作用

    答:

    1.如果集群中的节点数量太少,有可能所有的数据都在一个节点上。例如只有两个节点,均分的情况下,很有可能会所有的数据都存到一个节点上(有节点未使用)。通过增加虚拟节点,对环上的大块的段进行分割,一个大块的段上的数据可以映射到不同的Redis实例上。

    2.假设使用三个节点,每个节点的计算机资源(内存,cpu等)使用情况都为K/2。那么当第1个节点失效以后,它的数据会重新分配在顺时针的下个节点(第二个节点上),第二个节点的计算机的资源使用量会达到上限K从而很有可能down掉,依次影响下一个节点导致整个集群宕机(缓存雪崩)。解决的办法是增加虚拟节点:具体就是在第1个节点和第2个间增加第3个节点的虚拟节点,这样当第1个节点宕掉以后,第1个节点到虚拟节点的数据会被映射到第3个节点,虚拟节点到第2个节点的数据会被映射到第2个节点。即第2和第3个节点分摊了第1个节点的压力。

     

  • 相关阅读:
    CentOS 8下安装hadoop-3.3.0
    c# log4net安装时在AssemblyInfo中提示找不到log4net解决办法
    C#自定义类型数组排序
    C#中的隐藏方法
    VBA 按列查找小工具类似lookUp函数
    欢迎来到网络对抗路 实验八 Web综合
    利用GMSSL中ZUC算法实现对序列密码的结构性检测(代码)
    第二十一章学习笔记
    欢迎来到网络对抗路 实验七 网络欺诈防范
    数据转换考试qwq
  • 原文地址:https://www.cnblogs.com/coderlynn/p/9313736.html
Copyright © 2020-2023  润新知