本文介紹全密態資料庫在不同情境中對系統效能的影響,有助於您評估和選擇加密方案。
測試環境
配置項 | ECS執行個體(測試用戶端部署在ECS執行個體上) | RDS PostgreSQL執行個體 | 說明 |
地區及可用性區域 | 華東2(上海)可用性區域L | 華東2(上海)可用性區域L | 本測試在同一地區及可用性區域 |
網路類型 | Virtual Private Cloud | Virtual Private Cloud | 本測試在同一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外掛程式進一步提升密文資料的查詢效能。
全密態資料庫擴充使用建議
建議開啟全密態資料庫擴充後,只對關鍵的敏感性資料列加密。