热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

一致性哈希算法的优化关于如何保正在环中增

  我们知道,在没有对数据做冗余存储的情况下,无论是一致性哈希还是求余数分布式算法,在新增或删除



 


背景

 


09

年初,我们做了一个


memcached


的智能客户端库,业务只要将这个库链上,就能跟


memcached


服务器通信。并且实现了一致性哈希的分布式算法,后端


memcached


服务器可以无限制扩展,而且客户端能对


memcached


做自动故障转移以及恢复。



我们知道,在没有对数据做冗余存储的情况下,无论是一致性哈希还是求余数分布式算法,在新增或删除

memcached


节点时,命中率都会不同程度的降低。本文旨在解决当新增


memcached


节点时,如何保证命中率不变。


 

 


基本原理

 





新增一个

memcached


节点时,将该新节点的下一个节点的且属于该新节点的数据迁移过来。


 


上面的这个基本原理读起来可能会比较拗口,容我下面详细说明。

 

 


原理描述

 


如图

1


所示,假设当前哈希环上有


n





memcached


节点,记为


M



1


~M


n


,存储到这些节点上的数据的有效期都是一致的,记为

T



e


。因此从图

1


可以看出,从



M


1





M


k


区间的数据均从

M



k


上存取。比如数据

K



1




K



2




K



n





         


                  

一致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响



    


                                                                            图1


当新增节点


M


x


时,如图

2


所示。



                  


                     

一致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响



                   


                                                                              图2


此时数据


K


1




K



2


从新节点


M


x


读取不到的,但节点


M


k


存储了这些数据,我们需要做的就是将这些数据迁移到新节点


M


x




 


具体做法是:将新加入的节点


M


x


标记为

N





New


)状态,表示该节点是新增的。在


N


状态下读取数据


K



1


的步骤为:


1)





M


x


读取数据,如果读取得到,则返回,否则进行

2


);



2)





M


k


读取数据,如果读取不到,则返回,否则进行

3


);



3)


将读取到的数据

K



1


写入


M


x





4)




K



1





M


k


删除;

 




N


状态下,不断进行上面的


4


个步骤


 


因为数据的有效期是

T



e


,所以在经过

T



e


时间后,


M


k


上的数据随之自动失效了,此时将


M


x


标记为

O





Old


)状态,在


O


状态下,如果读取不到数据也立即返回,无需再次到它下一个节点尝试读取。



一致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响




推荐阅读
  • 在分布式系统中,当多个服务器共同提供服务时,如何高效地将请求路由到正确的服务器是一个关键问题。传统的方法如简单哈希取模在服务器数量变化时会导致大量数据迁移。本文探讨了一致性哈希算法如何有效解决这一问题,确保系统的稳定性和高效性。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • 成为一名高效的Java架构师不仅需要掌握高级Java编程技巧,还需深入理解JVM的工作原理及其优化方法。此外,对池技术(包括对象池、连接池和线程池)的应用、多线程处理、集合对象的内部机制、以及常用的数据结构和算法的精通也是必不可少的。同时,熟悉Linux操作系统、TCP/IP协议栈、HTTP协议等基础知识,对于构建高效稳定的系统同样重要。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • magent是一款开源的Memcached代理服务器软件,其项目网址为:  http:code.google.compmemagent  一、安装步骤& ... [详细]
  • 安装MemcachedMemcached整理安装PythonMemcachedAPIpython操作啊Memcached使用Python-memcached模块下载安装:https ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
author-avatar
wyyxit
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有