美文网首页
37. 负载均衡:一致性哈希解决了哪些问题

37. 负载均衡:一致性哈希解决了哪些问题

作者: 木叶苍蓝 | 来源:发表于2023-07-24 14:18 被阅读0次

    在业务开发中,缓存服务需要满足高可用性,最常用的手段是集群扩展
    目前 Redis 流行的集群方案有 官方的Cluster方案,twemproxy 代理方案,哨兵模式,Codis 等方案。

    缓存集群的高可用

    假设缓存服务器有 3 台,每台缓存的数据是不同的。
    在更新缓存时,该放置在哪台机器上呢?
    根据 key 获取缓存时,该从哪台服务器上获取?

    在数据同步的方案下,所有节点之间的数据都是一样的,不同节点互为副本

    • 但会造成较多的服务器资源浪费
    • 在更新缓存数据时,还要考虑不同节点之间的一致性

    数据不同步的方案,每个缓存节点存储的数据不同,在缓存读写使用一定的策略进行分发
    如果需要冗余数据,可以通过缓存集群主从同步实现

    不同路由方案的扩容问题

    分库分表以后,当存储节点发生增加或减少时
    合理的配置分表策略,可以使得数据迁移最小

    哈希取模路由

    典型的操作—— 通过对缓存 hash (缓存的Key) / 节点数据
    哈希取模的方式,适合对固定数量的缓存集群进行路由,但是对横向扩展不友好。

    一致性哈希

    在负载均衡策略中,可以应用一致性哈希,减少节点扩展时的数据失效或者迁移的情况

    一致性哈希是一种特殊的哈希算法,在使用一致性哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中 K 是关键字的数量,n 是槽位数量。然而在传统的哈希表中,添加或删除一个槽位几乎需要对所有关键字进行重新映射。

    Hash 环的基本思路

    获取所有的服务器节点 hash 值,然后获取 key 的 hash,与节点的 hash 进行对比
    找出顺时针最近的节点进行存储和读取

    假设有4台换成服务器

    • A 服务器,地址 hash 结果是 100
    • B 服务器,地址 hash 结果是 200
    • C 服务器,地址 hash 结果是 300
    • D 服务器,地址 hash 结果是 400

    某条数据的 key 进行哈希操作,得到200 则存储 B 服务器
    某条数据的 key 进行哈希操作,得到260 则存储 C 服务器
    某条数据的 key 进行哈希操作,得到500 则存储 A 服务器

    如果 D 服务器下线,原先路由到 D 服务器的数据,只要顺时针迁移到 A 服务器就可以

    假设有 A, B, C ... J 总共10台服务器,组成一个 哈希环
    如果从 F 服务器一直到 J 服务器的 5 个节点宕机
    这 5 台 服务器原来的访问,都会被转移到服务器 A 之上,直到把 服务器 A 打爆
    这时候流量继续转移到 B 服务器上,出现 缓存雪崩

    以上问题属于 数据倾斜,如何解决数据倾斜呢?

    添加虚拟节点,对服务器节点进行哈希操作,在整个 哈希环上,均匀添加若干个节点
    比如 a1 , a2 都属于 A 节点,b1, b2 都属于 B 节点
    在 哈希时 可以平衡各个节点的数据

    如何实现一致性哈希???

    总结

    本文分享了应用缓存集群的知识点
    包括集群下的高可用,以及哈希取模和一致性哈希的负载均衡策略
    负载均衡在数据路由,API 网关,分布式服务调用中非常关键
    在服务调用中常用的负载均衡策略包括 轮询,随机,根据响应时间判断等

    相关文章

      网友评论

          本文标题:37. 负载均衡:一致性哈希解决了哪些问题

          本文链接:https://www.haomeiwen.com/subject/gignudtx.html