文章目录
本文内容:
Redis分布式寻址算法
在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?如何动态增加和删除一个节点?
hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) Redis cluster 的 hash slot 算法
hash 算法
来了一个 key,首先计算 hash 值,然后对节点数取模,接着打在不同的 master 节点上。缺点也很明显:某一个 master 节点宕机,所有请求过来,都会基于最新的剩余 master 节点数去取模,尝试去库中取数据进行缓存。这会导致大部分的请求过来,全部无法拿到有效的缓存,导致大量的流量涌入数据库。
一致性 hash 算法
将整个 hash 值空间组织成一个虚拟的圆环,整个空间按顺时针方向组织,下一步将各个 master 节点(使用服务器的 ip 或主机名)进行 hash。来了一个 key,首先计算 hash 值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,遇到的第一个 master 节点就是 key 所在位置,这样就能确定每个节点在其哈希环上的位置。在一致性哈希算法中,如果一个节点挂了,受影响的数据仅仅是此节点到环空间前一个节点(沿着逆时针方向行走遇到的第一个节点)之间的数据,其它不受影响。增加一个节点也同理。 虚拟节点:一致性哈希算法在节点太少时,容易因为节点分布不均匀而造成缓存热点的问题。为了解决这种热点问题,一致性 hash 算法引入了虚拟节点机制,即对每一个节点计算多个 hash,每个计算结果位置都放置一个虚拟节点。这样就实现了数据的均匀分布,负载均衡。
hash slot 算法
Redis cluster 有固定的 16384 个 hash slot,slot是槽的概念(理解为数据管理和迁移的基本单位),所有的键根据哈希函数映射到 0~16383 整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据。 公式:slot = CRC16(key)& 16384。解释:对每个 key 计算 CRC16 值,然后对 16384 取模,可以获取 key 对应的 hash slot。hash slot可以像磁盘分区一样自由分配槽位,在配置文件里可以指定,也可以让redis自己选择分配,结果均匀,这种结构很容易添加或者删除节点。如果增加一个节点,就需要从节点已有的节点 获得部分槽分配到新的节点 上。如果想移除已有的一个节点,需要将节点中的槽移到其他节点上,然后将没有任何槽的节点从集群中移除就可以了。由于缓存的key hash结果是和slot绑定的,而不是和服务器节点绑定,所以节点的更替只需要迁移slot即可平滑过渡。从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
总结
以上就是今天要讲的内容,还希望各位读者大大能够在评论区积极参与讨论,给文章提出一些宝贵的意见或者建议📝,合理的内容,我会采纳更新博文,重新分享给大家。