4.4.2 内存计算中分布式缓存体系

更新于 2026年10月10日 版权声明
4.4.2 内存计算中分布式缓存体系

在大数据应用中,经常要重复从数据库中取出相同的数据,这种重复极大地增加了数据库的负载,分布式缓存是解决这个问题的好办法。

图4⁃23是一个简单的分布式缓存系统。在用户第一次发送请求时,从RDBMS中获取数据并返回,同时将数据保存在分布式缓存系统中;当用户再次发送请求时直接从缓存中获取,以提高性能。

一般大数据应用场景下,80%的访问量都集中在20%的热数据上(适用二八原则)。因此,通过引入缓存组件,将高频访问的数据,放入缓存中,可以大大提高系统整体的承载能力,使得原有单层DB的数据存储结构,变为Cache+DB的数据存储结构,如图4⁃24所示。

通过在数据层引入缓存,可以提升数据读取速度,通过扩展缓存,提升系统承载能力,Cache+DB的方式可以承担原有需要多台DB才能承担的请求量,节省机器成本。

图示

图4⁃23 分布式缓存系统

图示

图4⁃24 Cache+DB数据存储

在大数据应用广泛应用的缓存系统有Memached、Redis、MongoDB等,下面简单介绍一下Redis缓存机制。

Redis是一款开源的、基于BSD许可的、高级键值对缓存和存储系统,在应用级缓存中的作用举足轻重,例如,新浪微博当前在使用并维护着可能是世界上最大的Redis集群。

Redis支持主从同步,数据可以从主服务器向任意数量的从服务器同步,从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树状复制。

由于完全实现了发布/订阅机制,因此数据库在任何地方同步树的时候,都可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

Redis 3.0版本加入cluster功能,解决了Redis单点无法横向扩展的问题。Redis集群采用无中心节点方式实现,无须proxy代理,客户端直接与Redis集群的每个节点连接,根据同样的哈希算法计算出key对应的slot,然后直接在slot对应的Redis上执行命令。

在Redis看来,响应时间是最苛刻的条件,增加一层带来的开销是不能接受的。因此,Redis实现了客户端对节点的直接访问,为了去中心化,节点之间通过gossip协议交换互相的状态,以及探测新加入的节点信息。(https://www.daowen.com)

Redis集群支持动态加入节点,动态迁移slot,以及自动故障转移。

图4⁃25为一个使用了Redis集群和其他多种缓存技术的应用系统架构。

图示

图4⁃25 基于Redis的多级缓存

首先,用户的请求被负载均衡服务分发到Nginx上,然后Nginx应用服务器读取本地缓存,如果本地缓存命中则直接返回。

Nginx应用服务器使用本地缓存可以提升整体的吞吐量,降低后端的压力,尤其应对热点数据的反复读取问题非常有效。

如果Nginx应用服务器的本地缓存没有命中,就会进一步读取相应的分布式缓存——Redis分布式缓存的集群,可以考虑使用主从架构来提升性能和吞吐量,如果分布式缓存命中则直接返回相应数据,并回写到Nginx应用服务器的本地缓存中。

如果Redis分布式缓存也没有命中的时候,则会回源到Tomcat集群。当然,如果Redis分布式缓存没有命中的话,Nginx应用服务器还可以再尝试一次读主Redis集群操作,目的是防止当从Redis集群有问题时可能发生的流量冲击。

在Tomcat集群应用中,首先读取本地平台级缓存,如果平台级缓存命中则直接返回数据,并会同步写到主Redis集群,然后再同步到从Redis集群。

此处可能存在多个Tomcat实例同时写主Redis集群的情况,可能会造成数据错乱,需要注意缓存的更新机制和原子化操作。

如果所有缓存都没有命中,系统就只能查询数据库或其他相关服务获取相关数据并返回,当然,人们知道数据库也是有缓存的。

整体来看,这是一个使用了多级缓存的系统。Nginx应用服务器的本地缓存解决了热点数据的缓存问题,Redis分布式缓存集群减少了访问回源率,Tomcat应用集群使用的平台级缓存防止了相关缓存失效或崩溃之后的冲击,数据库缓存提升数据库查询时的效率。正是多级缓存的使用,才能保障系统具备优良的性能。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)