美文网首页数据结构与算法
一致性hash的一些问题

一致性hash的一些问题

作者: 宋大壮 | 来源:发表于2019-03-06 12:40 被阅读0次

    简介

    一致性hash算法解决的核心问题是,当solt数发生变化的时候能够尽量少的移动数据。该算法最早在《Consistent Hashing and Random Trees:Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》一文中被提出。它能够在添加/移除一台缓存服务器的时候,尽可能小的改变已存在key的映射关系,避免大量key的重新映射。
    关于其原理网上已经有很多了,所以这边文章不会再描述其实现原理,而是着重记录一些一致性hash实现中遇到的一些问题和解决方案。

    cache的hash计算

    一般的方法可以使用 cache 机器的 IP 地址或者机器名作为hash 输入。

    数据倾斜

    一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。例如系统中只有两台服务器,其环分布如下


    两个节点

    此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点。

    增加虚拟节点

    虚拟节点均匀分布

    这就要由hash算法来保证了,均匀分布是概率上的均匀,当虚拟节点足够时,就能保证大概均匀了。

    缓存命中率及单一热点问题

    一致性哈希解决的是某节点宕机后缓存失效的问题,只会导致相邻节点负载增加。但是因为宕机后需要重新从数据库读取,会导致此时缓存命中率下降及db压力增加。
    也无法避免单一热点问题。某一数据被海量请求,不论怎么哈希,哈希环多大,数据只存在一个节点,早晚有被打垮的时候。

    此时的解决策略是每个节点主备或主主集群。

    hash漂移

    某个节点失效了,缓存都漂到下个节点了;然后一会它又恢复了,这时候它就有脏数据了。
    解决办法一是每个节点引入集群。
    不用集群想彻底解决这个问题,可能需要引入第三方健康检查组件,如Consul,发现节点不稳定立即删除下线。

    相关文章

      网友评论

        本文标题:一致性hash的一些问题

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