zl程序教程

您现在的位置是:首页 >  其他

当前栏目

一致性哈希和哈希槽使用场景对比

2023-03-15 22:08:17 时间

        一致性哈希和哈希槽是分布式缓存集群系统常用的两种算法,本文不会再介绍这两种算法,感兴趣的可以阅读参考博文。本文想在此基础上分析下两种算法使用场景的差异。

       在参考博文4中给了一个示例:

上图为一致性hash算法中的四个节点A、B、C、D,现在假设B失效了:

        文中提到:如果B失效了,那么如果有持久化存储的,需要做数据恢复,将B的数据迁移至C即可,对于原本散列在A和D的数据,不需要做任何改变

        这里,个人感觉单纯的一致性哈希算法不适合作为需要持久化存储的集群算法,原因有二:

        第一,如果一台机器失效了,往往意味着无法与其建立通讯,又如何能做自动的数据迁移?

        第二,数据迁移需要时间,如何保证迁移期间缓存集群的可用性?

        因而个人认为,单纯的一致性哈希算法比较适合做内存存储的集群缓存算法。当机器失效后,机器上的缓存数据直接“丢失”,当该机器上原本缓存的数据被请求时,会从数据源重新获取数据,并将数据添加到失效机器后面的机器(示例中的C)。当然,这个过程即所谓的“缓存抖动”。

        相反,哈希槽算法倒适合做持久化存储的集群缓存算法,因为哈希槽是采用一主多从的机制,master宕机之后,slaver机器会顶上,因而不存在数据丢失。哈希槽算法的图示如下:

        另外,哈希槽算法实现比一致性哈希算法相对简单,而一致性哈希算法的灵活性相对更高。

        最后,我想说的是,其实完全可以将一致性哈希算法和哈希槽进行融合,利用哈希槽的优点弥补一致性哈希的不足:在一致性哈希的示例中,A、B、C、D是四台单独的机器,而如果我们将A、B、C、D都改成由类似哈希槽的主从机制,那么改造的一致性哈希算法也可以用于做持久化存储的集群算法。

参考博客:

1. https://www.jianshu.com/p/fa623e59fdcf 哈希槽

2. https://www.jianshu.com/p/4163916a2a8a 一致性哈希和哈希槽对比

3. https://www.cnblogs.com/xifenglou/p/9173419.html Redis Cluster集群

4. https://www.cnblogs.com/color-my-life/p/5799903.html 一致性哈希算法

5. http://www.zsythink.net/archives/1182 白话解析:一致性哈希

6. https://www.jianshu.com/p/ccb17daed766 深入理解tair

7. https://www.jianshu.com/p/84dbb25cc8dc 深入剖析Redis - Redis集群模式搭建与原理详解