软考-分布式数据库缓存设计分析
摘要:某初创企业在业务快速增长后遭遇数据库性能瓶颈。针对系统优化方案,团队提出三种方案:张工主张重构系统,李工建议采用MemCache缓存,刘工推荐Redis方案。经讨论最终选用Redis,因其兼具高性能和数据可靠性。分析比较了MemCache与Redis的差异,包括数据类型支持、持久化能力等特性。重点阐述了Redis的数据同步机制及三种分布式存储方案(主从模式、哨兵模式、集群模式),并详细说明了
一、场景
某企业是为城市高端用户提供高品质蔬菜生鲜服务的初创企业,创业初期为快速开展业务,该企业采用轻量型的开发架构(脚本语言 + 关系型数据库)研制了一套业务系统。业务开展后受到用户普遍欢迎,用户数和业务数量迅速增长,原有的数据库服务器已不能满足高度并发的业务要求。为此,该企业成立了专门的研发团队来解决该问题。
张工建议重新开发整个系统,采用新的服务器和数据架构,解决当前问题的同时为日后的扩展提供支持。但是,李工认为张工的方案开发周期过长,投入过大,当前应该在改动尽量小的前提下解决该问题。李工认为访问量很大的只是部分数据,建议采用缓存工具 MemCache 来减轻数据库服务器的压力,这样开发量小,开发周期短,比较适合初创公司,同时将来也可以通过集群进行扩展。然而,刘工又认为李工的方案中存在数据可靠性和一致性问题,在宕机时容易丢失交易数据,建议采用 Redis 来解决问题。经过充分讨论,该公司最终决定采用刘工的方案。
二、问题
2.1、问题1
在李工和刘工的方案中,均采用分布式数据库缓存技术来解决问题。请用100字以内的文字说明分布式数据库缓存的基本概念。
表中对 MemCache 和 Redis 两种工具的优缺点进行了比较,请补充完善表 4-1 中的空(1)~(6)。

2.2、问题2
刘工认为李工的方案存在数据可靠性和一致性的问题,请用100字以内的文字解释说明。
为避免数据可靠性和一致性的问题,刘工的方案采用 Redis 作为数据库缓存,请用200字以内的文字说明基本的 Redis 与原有关系数据库的数据同步方案。
2.3、问题3
请用300字以内的文字,说明 Redis 分布式存储的两种常见方案,并解释说明 Redis 集群切片的几种常见方式。
三、解析
3.1、问题1
3.1.1、什么是分布式缓存?
通俗解释:关系型数据库如MySQL,就像是超市的大仓库,容量大,账目准,但是进出货(读写)慢。当遇到流量高峰时,超级多用户同时来查询生鲜的价格,大仓库根本反应不过来,超市就瘫痪了。
如何解决?在大仓库前面加一个“前置展示柜”(内存缓存)。把大家查的最多的热门商品信息直接放在展示柜里,用户来了直接看展示柜,速度快。所谓的分布式,就是因为一个展示柜不够放,多放几个展示柜来共同分担查询压力,这就是(多台缓存服务器集群)。
3.1.2、MemCache vs Redis 怎么选?
① 数据类型:MemCache只能存简单的key-value;Redis支持List、Set、String、key-value、sorted等多种数据类型,因此可以直接在缓存里做排行榜或者去重等复杂操作。
② 持久化:MemCache数据全在内存里,宕机之后全部丢失;Redis可以把内存里的数据定期的保存快照或者操作日志持久化到磁盘里,重启之后可以恢复。
③ 分布式存储:MemCache本身是单机软件,如果要开启分布式存储借助客户端Hash。Redis自己有主从、哨兵、集群等分布式实现方案。
④ 多线程支持:MemCache支持多线程;Redis在5.0版本及之前是不支持的。
⑤ 内存管理:MemCache通过Slab Allocation机制,提前把内存分割成固定大小的块,放数据的时候会选择最合适的块塞进去,以此防止内存碎片化;Redis不会提前规划。
⑥ 事务支持:MemCache完全不支持事务;Redis提供了有限的支持比如MULTI、EXEC指令组合。
3.2、问题2
3.2.1、为什么 MemCache 存在数据可靠性问题?
通俗理解:MemCache本身是不支持数据持久化的。一旦系统重启,热点缓存数据就是丢失,瞬间所有的请求就会打到数据库里,造成数据库的奔溃。这就是缓存雪崩的问题。Redis可以持久化数据,系统重启也能恢复,所以数据更加可靠。
3.2.2、Redis 与数据库的“数据同步方案”
① 读数据:先查询缓存里的数据,有就查出来;如果缓存里没有就去查数据库,查出来之后,把数据写入到Redis里,方便下一次查询可以直接查出来。
② 写数据:要先写数据库,改完之后事务提交,然后清理缓存中的旧数据或者更新缓存中的旧数据。
3.3、问题3
3.3.1、Redis 分布式存储方案
① 主从模式:一台机器扛不住大量的读写,于是高一个主节点和几个从节点,只有主节点能写数据,从节点只能读数据,并且从节点的数据必须是从主节点同步过去。痛点是主节点挂了,系统就不能写数据了,必须手动升级一个从节点为主节点。
② 哨兵模式:为了解决主从模式的痛点,增加一些哨兵节点,哨兵节点负责监控主节点是否失效,如果主节点挂了,哨兵节点就从从节点里投票选举出一个新的主节点。虽然解决高可用的痛点,但还是有一个痛点,就是还是只有一个主节点能写,数据量大到主节点扛不住怎么办?
③ 集群模式:数据量太大时,需要把主节点切分fan成多个主节点,然后每个主节点带着自己管理的从节点来防灾。这样既能无限扩容,也可以高可用。
3.3.2、Redis 集群切片的三种方式
① 客户端实现分片:分区逻辑在客户端,采用一致性哈希来决定Redis节点。
② 中间件实现分片:在应用和Redis中间,用中间件实现服务到后台Redis节点的路由分派,如Twemproxy,Codis。
③ 客户端服务端协作实现分片:客户端采用一致性哈希,服务端提供错误节点的重定向服务。
四、答案
【问题1】 分布式数据库缓存指的是在高并发环境下,为了减轻数据库压力和提高系统响应时间,在数据库系统和应用系统之间增加的独立缓存系统。 (1)key/value, list, set, string, sorted 或 丰富/多种数据结构 (2)不支持 (3)客户端哈希分片/一致性哈希 (4)Redis5.0及以前版本不支持 (5)有,私有内存池 (6)不支持
【问题2】 (1)MemCache没有持久化功能,所以掉电数据会全部丢失,而且无法直接恢复,这存在可靠性问题。 (2)MemCache不支持事务,所以操作过程中可能产生数据的不一致性。 同步方案: 读取数据时,先读取Redis中的数据,如果Redis没有,则从原数据库中读取,并同步更新Redis中的数据。写回时,写入到原数据库中,并同步更新至Redis中。
【问题3】 Redis分布式存储的常见方案: 1、主从模式 (Master/Slave) 2、哨兵模式 (Sentinel) 3、集群模式 (Cluster) Redis集群切片的常见方式: 1、客户端分片,即在客户端就通过key的hash值对应到不同的服务器。 2、中间件实现分片。在应用软件和Redis中间,例如:Twemproxy、Codis等,由中间件实现服务到后台Redis节点的路由分派。 3、客户端服务端协作分片。Redis Cluster模式,客户端可采用一致性哈希,服务端提供错误节点的重定向服务slot上。不同的slot对应到不同服务器。
更多推荐
所有评论(0)