如果您希望在不變更RDS PostgreSQL執行個體規格的前提下,減少儲存空間佔用,提高資料庫讀取效能,則可以參考本文,使用透明頁壓縮功能。該功能犧牲部分CPU效能,對Buffer Pool中的頁資料進行即時壓縮和解壓縮,可以有效降低儲存成本、提高IO輸送量。
前提條件
RDS PostgreSQL執行個體版本需要滿足以下條件:
執行個體大版本:14或以上版本。
核心小版本:大於等於20240530,如需升級核心小版本,請參見升級核心小版本。
什麼是透明頁壓縮
透明頁壓縮 TPC(Transparent Page Compression)中,頁壓縮指對Buffer Pool中的頁執行即時的IO壓縮和解壓縮,透明是指使用過程中無感知,資料在寫入磁碟時自動壓縮,資料在從磁碟讀取時自動解壓縮。
透明頁壓縮的主要目標是減少儲存空間的使用,並提高資料庫的讀效能。通過壓縮資料,可以降低磁碟IO,減少儲存,提高緩衝效率,並加快資料轉送速度。
應用情境
CPU使用率在50%以下,IOPS或IO吞吐容易達到瓶頸的情境下,推薦使用透明頁壓縮功能。
透明頁壓縮的優勢
儲存成本平均可節約50%。
IO使用平均可節約50%。
TPS在讀情境會有所提高,部分IO打滿的讀情境最高可提升100%。
影響
該功能會使CPU利用率上漲,壓縮的CPU利用率上漲約260%,解壓的CPU利用率上漲約40%。
在寫情境TPS會有下降。
對TOAST資料的壓縮效果不佳。
操作步驟
透明頁壓縮功能依賴資料表空間,需要建立壓縮資料表空間。
CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');重要本步驟建立的資料表空間名稱、資料表空間路徑以及壓縮演算法請勿修改。
建立壓縮表或索引。
在建立或修改表、索引時指定壓縮資料表空間,使用透明頁壓縮功能。
表壓縮
-- 建立表時,指定壓縮資料表空間,即可使用透明頁壓縮功能 CREATE TABLE <tablename> ... TABLESPACE rds_compress; -- 將現有表的資料表空間修改為壓縮資料表空間 ALTER TABLE <tablename> SET TABLESPACE rds_compress;索引壓縮
-- 建立索引時,指定壓縮資料表空間,即可使用透明頁壓縮功能 CREATE INDEX <indexname> ... TABLESPACE rds_compress; -- 將現有索引的資料表空間修改為壓縮資料表空間 ALTER INDEX <indexname> SET TABLESPACE rds_compress;
修改預設資料表空間為壓縮資料表空間,後續建立的表和索引,將預設使用透明頁壓縮功能。
-- 設定預設資料表空間為壓縮資料表空間 SET default_tablespace TO 'rds_compress'; -- 建立表、索引時無需指定資料表空間,預設使用透明頁壓縮功能。 CREATE TABLE <tablename> ...; CREATE INDEX <indexname> ...;
相關查詢
查詢表、索引是否建立在壓縮資料表空間下:
在psql命令列中輸入
\d+ <表名>查詢指定表的詳細資料。如果表和索引都建立在壓縮資料表空間下,則表示可以使用透明頁壓縮功能。以下為sysbench表的結構查詢結果。
Table "public.sbtest1" Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description --------+----------------+-----------+----------+-------------------------------------+----------+-------------+--------------+------------- id | integer | | not null | nextval('sbtest1_id_seq'::regclass) | plain | | | k | integer | | not null | 0 | plain | | | c | character(120) | | not null | ''::bpchar | extended | | | pad | character(60) | | not null | ''::bpchar | extended | | | Indexes: "sbtest1_pkey" PRIMARY KEY, btree (id), tablespace "rds_compress" "k_1" btree (k), tablespace "rds_compress" Tablespace: "rds_compress" Access method: heap
驗證資料是否壓縮:
您可以使用
pg_database_size、pg_tablespace_size、pg_relation_size、pg_table_size、pg_index_size、pg_total_relation_size等函數查看資料的即時大小。說明您可以利用sysbench測試載入器分別向壓縮表和非壓縮表中插入相同資料量的測試資料,觀察壓縮表的磁碟佔用情況,壓縮表的大小約為非壓縮表大小的50%。
計算指定表的壓縮比:
SELECT pg_relation_size('<tablename>')::float / (relpages * 8192) from pg_class WHERE relname = '<tablename>';說明上述語句中查詢
pg_class系統目錄,使用pg_relation_size('<tablename>')函數擷取指定表的實際磁碟佔用空間大小(以位元組為單位)並轉換為浮點數,通過除以(relpages * 8192)計算得出每個頁面的平均大小(以位元組為單位)。其中relpages是表的總頁面數,8192是PostgreSQL預設的頁面大小(通常為8KB),最終,查詢的結果表示指定表的平均壓縮比率。值越小,表示壓縮比越高。
將壓縮的表、索引轉為非壓縮的表、索引
當您不再使用透明頁壓縮功能時,執行如下命令可以將壓縮的表、索引轉為非壓縮的表、索引。
ALTER TABLE <tablename> SET TABLESPACE pg_default;
ALTER INDEX <indexname> SET TABLESPACE pg_default;效能測試
使用RDS PostgreSQL執行個體,使用sysbench工具進行壓力測試,以評估啟用和禁用TPC所帶來的效能表現。
本文以如下配置的RDS PostgreSQL執行個體為例:
規格 | 儲存 | Buffer Pool |
8核 32GB | ESSD PL1雲端硬碟(IO頻寬最大為350 MB/s) | 預設為8 GB |
測試一:極限效能條件下(CPU或IO滿負載)
分別對三個資料集(8 GB、80 GB、640 GB)進行測試。sysbench工具的關鍵參數配置如下:
--tables=100 --table-size=<分別為400000/4000000/32000000> --report-interval=1 --time=100 --threads=64--table-size按照資料集大小進行配置,其中8 GB資料集配置為400000;80 GB資料集配置為4000000;640GB資料集配置為32000000。
測試結果:
otlp_read_only
資料集
是否啟用TPC
TPS
IO(MB/s)
CPU利用率
8 GB資料集
否
6878
讀:0
100%
是
6914
讀:0
100%
80 GB資料集
否
5939
讀:280
100%
是
5945
讀:15
100%
640 GB資料集
否
2222
讀:350
44%
是
4508
讀:320
100%
otlp_write_only
資料集
是否啟用TPC
TPS
IO(MB/s)
CPU利用率
8 GB資料集
否
22151
讀:0
寫:100
100%
是
22314
讀:0
寫:50
100%
80 GB資料集
否
7044
讀:80
寫:270
30%
是
5493
讀:10
寫:180
100%
640 GB資料集
否
2375
讀:80
寫:270
20%
是
1245
讀:25
寫:210
100%
測試二:非極限效能條件下(CPU和IO均未達到滿負荷)
僅對640 GB資料集進行測試,sysbench工具的關鍵參數配置如下:
--tables=100 --table-size=32000000 --report-interval=1 --time=100 --threads=4測試結果:
測試方式 | 是否啟用TPC | TPS | IO(MB/s) | CPU利用率 |
otlp_read_only | 否 | 720 |
| 7.5% |
是 | 795 |
| 10.6% | |
otlp_write_only | 否 | 1497 |
| 6.8% |
是 | 1000 |
| 25% |
測試結論
啟用透明頁壓縮TPC後:
讀效能提升,資料集越大,讀效能提升越明顯。
寫效能下降,資料集越大,寫效能下降越明顯。
執行個體將會消耗更多的CPU資源,從而降低IO的消耗。
由此可見,透明頁壓縮TPC適用於讀操作較多而寫操作較少的業務情境,尤其在CPU資源充足且IO資源佔用較高的情況下,啟用透明頁壓縮TPC後,效能提升尤為明顯。
常見問題
Q:啟用透明頁壓縮TPC後,資料庫工具(pg_dump,pg_basebackup)還能正常使用嗎?
A:pg_dump和pg_basebackup工具可以正常使用,其中如果要將pg_basebackup產生的備份恢複到另一個資料庫時,目標資料庫也需要開啟透明頁壓縮。