分布式缓存的路由算法是如何实现的?

简介: 所谓分布式对象缓存是指对对象缓存以一个分布式集群的方式对外提供服务,多个应用系统使用同一个分布式对象缓存提供的缓存服务。这里的缓存服务器是由多台服务器组成。这些服务器共同构成了一个集群对外提供服务,所以使用分布式对象缓存一个重要的问题就是,数据进行读写操作的时候,如何找到正确的缓存服务器进行读写操作。如果第一次写入数据的时候写入的是A服务器,但是数据进行缓存读取操作的时候访问的是B服务器,就不能够正确的查找到数据,缓存也就没有效果。

所谓分布式对象缓存是指对对象缓存以一个分布式集群的方式对外提供服务,多个应用系统使用同一个分布式对象缓存提供的缓存服务。这里的缓存服务器是由多台服务器组成。这些服务器共同构成了一个集群对外提供服务,所以使用分布式对象缓存一个重要的问题就是,数据进行读写操作的时候,如何找到正确的缓存服务器进行读写操作。如果第一次写入数据的时候写入的是A服务器,但是数据进行缓存读取操作的时候访问的是B服务器,就不能够正确的查找到数据,缓存也就没有效果。

那么如何才能找到正确的缓存服务器呢?

当需要进行分布式缓存访问的时候,依然是以Key、value这样的数据结构进行访问的。比如Memcached提供的一个客户端API程序进行访问,客户端API程序会使用自己的路由算法进行路由选择,选择其中的某一台服务器,找到这台服务器的IP地址和端口以后,通过通讯模块和响应的服务器进行通信。

因为进行路由选择的时候,就是使用缓存对象的key进行计算,下次使用相同的key,使用相同路由算法进行计算,算出来的服务器依然还是前面计算出来这个服务器,所以通过这种方法可以访问到正确的服务器进行数据读写。服务器越多,提供的缓存空间就越大,实现的缓存效果也就越好。

那么,路由算法又是如何进行服务器路由选择的呢?

主要算法是哈希表的路由算法,也就是取模算法。

例如,我们这里缓存服务器集群有3台服务器,key的哈希值对3取模得到的余数一定在0、1、2三个数据之间,那么每一个数字都对应一台服务器,根据这个数字查询对应的服务器IP地址就可以了。这种取模算法进行路由计算非常简单,但是这个算法有一个问题,就是当服务器扩容个到时候,比如当前的缓存服务器集群有3台服务器,再添加1台的时候,这个时候就会由对3取模变为对4取模,导致的后果就是对3取模的时候写入的数据,对4取模的时候可能就查不到了。如果缓存查不到了之后,就会去数据库里查找。这样就会出现类似缓存雪崩现象。

对于这个路由算法,也可以使用一致性哈希算法。

一致性哈希算法与取余哈希算法不同,一致性哈希是有一个一致性哈希环构成。一致性哈希环的大小是0-2的32次方减1。这个取值范围的0和最后一个值2的32次方减1收尾相连,就构成了一个一致性哈希环。
image.png

分布式缓存的路由算法是如何实现的?
对每个服务器的节点取模,求它的哈希值并把这个哈希值放在环上,所有的服务器都取哈希值放到环上,每一次进行服务器查找路由计算的时候,把key也取它的哈希值,取到的哈希值以后把key放到环上,顺时针查找距离它最近的服务器的节点是哪一个。通过这种方式可以实现,key不变的情况下找到的总是相同的服务器,这种一致性哈希算法除了可以实现像余数哈希一样的路由效果,对服务器的扩容效果比较好。

在一致性哈希环上进行服务器扩容的时候,新增加一个节点不需要改动前面取模算法的除数,导致最后的取值结果全部混乱,它只需要在哈希环里根据新的服务器节点的名称计算它的哈希值,把哈希值放到这个环上就可以。放到环上后,不会影响原先节点的哈希值,也不会影响到原先服务器在哈希环上的分布,只会影响到离它最近的服务器。这样的话对缓存的影响也比较小,它值会影响缓存里的一小段。对于这个一小段的数据,可以从数据库中读取,而数据库的压力只要在它的负载能力之内,也不会崩溃,系统就可以正常运行。所以通过一致性哈希算法可以实现缓存服务器的顺利伸缩扩容。

但是一致性哈希算法也有缺点,哈希值是一个随机值,把随机值放到一个环上,可能是不均衡的,也就是说某两个服务器可能距离很近,而和其他的服务器距离很远,这个时候就会导致有些服务器的负载压力特别大,有些服务器的负载压力特别小。

对于这个问题,改进办法就是使用虚拟节点,我们把一个服务器节点放入到一致性哈希环上的时候,并不是把真实的服务器的哈希值放到环上,而是将一个服务器虚拟成若干个虚拟节点,把这些虚拟节点的hash值放到环上。实践中一把一个服务器节点虚拟成200个虚拟节点,然后把200个虚拟节点放到环上。key依然是顺时针的查找距离它最近的虚拟节点,找到虚拟节点以后,根据映射关系找到真正的物理节点。

目录
相关文章
|
3月前
|
缓存 算法 NoSQL
【分布式详解】一致性算法、全局唯一ID、分布式锁、分布式事务、 分布式缓存、分布式任务、分布式会话
分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。强一致性(strong consistency):任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。单调一致性(monotonic consistency):任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。
406 0
|
12天前
|
存储 分布式计算 负载均衡
分布式(计算机算法)
分布式(计算机算法)
|
1月前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
深度思考:雪花算法snowflake分布式id生成原理详解
|
1月前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
108 2
 分布式ID生成系统之雪花算法详解
|
2月前
|
存储 分布式计算 负载均衡
浅谈分布式共识算法概念与演进
浅谈分布式共识算法概念与演进
43 0
|
2月前
|
分布式计算 算法
分布式系统设计之共识算法—2PC、3PC、 Paxos
分布式系统设计之共识算法—2PC、3PC、 Paxos
44 1
|
3月前
|
存储 算法 NoSQL
分布式一致性与共识算法(一)
分布式一致性与共识算法(一)
62 0
|
4月前
|
消息中间件 算法 Java
三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!
|
4月前
|
算法 网络协议 网络架构
【网络层】动态路由算法、自治系统AS、IP数据报格式
【网络层】动态路由算法、自治系统AS、IP数据报格式
35 0
|
4月前
|
存储 算法 安全
【云计算与大数据技术】数据分片哈希算法、路由算法、复制算法的讲解(图文解释 超详细)
【云计算与大数据技术】数据分片哈希算法、路由算法、复制算法的讲解(图文解释 超详细)
84 0