云原生DaaS服务—分布式缓存简述

网友投稿 259 2022-10-07

云原生DaaS服务—分布式缓存简述

缓存是云原生架构应用系统中必不可少的模块,并且已经成为了高并发、高性能架构的一个关键组件和解决方案。数据缓存方案就是把常用的数据(不会经常更改的数据)、最近使用数据放到内存中,这样可以大幅度降低系统对硬件磁盘设备的操作开销,提高整个数据系统的性能。缓存能够有效降低对数据库的访问压力。

1、缓存解决的问题

提升性能:绝大多数情况下,数据库select操作是出现性能问题最集中的地方。一方面,select 会有很多像 join、group、order、like 等丰富的语义,而这些语义是非常消耗性能的;另一方面,大多数应用是读多写少,所以加剧了慢查询的问题。分布式系统中远程调用也会消耗很多性能,因为有网络开销会导致整体的响应时间变长。缓解数据库压力:当用户请求增多时,数据库的压力将大大增加,通过缓存能够大大降低数据库的压力,提升数据访问性能。

2、缓存的适用场景

并不是任何场景都需要使用缓存,一般来说,数据的缓存命中率超过60%时才有缓存数据的价值和必要。比如一些请求量较小的系统或者数据、频繁更新、读写比不高的数据,这些都没有必要使用缓存。否则,除了增加系统的复杂性,所带来的系统性能提升也非常有限。

缓存是通过牺牲强一致性来提升性能的,所以使用缓存提升性能,会有数据更新的延迟。这需要我们在设计时结合业务仔细思考是否适合用缓存,并且缓存一定要设置过期时间。这个时间太短或太长都不好,时间太短,请求可能会比较多地落到数据库上,这也意味着失去了缓存的优势;时间太长,缓存中的脏数据会使系统长时间处于延迟的状态,而且系统中长时间没有人访问的数据一直保存在内存中不过期,浪费内存。

常见的适合缓存的场景如下:

对于数据实时性要求不高的场景:读多写少,对于一些经常访问但是很少改变的数据,使用缓存就很有必要,比如一些应用配置项。对于性能要求高,并发量大的场景:比如一些秒杀、大促活动场景。

3、缓存常见在的问题

缓存穿透:缓存穿透是指收到一个请求,但是该请求在缓存中不存在(未命中),只能去数据库中查询,然后放进缓存。但当有许多请求同时访问同一个数据时,业务系统把这些请求全发送到数据库中;或者恶意构造一个逻辑上不存在的数据,然后大量发送这个请求,这样每次都会被发送到数据库中,最终导致数据库崩溃。对于恶意访问,一种思路是先做校验,直接过滤恶意数据,不要发送至数据库;另一种思路是缓存空结果,就是对查询不存在的数据也记录在缓存中,这样可以有效地减少查询数据库的次数。缓存雪崩:是指当我们给所有的缓存设置了同样的过期时间,某一时刻,整个缓存的数据全部过期了,那么瞬间所有的请求都被抛向了数据库,数据库就崩溃了。缓存刷新:即刷新缓存的策略,一般在insert、update、delete操作后就需要刷新缓存。如果不执行,就会出现脏数据。

4、常见的缓存方案

目前主流的开源缓存产品有EhCache、Memcache和Redis。EhCache直接在JVM虚拟机中缓存,速度快、效率高,但是缓存共享麻烦,集群分布式应用不方便,仅用于单个应用或者对缓存访问要求很高的应用。对于存在缓存共享、分布式部署、缓存内容很大的大型系统,一般选择Memcache或者Redis作为分布式共享缓存。Redis支持数据持久化存储,采用内存+硬盘的存储方式,在提供高速数据读写能力的同时满足数据持久化需求,支持从持久化数据库中读取数据加载到缓存数据库。

根据不同的应用场景,云厂商提供的分布式缓存产品一般包括单机版、主从版、集群版、读写分离版几种不同的产品形态,满足业务的不同需求。单机版一般只用在开发和测试环境,对性能和数据可靠性要求不高,以节省资源成本。正式的生产环境必须选择主从版或者集群版,以确保缓存的高性能、数据的安全可靠。

主从版:主从版由一主一备的两个Redis服务器组成,用户应用通过SLB链路直接访问主库。主从版系统工作时主节点(master)和副本(replica)数据实时同步。当主节点发生故障时,系统自动秒级切换,由备节点接管业务,全程自动且对业务无影响,主从架构保障系统服务具有高可用性。集群版:由3个组件构成:redis-config(CS)、redis- proxy(proxy)和redis。一个集群架构由多个CS节点、多个proxy节点、多个一主一备的redis节点构成。用户应用通过SLB链路访问到集群的proxy上,proxy将请求路由转发到对应的redis主库分片上执行。读写分离版:读写分离版本在集群架构基础上实现,提供更高的并发性能,一个redis主库除了对应一个备库,还对应多个只读的redis节点。proxy路由请求时,按照配置的只读节点权重路由只读请求到只读节点上。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中synchronized的几种使用方法
下一篇:基于eBPF技术的开源项目Kindling之探针架构介绍
相关文章

 发表评论

暂时没有评论,来抢沙发吧~