當您需要應對數據庫磁盤IO性能瓶頸時,云數據庫RDS PostgreSQL的通用云盤IO加速功能為您提供了一個高效的解決方案。本文檔將詳細介紹該技術的優勢、適用場景和工作原理,幫助您在面臨大規模或頻繁數據讀寫需求時顯著提升數據庫性能。
背景
RDS PostgreSQL在數據處理過程中,數據會從磁盤讀取到內存,在內存中處理完成后,數據再從內存寫入到磁盤中。與內存操作相比,磁盤IO操作運行速度較慢,將會消耗更多的時間。當業務出現大規模數據讀寫或頻繁數據讀寫請求時,磁盤IO操作可能成為數據庫系統的瓶頸。
因此,阿里云數據庫RDS PostgreSQL推出新的存儲類型——通用云盤。在兼容ESSD云盤所有特性的基礎上,通用云盤采用三級存儲架構對不同類型的數據進行分級管理,并且引入了IO加速功能,以提升RDS PostgreSQL實例的QPS性能。更多信息,請參見通用云盤。
功能介紹
IO加速功能對應通用云盤三級存儲架構中的緩存層,主要是通過高速緩存介質來提升數據庫的讀寫性能,以提高SQL查詢處理的速度。針對臨時表和查詢產生的臨時文件,RDS PostgreSQL的IO加速能力允許將這些臨時數據存儲到高速的緩存介質中,使得數據庫引擎對這些臨時數據的讀寫IO更快,大大加快查詢的處理,在復雜查詢場景下可提高100%查詢性能。
價值效益
RDS PostgreSQL實例開啟IO加速功能后,目前無需支付任何額外費用。您可以在無任何成本變化和業務改動的情況下,在適用場景下大幅度提升數據庫的QPS性能。具體適用場景,請詳見適用場景。
適用場景
下列是一些IO加速功能適用的業務場景:
排序、分組聚合、聯合等產生臨時結果的復雜操作
使用CTE通用表達式的遞歸查詢
無法使用適當索引的復雜查詢
對大表或多個表的分析型查詢
其他使用臨時表的工作負載
支持范圍
滿足以下條件的RDS PostgreSQL實例支持該功能:
計費方式:包年包月或按量付費
實例大版本:PostgreSQL 11或以上
內核小版本:20231030或以上
產品系列:高可用系列
產品類型:標準版
存儲類型:通用云盤
實例規格族:通用型
實例所在地域及可用區:
地域
可用區
西南1(成都)
可用區B
華北2(北京)
可用區I
華東2(上海)
可用區M
可用區N
華東1(杭州)
可用區J
說明在售賣頁面開啟IO加速功能后,可在主可用區及網絡處查看是否支持。
技術原理
Cache Disk表示高速緩存介質,是一種讀寫性能介于內存和通用云盤之間的存儲介質,其讀寫性能要優于通用云盤,因此非常適合作為數據庫中臨時數據的緩存盤。
RDS PostgreSQL數據庫服務端收到用戶的SQL查詢后,由查詢執行器對查詢進行處理,其根據查詢要訪問的數據所在的表空間決定數據存儲的位置。
在未開啟IO加速功能時,所有數據只能存儲在云盤上。
開啟IO加速功能后:
如訪問的是非臨時數據(正常的表、視圖等數據),則還是從云盤讀取數據到內存中進行處理;
如訪問的是臨時數據(臨時表、臨時文件等數據),則從高速緩存盤讀寫數據。
具體而言,實例創建的臨時表等臨時對象(不顯式指定表空間)和在查詢執行過程中產生的臨時文件都將被存儲到高速緩存介質中,從而提升數據庫對這些臨時數據的讀寫,在一定時間內可以執行處理更多的查詢。
RDS PostgreSQL是通過表空間來設置數據庫對象的存儲位置,以實現數據的冷熱分離,因此我們使用表空間rds_temp_tablespace
來抽象其背后的高速緩存介質。您可以在開啟IO加速的實例中看到該表空間。而使用該表空間還需要您正確設置數據庫參數temp_tablespaces
,具體詳見開啟IO加速。
注意事項
高速緩存介質僅用于存儲臨時緩存數據,RDS PostgreSQL不保證存儲在表空間
rds_temp_tablespace
的數據的持久性,當實例發生變配等遷移動作后,這些數據會丟失,所以請勿將非臨時表等數據對象的表空間設置為該表空間。RDS PostgreSQL開啟IO加速功能后,會根據不同實例規格提供一定容量的高速緩存空間,當該空間寫滿時,會報錯
No space left on device
,該問題不影響非臨時數據的相關SQL執行。開啟或關閉IO加速功能后,實例約有30秒不可用,建議在業務低峰期執行功能的開啟和關閉操作。
開啟IO加速
打開IO加速開關。
RDS PostgreSQL支持在購買新實例時打開IO加速開關,也支持對滿足支持范圍的已有實例打開IO加速開關。
修改數據庫參數。
當實例打開IO加速開關后,RDS PostgreSQL會生成一個名為
rds_temp_tablespace
的表空間,其背后使用的存儲介質是支持IO加速的高速緩存介質。使用該表空間作為默認的臨時表空間,您還需要將數據庫參數temp_tablespaces
設置為rds_temp_tablespace
。參數設置請詳見設置實例參數。說明您可以執行以下的SET語句在會話級別設置該參數:
SET temp_tablespace TO 'rds_temp_tablespace';
您可以將參數
temp_tablespaces
設置為''
,切換回云盤存儲。
使用緩存加速功能。
開啟IO加速開關并修改數據庫參數后,您就可以在創建臨時表時,默認使用
rds_temp_tablespace
表空間。創建測試表。
-- 創建非臨時表test_table CREATE TABLE test_table (di INT); -- 創建臨時表test_temp_table CREATE TEMPORARY TABLE test_temp_table (id INT);
查詢測試表的表空間。
SELECT c.relname AS table_name, COALESCE(t.spcname, 'pg_default') AS tablespace_name FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_tablespace t ON c.reltablespace = t.oid WHERE c.relkind = 'r' AND c.relname IN ('test_table', 'test_temp_table');
返回結果示例:
table_name | tablespace_name -----------------+--------------------- test_table | pg_default test_temp_table | rds_temp_tablespace (2 rows)
相關文檔
常見問題
Q:SQL執行時,報錯ERROR: could not write to file "pg_tblspc/xxxx": No space left on device
,如何處理?
A:該報錯是由于高速緩存介質的表空間rds_temp_tablespace
已滿造成的,您可以結束當前會話(RDS PostgreSQL內核將自動清理臨時文件回收空間),重連實例后再次嘗試之前失敗的SQL語句。
如問題仍未解決,您可以修改參數temp_tablespaces
的取值為''
,切換回云盤存儲。