数据缓存

通过合理设置LRU和TTL策略,并利用缓存预热功能对指定的数据(Table或Partition)进行预热,可以有效地管理缓存数据,从而提升云数据库 SelectDB 版的访问速度。本文为您介绍云数据库 SelectDB 版的数据缓存功能。

不同的业务场景,数据进入缓存的方式不同。

  • 导入数据:新导入的数据将异步写入缓存,以加速首次访问的速度。

  • 查询数据:若查询的数据不在缓存中,将从远程存储读取到内存,并最终写入本地硬盘缓存,以便于下次查询使用

  • 新建集群:远端存储的数据可以在多个集群之间共享,但缓存不可共享。在新建集群时,缓存中没有数据。您可以通过主动预热的方式,使集群迅速从远端存储读取所需数据,并将其写入本地缓存。如何主动预热,可参见使用缓存预热示例

缓存策略

云数据库 SelectDB 版的缓存支持LRU(Least Recently Used)和TTL(Time To Live)两种策略,您可通过调整表的参数来控制表的缓存策略。

缓存策略

适用场景

说明

LRU策略

LRU是云数据库 SelectDB 版数据库表默认的缓存策略。

该策略可以满足您大多数的场景。

缓存将为采用该策略的数据维护一个队列。

当查询命中缓存队列中的某一块数据,相关数据将被移动至队列的队首位置。

当有新数据写入缓存时,这些数据将放置于队首,以避免过早被淘汰。

当缓存数据达到满载时,将优先淘汰队列尾部的数据。

TTL策略

当数据总量显著超出缓存容量,并且数据中某些部分的优先级明显高于其他部分时,可以使用此策略。

例如,数据库中10个表的总数据量为1TB,而购买的缓存缓存容量为200GB,无法满足对全部数据的缓存需求。但是某个表中的数据访问频率明显高于其他表,则可以考虑调整该表的缓存策略为TTL。

TTL策略主要用来确保高优先的数据在被写入缓存后一段时间内不被淘汰。过期时间计算公式为过期时间=导入时间+超时时间

TTL数据在缓存管理中具有最高且平等的地位。最高的含义是,在缓存满的情况下,系统会通过淘汰LRU队列中的数据,以便将TTL数据写入缓存。而平等则指所有采用TTL策略的数据在淘汰过程中,过期时间的长短不是被淘汰的指标。

TTL数据占满缓存后,无论新导入的数据是否设置了TTL,或是从远端存储读取的冷数据,均不会写入缓存。

缓存预热策略

云数据库 SelectDB 版实例由一个或多个集群构成,集群之间共享同一份存储数据,但不会共享同一份缓存数据。新建的集群,其缓存中没有数据,因此若此时进行数据查询,查询速度可能较慢。为此,可以采取一定的方法对数据进行预热,主动将远端存储的数据读取到本地缓存中。

目前支持三种模式:

  • 将指定集群A的缓存预热至集群B:云数据库 SelectDB 版将定期收集每个集群在一定时间内访问的表或分区的热点信息,然后存储到内部表在进行集群间的预热时,预热集群将依据源集群的热点信息对特定表或分区进行预热

  • 将指定表的数据预热至新集群。

  • 将指定表的分区数据预热至新集群。

缓存空间管理

设置缓存空间大小

您可以在创建云数据库 SelectDB 版实例和集群时,指定缓存空间大小。具体操作,请参见创建实例

查看缓存空间大小

您可以登录云数据库SelectDB控制台,在实例列表页面,单击目标实例ID,进入实例详情页面,然后单击集群管理,查看缓存空间大小。

使用缓存预热示例

以集群cluster_name0的缓存预热至集群cluster_name1为例,介绍如何使用三种缓存预热策略。

步骤一:确定热点数据

  1. 查询实例下所有缓存热点信息的集群。

    SHOW CACHE HOTSPOT '/';

    查询结果如下,cluster_name0是一个包含缓存热点信息的集群。

    SHOW CACHE HOTSPOT '/';
    +------------------------+-----------------------+----------------------------------------+
    | cluster_name           | total_file_cache_size | top_table_name                         |
    +------------------------+-----------------------+----------------------------------------+
    | cluster_name0          |          751620511367 | regression_test.selectdb_cache_hotspot |
    +------------------------+-----------------------+----------------------------------------+
  2. 查看指定集群cluster_name0的缓存热点信息。

    SHOW CACHE HOTSPOT '/cluster_name0';

    查询结果如下,top_partition_name列中显示p20230529是一个包含缓存热点信息的分区,它是表customer的一个分区。

    +-----------------------------------------------------------+---------------------+--------------------+
    | table_name                                                | last_access_time    | top_partition_name |
    +-----------------------------------------------------------+---------------------+--------------------+
    | regression_test.selectdb_cache_hotspot                    | 2023-05-29 12:38:02 | p20230529          |
    | regression_test_cloud_load_copy_into_tpch_sf1_p1.customer | 2023-06-06 10:56:12 | p20230529          |
    | regression_test_cloud_load_copy_into_tpch_sf1_p1.nation   | 2023-06-06 10:56:12 | nation             |
    +-----------------------------------------------------------+---------------------+--------------------+
  3. 查看表customer包含缓存热点信息的分区信息

    说明

    当表只有一个分区时,分区的名称与表名相同。

    SHOW CACHE HOTSPOT '/cluster_name0/regression_test_cloud_load_copy_into_tpch_sf1_p1.customer';

    查询结果如下。

    +----------------+---------------------+
    | partition_id   | partition_name      |
    +----------------+---------------------+
    | 422831494463   | p20230529           |
    +----------------+---------------------+

步骤二:创建预热缓存JOB

以下为预热缓存三种模式的示例。

重要

一个集群同一时间内只支持执行一个预热的JOB。

  • 指定集群cluster_name0的缓存预热至集群cluster_name1。

    WARM UP CLUSTER cluster_name1 WITH CLUSTER cluster_name0
  • 指定集群cluster_name0中表customer数据预热至集群cluster_name1。

    WARM UP CLUSTER cluster_name1 WITH TABLE customer
  • 指定集群cluster_name0中的表customer的分区p20230529的数据预热至集群cluster_name1

    WARM UP CLUSTER cluster_name1 WITH TABLE customer PARTITION p20230529

步骤三:管理预热缓存JOB

  • 查询预热缓存JOB的JobId。

    WARM UP CLUSTER cluster_name1 WITH TABLE customer;
    +-------+
    | JobId |
    +-------+
    | 13418 |
    +-------+
    1 row in set (0.01 sec)
  • 查询预热缓存JOB进度。

    根据FinishBatch和AllBatch来判断当前任务进度,每个Batch约10GB。

    SHOW WARM UP JOB WHERE ID = 13418; 

    查询结果如下。

    +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+
    | JobId | ClusterName       | Status  | Type  | CreateTime              | FinishBatch | AllBatch | FinishTime |
    +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+
    | 13418 | cluster_name1     | RUNNING | TABLE | 2023-05-30 20:19:34.059 | 0           | 1        | NULL       |
    +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+
    1 row in set (0.02 sec)
  • 取消预热缓存JOB。

    通过jobId取消预热缓存任务。

    1. 取消任务。

      CANCEL WARM UP JOB where id = 13418;

      执行结果。

      Query OK, 0 rows affected (0.02 sec)
    2. 验证是否取消。

      SHOW WARM UP JOB WHERE ID = 13418;

      查询结果如下,FinishBatch列为0,任务取消成功。

      +-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+
      | JobId | ClusterName       | Status    | Type  | CreateTime              | FinishBatch | AllBatch | FinishTime              |
      +-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+
      | 13418 | cluster_name1     | CANCELLED | TABLE | 2023-05-30 20:19:34.059 | 0           | 1        | 2023-05-30 20:27:14.186 |
      +-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+
      1 row in set (0.00 sec)

使用TTL策略示例

设置TTL策略

在创建表时,设置PROPERTY的file_cache_ttl_seconds参数,可以使该表的数据通过TTL策略进行缓存,示例如下。

说明

file_cache_ttl_seconds表示新导入数据在缓存中期望保持的时间,单位为秒。

customer表中所有新导入的数据将在缓存中保留300秒。

CREATE TABLE IF NOT EXISTS customer (
  C_CUSTKEY     INTEGER NOT NULL,
  C_NAME        VARCHAR(25) NOT NULL,
  C_ADDRESS     VARCHAR(40) NOT NULL,
  C_NATIONKEY   INTEGER NOT NULL,
  C_PHONE       CHAR(15) NOT NULL,
  C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
  C_MKTSEGMENT  CHAR(10) NOT NULL,
  C_COMMENT     VARCHAR(117) NOT NULL
)
DUPLICATE KEY(C_CUSTKEY, C_NAME)
DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 32
PROPERTIES(
    "file_cache_ttl_seconds"="300" --设置TTL
)

修改TTL策略

云数据库 SelectDB 版对表的TTL时间进行修改。如果您希望延长或缩短TTL时间,或在建表时未设置TTL时间,可以通过ALTER语句设置 file_cache_ttl_seconds 参数来调整TTL时间。

说明

修改的时间不会立即生效,存在一定的延迟。

ALTER TABLE customer set ("file_cache_ttl_seconds"="3000");