通過合理設置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為例,介紹如何使用三種緩存預熱策略。
步驟一:確定熱點數據
查詢實例下所有緩存熱點信息的集群。
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 | +------------------------+-----------------------+----------------------------------------+
查看指定集群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 | +-----------------------------------------------------------+---------------------+--------------------+
查看表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取消預熱緩存任務。
取消任務。
CANCEL WARM UP JOB where id = 13418;
執行結果。
Query OK, 0 rows affected (0.02 sec)
驗證是否取消。
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");