http://blog.51cto.com/zero01/2115528
这篇文章讲的挺好!
我只是为了加深自己的理解,将其用自己的语言表述出来。
场景:
3万条数据缓存于3台服务器,本着负载均衡的理念,我们采用取模的方式,假设3万条数据经过hash算法形成均匀的数据,为1-30000,根据余数0、1、2将数据均匀的分为3个片段,分别存在每台服务器上。这样从服务器缓存取数据时,根据这条数据的hash值,取余,便可确定需要从哪个服务器上获取,这样便避免了遍历30000万条数据,效率提高了不少。
但当我们增加一台服务器或者减少一台服务器,便会出现严重问题。
当增加、减少服务器,仍采用上述取模算法时,必然要重新分配,大量移动。由此带来了服务器某一时刻负载过大或者或者找不到存在服务器上的数据的问题。
解决这个困境便是hash一致性算法,redis分布式算法
最核心的地方便在与:把服务器与数据进行hash运算,根据hash值分配在一个hash空间中,这个空间的大小是0-2^32-1,然后首尾相连形成一个环形。
根据就近原则和顺时针,将数据都映射到邻近服务器上。如果添加或减少服务器,只有服务器相邻的数据发生变化,影响并不太大。
但这样并不能保证服务器均匀的分配在环形中,会出现数据倾斜问题,于是采用了虚拟节点,每台服务器都有几个虚拟节点,将所有服务器的虚拟节点均匀的分布在环形空间中,这些虚拟节点映射实际服务器,这样便有效的解决了数据倾斜问题。
Consistent hashing 命中率计算公式:
(1 - n / (n + m)) * 100%
佩服作者将redis分布式算法讲的这么透彻易懂,更佩服那些创造这些算法的人。
冰,水为之,而寒于水。