数据缓存
本文档为您介绍云数据库SelectDB的数据缓存功能,当您需要管理缓存数据并提升云数据库 SelectDB 版的访问速度时,可以根据该文档对缓存进行有效管理,并利用LRU和TTL管理策略,以及缓存预热技术,来充分发挥数据库性能。
概述
云数据库 SelectDB 版的数据存储在远端服务器上,为了加速对数据的访问,云数据库SelectDB实现了一个基于本地硬盘的缓存。缓存提供了两种管理策略:LRU策略和TTL策略。云数据库 SelectDB 版的缓存对索引相关的数据做了优化,让缓存尽可能存储常用的数据。在多计算集群的应用场景,SelectDB还提供了缓存预热功能。在新建一个集群后,用户可以让新集群对指定的数据(Table或Partition)进行预热,以便提高查询效率。
创建云数据库 SelectDB 版实例和集群时,您可以在创建页面指定缓存空间大小。详情请参考创建实例。
如果您已创建实例,您可以登录,在实例列表页面,单价目标实例ID,进入实例详情页面,然后单击集群管理,查看缓存空间大小。
缓存策略与缓存数据策略
缓存数据
数据进入缓存主要有三种方式。
导入。新导入的数据会异步写到缓存中以加速第一次访问。
查询。如果查询的数据不在缓存,会从远端存储读取到内存中,并最终写入到本地硬盘的缓存中,以便下一次查询。
主动预热。尽管远端存储的数据可以多集群共享,但缓存并不会共享。新建集群中的缓存是空的,您可以通过主动预热,让集群快速地从远端存储读取所需的数据,并写入本地缓存。
缓存策略
缓存同时支持LRU和TTL两种策略。
缓存策略 | 详细说明 |
LRU策略 | LRU是缓存的默认策略。缓存会对采用该策略的数据维护一个队列,当访问队列中的某一块数据时,会把对应的数据移动到LRU队列的队首。如果有新写入缓存的数据,也会放在队首,避免过早被淘汰。当缓存数据存满时,会优先淘汰队列尾部的数据。 |
TTL策略 | TTL策略主要用来确保新导入的数据在被写入缓存后一段时间内不被淘汰(过期时间是由导入时间+超时时间来计算得出的)。TTL的数据的地位是最高且平等的。最高指当缓存满时,会通过淘汰LRU队列的数据,来让TTL的数据写进缓存中。平等是指所有TTL策略的数据并不会因为过期时间有差别而进行淘汰。在TTL的数据占满了缓存之后,新导入的数据(无论是否设置TTL)或者从远端存储读取的冷数据,都不会被写进缓存。 |
缓存预热策略
SelectDB提供多集群的能力,多个集群共享同一份数据,但不会共享同一份缓存。刚完成创建的新集群,它的缓存是空的,若在此时进行查询数据,查询速度会比较慢。这时可以通过一些手段预热数据,主动从远端存储的数据读取到本地缓存。
目前支持三种模式:
指定集群A的缓存预热到集群B。SelectDB会定期采集每个集群一段时间内访问过的表或者分区的热点信息,然后作为内部表存储下来。当进行集群间的预热时,预热集群会根据源集群的热点信息来对某些表/分区进行预热。
指定表A数据预热到新集群。
指定表A的分区'p1'的数据预热到新集群。
缓存预热
如下以集群cluster_name0的缓存预热到集群cluster_name1为例,介绍上述三种缓存预热策略。
查询当前实例下所有集群最频繁访问的表。
SHOW CACHE HOTSPOT '/';
查询结果如下。
SHOW CACHE HOTSPOT '/'; +------------------------+-----------------------+----------------------------------------+ | cluster_name | total_file_cache_size | top_table_name | +------------------------+-----------------------+----------------------------------------+ | cluster_name0 | 751620511367 | regression_test.selectdb_cache_hotspot | +------------------------+-----------------------+----------------------------------------+
查看指定集群下的所有表的最热的分区(Paration)信息。
SHOW CACHE HOTSPOT '/cluster_name0';
查询结果如下。
+-----------------------------------------------------------+---------------------+--------------------+ | 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 | customer | | regression_test_cloud_load_copy_into_tpch_sf1_p1.nation | 2023-06-06 10:56:12 | nation | | regression_test_cloud_load_copy_into_tpch_sf1_p1.orders | 2023-06-06 10:56:12 | orders | | regression_test_cloud_load_copy_into_tpch_sf1_p1.part | 2023-06-06 10:56:12 | part | | regression_test_cloud_load_copy_into_tpch_sf1_p1.partsupp | 2023-06-06 10:56:12 | partsupp | | regression_test_cloud_load_copy_into_tpch_sf1_p1.region | 2023-06-06 10:56:12 | region | | regression_test_cloud_load_copy_into_tpch_sf1_p1.supplier | 2023-06-06 10:56:12 | supplier | +-----------------------------------------------------------+---------------------+--------------------+
查看指定集群下的表
regression_test_cloud_load_copy_into_tpch_sf1_p1.customer
的信息。SHOW CACHE HOTSPOT '/cluster_name0/regression_test_cloud_load_copy_into_tpch_sf1_p1.customer';
查询结果如下。
+----------------+---------------------+ | partition_name | last_access_time | +----------------+---------------------+ | supplier | 2023-06-06 10:56:12 | +----------------+---------------------+
进行缓存预热。
指定集群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的分区(partition) 'p1'的数据预热到集群cluster_name1。
WARM UP CLUSTER cluster_name1 WITH TABLE customer PARTITION p1
查询预热缓存的JobId。
WARM UP CLUSTER cloud_warm_up WITH TABLE test_warm_up; +-------+ | JobId | +-------+ | 13418 | +-------+ 1 row in set (0.01 sec)
查询预热进度。
SHOW WARM UP JOB WHERE ID = 13418;
查询结果如下。
+-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+ | JobId | ClusterName | Status | Type | CreateTime | FinishBatch | AllBatch | FinishTime | +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+ | 13418 | cloud_warm_up | RUNNING | TABLE | 2023-05-30 20:19:34.059 | 0 | 1 | NULL | +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+ 1 row in set (0.02 sec)
取消预热任务。
根据FinishBatch和AllBatch来判断当前任务进度,每个Batch约10GB。目前一个集群同一时间内只支持执行一个预热的JOB。同样,也可以停止正在进行的预热JOB。示例如下。
CANCEL WARM UP JOB where id = 13418;
执行结果。
Query OK, 0 rows affected (0.02 sec)
查询预热进度。
SHOW WARM UP JOB WHERE ID = 13418;
查询结果如下。
+-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+ | JobId | ClusterName | Status | Type | CreateTime | FinishBatch | AllBatch | FinishTime | +-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+ | 13418 | cloud_warm_up | 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)
- 本页导读 (1)