このトピックでは、完全に暗号化されたデータベース機能がさまざまなシナリオでシステムパフォーマンスに与える影響について説明し、暗号化ソリューションの評価と選択に役立ちます。
テスト環境
設定アイテム | テストクライアントがデプロイされているECSインスタンス | RDSインスタンス | 説明 |
リージョンとゾーン | 上海ゾーンL | 上海ゾーンL | テストは同じ地域とゾーンで実行されます。 |
ネットワークタイプ | 仮想プライベートクラウド (VPC) | VPC | テストは同じVPCで実行されます。 |
CPUコア数とメモリ容量 | 16 コア 128 GB | 32 コア 64 GB | N/A |
インスタンスファミリー | コンピューティング最適化タイプc7 | セキュリティ強化型インスタンスファミリー | RDSインスタンスは、セキュリティ強化インスタンスファミリーに属している必要があります。 |
インスタンスタイプ | ecs.c7.16xlarge | pg.x2t.4 xlarge.2c | N/A |
ストレージタイプ | Enhanced SSD (ESSD) | PL1 ESSD | N/A |
インスタンスまたはイメージのバージョン | Alibaba Cloud Linux 3.2104 64ビット |
| N/A |
テストツール (sysbench)
sysbenchは、コア指標に基づいて負荷の高いデータベースシステムのパフォーマンスを評価するために使用できる、モジュール式、クロスプラットフォーム、およびマルチスレッドのベンチマークツールです。 sysbenchの詳細とsysbenchの使用方法については、「sysbenchドキュメント」をご参照ください。
パフォーマンスメトリクス
Transactions per second (TPS): RDSインスタンスで1秒あたりに正常にコミットされたトランザクションの数。
平均レイテンシ: RDSインスタンスがトランザクションを実行するのに必要な平均期間。 単位:ミリ秒。
テストスキーマ
デフォルトでは、sysbenchは次のテーブルスキーマを使用します。
CREATE TABLE test1 (
id INTEGER NOT NULL,
k整数デフォルト「0」NOT NULL、
c CHAR(120) デフォルト 'NOT NULL、
パッドCHAR(60) デフォルト 'NOT NULL、
主要なキー (id)
);
CREATE INDEX k_1 on test1(k);
テストの実行手順
このテストでは、さまざまなシナリオでのRDSインスタンスのパフォーマンスに対する完全暗号化データベース機能の影響を分析するために、テーブル列を暗号化します。
ECSインスタンスにPostgreSQLクライアントをインストールします。 詳細については、公式ドキュメントをご参照ください。
PostgreSQLコマンドラインツール (CLI) を開き、次のコマンドを実行してRDSインスタンスに接続します。
psql -h <RDSインスタンスのエンドポイント> -U <ユーザー名> -p <ポート番号> -d postgres
説明RDSインスタンスのエンドポイントとポート番号を取得する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスの内部およびパブリックエンドポイントとポート番号の表示と変更」をご参照ください。
ユーザー名の取得方法の詳細については、「アカウントの作成」をご参照ください。
ApsaraDB RDSコンソールでデータ管理 (DMS) を使用してRDSインスタンスに接続することもできます。 詳細については、「DMSを使用したApsaraDB RDS For PostgreSQLインスタンスへのログイン」をご参照ください。
テストデータベースを作成します。
データベースの作成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、 パッドenc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL、 主要なキー (id) ); CREATE INDEX k_1 on test1(k);
すべての列は暗号化されます。
このテストシナリオでは、主キー列も暗号化されます。
CREATE TABLE test1 ( id enc_int4 NULLではない、 k enc_int4 DEFAULT '\xa509008855508aade16ec573d21e6aca47ab5e490d7044e748161a6635a5d939c5bbbee4' NOT NULL, c enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL, パッドenc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL、 主要なキー (id) ); CREATE INDEX k_1 on test1(k);
RDSインスタンスを終了し、sysbenchを使用してテストデータを読み込みます。
説明このテストでは、sysbenchを使用して32テーブルをロードします。 各テーブルは、百万行のレコードを含む。
sysbench -- db-driver=pgsql \ -- pgsql-host=[データベースサーバーホスト] \ -- pgsql-port=[データベースサーバーポート] \ -- pgsql-user=[データベースユーザー名] \ -- pgsql-password=[データベースユーザーパスワード] \ -- pgsql-db=testdb \ -- auto_inc=false \ -- table_size=1000000 \ -- tables=32 \ -- threads=32 \ -- time=600 \ -- pg_use_encrypt=[trueまたはfalse] \ oltp_commonの準備
カスタムテストスクリプトを実行します。
sysbench -- db-driver=pgsql \ -- pgsql-host=[データベースサーバーホスト] \ -- pgsql-port=[データベースサーバーポート] \ -- pgsql-user=[データベースユーザー名] \ -- pgsql-password=[データベースユーザーパスワード] \ -- pgsql-db=testdb \ -- table_size=1000000 \ -- tables=32 \ -- threads=XXX \ -- time=600 \ -- report-interval=1 \ -- pg_use_encrypt=[trueまたはfalse] \ [luaスクリプト名] run
sysbench -- db-driver=pgsql \ -- pgsql-host=[データベースサーバーホスト] \ -- pgsql-port=[データベースサーバーポート] \ -- pgsql-user=[データベースユーザー名] \ -- pgsql-password=[データベースユーザーパスワード] \ -- pgsql-db=testdb \ -- tables=32 \ oltp_commonクリーンアップ
テストシナリオ1: 主キー列は暗号化されていません。 その他の列は暗号化されます。
このテストの各結果は、10回のテストのTPSおよび処理待ち時間の平均であり、各テストは10分間実行されます。
テスト結果は、クライアントで返されたフィールドの復号化によって引き起こされたパフォーマンスの損失も示しています。
テスト結果では、縦棒グラフはTPSを示し、折れ線グラフはトランザクションの平均処理レイテンシを示します。
テストデータ
ポイントクエリのパフォーマンス
パーセンテージ
SQLテンプレート
100%
説明パーセンテージは、トランザクションで実行されたSQL文の総数に対する、SQLテンプレートで定義され、トランザクションで実行されたSQL文の割合を示します。
SELECT c FROM test1 WHERE id =?;
表1 1,000 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? そして?;
説明デフォルトでは、範囲クエリの長さは100です。
表2 1,000 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) 値 (? 、? 、?);
表3 1,000 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 1,000 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? そして?;
説明デフォルトでは、範囲クエリの長さは100です。
表5 1,000 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) 値 (? 、? 、?);
表6 1,000 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関連のコマンドは、暗号化された列のインデックスを照会するために頻繁に実行されます。 その結果、総コストとパフォーマンスの損失は、テストシナリオ1の場合よりも高くなります。
テストシナリオ3: 主キー以外の列が照会されます。
このテストの各結果は、10回のテストのTPSおよび処理待ち時間の平均であり、各テストは10分間実行されます。
テスト結果は、クライアントで返されたフィールドの復号化によって引き起こされたパフォーマンスの損失も示しています。
テスト結果では、縦棒グラフはTPSを示し、折れ線グラフはトランザクションの平均処理レイテンシを示します。
このテストシナリオでは、Alibaba Cloudが提供するencdb_btree拡張機能を使用して、完全に暗号化されたデータベースでの暗号文インデックス関連の操作の効率を向上させます。 詳細については、「encdb_btree拡張機能の使用」をご参照ください。
テストデータ
ポイントクエリ
パーセンテージ
SQLテンプレート
100%
SELECT c FROM test1 WHERE k =?;
表7 1,000 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 k BETWEEN? そして?
説明デフォルトでは、範囲クエリの長さは100です。
表8 1,000 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拡張機能を使用して暗号文データのクエリパフォーマンスを向上させることができます。
使用法の提案
完全暗号化データベース機能を有効にして、機密データ列のみを暗号化することを推奨します。