全部產品
Search
文件中心

ApsaraDB RDS:全密態資料庫效能測試報告

更新時間:Jun 19, 2024

本文介紹全密態資料庫在不同情境中對系統效能的影響,有助於您評估和選擇加密方案。

測試環境

配置項

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位

  • 大版本:RDS PostgreSQL 13

  • 小版本:20230830

不涉及

測試載入器(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);

測試步驟

本測試對錶中的列進行加密,分析全密態資料庫不同情境下的效能。

  1. ECS執行個體安裝PostgreSQL用戶端。請參見官方文檔

  2. 開啟PostgreSQL命令列工具串連RDS PostgreSQL資料庫。

    psql -h <資料庫連接地址> -U <使用者名稱> -p <連接埠號碼> -d postgres
    說明
  3. 建立測試資料庫。

    CREATE DATABASE testdb;
    \c testdb
  4. 建立加密表,根據不同情境對列進行加密。

    情境

    說明

    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);
  5. 退出資料庫,使用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
  6. 執行自訂測試指令碼。

    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
  7. 清理資料。

    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點查詢

    表 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。

    情境1範圍查詢

    表 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 (?, ?, ?, ?);

    情境1寫效能

    表 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=?;

    情境2點查詢

    表 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。

    情境2範圍查詢

    表 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 (?, ?, ?, ?);

    情境2寫效能

    表 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外掛程式進一步提升密文資料的查詢效能。

全密態資料庫擴充使用建議

建議開啟全密態資料庫擴充後,只對關鍵的敏感性資料列加密。