本文介紹全密態數據庫在不同場景中對系統性能的影響,有助于您評估和選擇加密方案。
測試環境
配置項 | ECS實例(測試客戶端部署在ECS實例上) | RDS PostgreSQL實例 | 說明 |
地域及可用區 | 華東2(上海)可用區L | 華東2(上海)可用區L | 本測試在同一地域及可用區 |
網絡類型 | 專有網絡VPC | 專有網絡VPC | 本測試在同一VPC |
CPU和內存 | 64核 128GB | 32核 64GB | 不涉及 |
實例規格族 | 計算型 c7 | 安全增強型 | RDS需要選擇安全增強型規格 |
實例規格 | ecs.c7.16xlarge | pg.x2t.4xlarge.2c | 不涉及 |
存儲類型 | ESSD云盤 | ESSD云盤 PL1 | 不涉及 |
實例/鏡像版本 | Alibaba Cloud Linux 3.2104 64位 |
| 不涉及 |
測試工具(sysbench)
sysbench是一個跨平臺且支持多線程的模塊化基準開源測試工具,用于評估系統在運行高負載的數據庫時相關核心參數的性能表現。sysbench的更多信息及使用方法,請參見sysbench文檔。
測試指標
每秒執行事務數TPS(Transactions Per Second):數據庫每秒執行的事務數,以COMMIT成功次數為準。
事務處理平均延遲(Average Latency):數據庫執行一條事務的平均耗時,單位為毫秒(ms)。
測試表結構
sysbench的默認表結構如下:
CREATE TABLE test1(
id INTEGER NOT NULL,
k INTEGER DEFAULT '0' NOT NULL,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
);
CREATE INDEX k_1 on test1(k);
測試步驟
本測試對表中的列進行加密,分析全密態數據庫不同場景下的性能。
ECS實例安裝PostgreSQL客戶端。請參見官方文檔。
打開PostgreSQL命令行工具連接RDS PostgreSQL數據庫。
psql -h <數據庫連接地址> -U <用戶名> -p <端口號> -d postgres
說明數據庫連接地址和端口號獲取,請參見查看或修改連接地址和端口。
用戶名請參見創建賬號。
您也可以在控制臺通過DMS連接RDS PostgreSQL數據庫,具體方法請參見通過DMS登錄RDS數據庫。
創建測試數據庫。
CREATE DATABASE testdb; \c testdb
創建加密表,根據不同場景對列進行加密。
場景
說明
SQL示例
主鍵不加密,其他列加密
常見業務場景中,
id
為自增字段并與業務無關,因此此場景不加密id
列,將其他列作為敏感信息進行加密。CREATE TABLE test1( id INTEGER NOT NULL, k enc_int4 DEFAULT '\xa509008855508aade16ec573d21e6aca47ab5e490d7044e748161a6635a5d939c5bbbee4' NOT NULL, c enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL, pad enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL, PRIMARY KEY (id) ); CREATE INDEX k_1 on test1(k);
加密所有列
此場景對主鍵列也進行加密。
CREATE TABLE test1( id enc_int4 NOT NULL, k enc_int4 DEFAULT '\xa509008855508aade16ec573d21e6aca47ab5e490d7044e748161a6635a5d939c5bbbee4' NOT NULL, c enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL, pad enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL, PRIMARY KEY (id) ); CREATE INDEX k_1 on test1(k);
退出數據庫,使用sysbench工具加載測試數據。
說明本測試中,使用sysbench加載32個表,其中每個表包含一百萬行記錄。
sysbench --db-driver=pgsql \ --pgsql-host=[database server host] \ --pgsql-port=[database server port] \ --pgsql-user=[database user name] \ --pgsql-password=[database user password] \ --pgsql-db=testdb \ --auto_inc=false \ --table_size=1000000 \ --tables=32 \ --threads=32 \ --time=600 \ --pg_use_encrypt=[true or false] \ oltp_common prepare
執行自定義測試腳本。
sysbench --db-driver=pgsql \ --pgsql-host=[database server host] \ --pgsql-port=[database server port] \ --pgsql-user=[database user name] \ --pgsql-password=[database user password] \ --pgsql-db=testdb \ --table_size=1000000 \ --tables=32 \ --threads=XXX \ --time=600 \ --report-interval=1 \ --pg_use_encrypt=[true or false] \ [lua script name] run
sysbench --db-driver=pgsql \ --pgsql-host=[database server host] \ --pgsql-port=[database server port] \ --pgsql-user=[database user name] \ --pgsql-password=[database user password] \ --pgsql-db=testdb \ --tables=32 \ oltp_common cleanup
測試場景1:主鍵不加密,其他列加密
本次測試的每個結果均為運行10次測試的TPS和處理延遲的平均值,其中每次測試執行10分鐘。
性能測試結果包含了在客戶端對返回的加密字段進行解密的性能損耗。
測試結果圖例中柱形圖表示每秒執行數TPS,折線圖表示事務處理平均延遲。
測試數據
點查詢性能
比例
SQL模板
100%
說明比例指一條事務中執行SQL模板中定義的SQL所占的比例。
SELECT c FROM test1 WHERE id=?;
表 1. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
性能損失
8
46.99
39.94
15.0%
16
91.07
79.86
12.3%
24
132.78
117.64
11.4%
32
173.58
154.28
11.1%
范圍查詢性能
比例
SQL模板
100%
SELECT SUM(k) FROM test1 WHERE id BETWEEN ? AND ?;
說明范圍查詢的長度默認為100。
表 2. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
性能損失
8
14.81
12.09
18.3%
16
28.88
23.22
19.6%
24
41.62
33.12
20.4%
32
54.27
42.48
21.7%
寫性能
比例
SQL模板
25%
UPDATE test1 SET k=k+1 WHERE id=?;
25%
UPDATE test1 SET c=? WHERE id=?;
25%
DELETE FROM test1 WHERE id=?;
25%
INSERT INTO test1 (id, k, c, pad) VALUES (?, ?, ?, ?);
表 3. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
性能損失
8
6.62
6.37
3.8%
16
11.36
10.91
4.0%
24
15.05
14.68
2.6%
32
19.13
17.74
7.3%
測試結論
非密文主鍵查詢場景下,開啟全密態數據庫擴展后,性能損失較小。
測試場景2:加密所有列
本次測試的每個結果均為運行10次測試的TPS和處理延遲的平均值,其中每次測試執行10分鐘。
性能測試結果包含了在客戶端對返回的加密字段進行解密的性能損耗。
測試結果圖例中柱形圖表示每秒執行數TPS,折線圖表示事務處理平均延遲。
測試數據
點查詢性能
比例
SQL模板
100%
SELECT c FROM test1 WHERE id=?;
表 4. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
性能損失
8
46.99
18.31
61.0%
16
91.07
35.66
60.8%
24
132.78
49.85
62.5%
32
173.58
63.34
63.5%
范圍查詢性能
比例
SQL模板
100%
SELECT SUM(k) FROM test1 WHERE id BETWEEN ? AND ?;
說明范圍查詢的長度默認為100。
表 5. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
性能損失
8
14.81
2.83
80.9%
16
28.88
5.52
80.9%
24
41.62
7.12
82.9%
32
54.27
8.71
84.0%
寫性能
比例
SQL模板
25%
UPDATE test1 SET k=k+1 WHERE id=?;
25%
UPDATE test1 SET c=? WHERE id=?;
25%
DELETE FROM test1 WHERE id=?;
25%
INSERT INTO test1 (id, k, c, pad) VALUES (?, ?, ?, ?);
表 6. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
性能損失
8
6.62
2.67
59.7%
16
11.36
4.62
59.3%
24
15.05
5.92
60.7%
32
19.13
7.04
63.2%
測試結論
加密所有列相比于不加密主鍵列的查詢結果,除了客戶端的解密開銷外,由于加密列的索引查詢需要調用Intel SGX相關指令的頻率更高,總代價更大,性能損失較大。
測試場景3:非主鍵列查詢
本次測試的每個結果均為運行10次測試的TPS和處理延遲的平均值,其中每次測試執行10分鐘。
性能測試結果包含了在客戶端對返回的加密字段進行解密的性能損耗。
測試結果圖例中柱形圖表示每秒執行數TPS,折線圖表示事務處理平均延遲。
本測試場景使用了阿里云推出的encdb_btree插件,能夠有效提高全密態數據庫密文索引相關操作的效率。更多信息,請參見加速密文索引(encdb_btree)。
測試數據
點查詢
比例
SQL模板
100%
SELECT c FROM test1 WHERE k=?;
表 7. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
開啟全密態數據庫擴展+使用encdb_btree插件加速
8
47.27
18.49
27.86
16
90.41
35.85
54.4
24
132.66
49.97
78.21
32
172.96
63.32
99.38
范圍查詢
比例
SQL模板
100%
SELECT SUM(k) FROM test1 WHERE k BETWEEN ? AND ?
說明范圍查詢的長度默認為100。
表 8. TPS(千)性能對比 并發線程數
未開啟全密態數據庫擴展
開啟全密態數據庫擴展
開啟全密態數據庫擴展+使用encdb_btree插件加速
8
14.97
2.83
7.8
16
28.89
5.53
15.2
24
42.38
7.15
20.09
32
54.8
8.75
24.86
測試結論
數據庫在非主鍵列上的查詢表現與主鍵列上的表現類似,并且開啟全密態數據庫擴展后,可以通過encdb_btree插件進一步提升密文數據的查詢性能。
全密態數據庫擴展使用建議
建議開啟全密態數據庫擴展后,只對關鍵的敏感數據列加密。