当前位置: 首页 > 科技观察

Redis混合存储-冷热数据识别与交换

时间:2023-03-22 14:44:25 科技观察

背景介绍Redis混合存储产品是阿里云自主研发的一款完全兼容Redis协议和特性的混合存储产品。通过将部分冷数据存储到磁盘,在保证大部分访问性能不下降的基础上,大大降低了用户成本,打破了内存对Redis单实例数据量的限制。其中,冷热数据的识别和交换是影响混合存储产品性能的关键因素。Redis混合存储中定义了冷热数据。内存与磁盘的比例可由用户自由选择:Redis混合存储实例将所有key视为热数据,以少量内存为代价保证所有key访问请求的性能。是高效和一致的。至于Value部分,当内存不足时,实例自身会根据最近访问时间、访问频率、Value大小等维度选择一些value作为冷数据,异步存储到磁盘中背景,直到内存小于指定的阈值。在Redis混合存储实例中,我们将所有的Key视为热数据存储在内存中,出于以下两个考虑:Keys的访问频率远高于Values。作为KV数据库,通常的访问请求需要搜索Key,确认Key是否存在。要确认一个key不存在,需要以某种形式检查所有Key的集合。将所有key保留在内存中,可以保证key的查找速度与纯内存版本完全一致。Key的大小比例很低。即使是普通的字符串类型,在通常的业务模型中Value也要比Key大数倍。对于Set、List、Hash等集合对象,所有成员组成的Value比Key大几个数量级。因此,Redis混合存储实例的适用场景主要有两个:数据访问不均、数据热点;内存不足以容纳所有数据,且Value较大(与Key相比)冷热数据识别当内存不足时,实例根据最近访问时间计算value的权重,访问frequency、valuesize等维度,将权重最大的value存入磁盘,并从内存中删除。伪代码如下:理想情况下,我们当然希望能够准确计算出当前最冷值。但是值的冷热是根据访问情况动态变化的,每次重新计算所有值的冷热权重的时间消耗是完全不能接受的。Redis本身会在内存满的时候按照用户设置的淘汰策略淘汰数据,将内存中的热点数据写入磁盘也可以看作是一个“淘汰”的过程。综合考虑性能、准确性和用户理解,我们采用类似Redis的近似计算方式进行数据冷热识别,支持多种策略,通过随机抽取一小部分数据来降低CPU和内存消耗,通过逐出池使用历史抽样有助于提高准确性的信息。上图是Redis近似淘汰算法在不同版本、不同样本数配置下的效率示意图。浅灰色点为淘汰数据,灰色点为未淘汰数据,绿色点为测试时新增数据。冷热数据交换Redis混合存储在冷热数据交换过程中在后台IO线程中完成。热数据->冷数据异步模式:主线程在内存接近最大值时产生一系列数据交换任务;后台线程执行这些数据交换任务,执行完成后通知主线程;主线程更新并释放内存值,将内存中数据字典中的值更新为简单的元信息;同步方式:如果写入流量过大,异步方式来不及换出数据,导致内存超过最大规格内存。主线程会直接执行数据交换任务,达到变相限流的目的。冷数据->热数据异步模式:在执行命令前,主线程先判断命令中涉及的值是否在内存中;如果没有,则产生数据加载任务,客户端被挂起,主线程继续处理其他客户端请求;后台线程执行数据加载任务,执行完成后通知主线程;主线程更新内存中数据字典中的值,唤醒之前挂起的客户端,处理它的请求。同步方式:在Lua脚本和具体命令执行阶段,如果发现有值存储在磁盘上,主线程会直接执行数据加载任务,保证Lua脚本和命令的语义不变。