このレポートでは、さまざまな暗号化シナリオにおける PolarDB-X 完全暗号化データベースのパフォーマンスについて詳しく説明します。この結果は、ニーズに合った適切な暗号化戦略を評価し、選択するのに役立ちます。
テスト結論のまとめ
テストディメンション | 主な調査結果 |
さまざまなインスタンスタイプと同時実行圧力の下で、100% の列暗号化 (テーブル内のすべての列を暗号化) を有効にした場合のパフォーマンスオーバーヘッドは、約 10% で安定しています。 | |
暗号化を行わない場合でも、標準の Java Database Connectivity (JDBC) ドライバーを EncJDBC ドライバーに置き換えると、クライアントの CPU 消費量が 30% から 50% 増加します。 | |
100% の列暗号化 (テーブル内のすべての列を暗号化) を有効にすると、最適なパフォーマンスを達成するために、クライアントの CPU 消費量がプレーンテキストのシナリオと比較して約 55% から 150% 増加します。 | |
パフォーマンスオーバーヘッドは、暗号化された列の数と正の相関があります。暗号化する列が多いほど、パフォーマンスオーバーヘッドが大きくなり、クライアントの CPU 消費量も高くなります。必要に応じて、機密性の高い列のみを暗号化してください。 |
テスト設計
テストモデルとメトリック
テストモデル: 業界標準の OLTP ベンチマークツールである Oltpbench とその TPC-C モデルを使用します。
データ量: テストは 1000 の TPC-C ウェアハウスに基づいており、コアの
bmsql_order_lineテーブルには 3 億行、bmsql_stockには 1 億行のデータがあります。パフォーマンスメトリック: 1 秒あたりのトランザクション数 (TPS)。
このレポートの結果は TPC-C の実装に基づいており、このテストはすべての TPC-C ベンチマーク要件を満たしていないため、公式に公開されている TPC-C ベンチマーク結果とは比較できません。
テスト環境
テストクライアント (ECS インスタンス) と PolarDB-X インスタンスは、ネットワーク遅延を最小限に抑えるために、同じ VPC とリージョンにデプロイされます。
構成 | ECS インスタンス (クライアント) | PolarDB-X インスタンス (データベース) |
リージョン | 北京ゾーン I/H | 北京ゾーン I/H |
仕様 | 2 × ecs.c7.4xlarge (16 コア、32 GB) | 2 × 4 コア、32 GB |
4 × ecs.c7.4xlarge (16 コア、32 GB) | 4 × 8 コア、64 GB | |
イメージ/バージョン | Alibaba Cloud Linux 3.2104 LTS 64 ビット | polardb-2.4.0_5.4.19-20240927_xcluster5.4.19-20241010 |
テストシナリオ
さまざまなレベルのデータ秘密度をシミュレートするために、テストでは暗号化された列のさまざまな割合をカバーしています:
20% の列暗号化: ID や注文番号などの主要な識別子フィールドを暗号化します。
50% の列暗号化: 20% のシナリオに加えて、価格、日付、数量などのビジネス情報を暗号化します。
100% の列暗号化: すべてのテーブルのすべてのフィールドを暗号化します。
詳細なテスト結果
全体のパフォーマンス (100% 列暗号化 vs. プレーンテキスト)
すべての列を暗号化した場合、パフォーマンス (TPS) の低下はプレーンテキストと比較して一貫して約 10% です。
テスト結果
2 × (4 コア、32 GB)
同時実行数
プレーンテキスト TPS
100% 暗号化 TPS
パフォーマンスオーバーヘッド
64
80,223
72,248
10%
128
99,019
88,469
11%
256
105,309
94,756
10%
512
104,313
95,962
8%
1024
98,990
95,182
4%
4 × (8 コア、64 GB)
同時実行数
プレーンテキスト TPS
100% 暗号化 TPS
パフォーマンスオーバーヘッド
64
108,581
96,828
11%
128
184,293
167,380
9%
256
263,538
239,913
9%
512
292,481
252,741
13%
1024
284,561
252,432
11%
EncJDBC ドライバーのオーバーヘッド (プレーンテキストテスト)
EncJDBC ドライバーを使用すると、暗号化を行わなくても、クライアント側で CPU オーバーヘッドが発生します。
テスト条件
クライアントインスタンスタイプ (ECS インスタンス) は ecs.c7.4xlarge (16 コア、32 GB) で、同時実行数は 1024 です。
テスト結果
仕様 | CPU 使用率 | メモリ使用量 (MB) | ||||
標準 JDBC | EncJDBC | 標準 JDBC | EncJDBC | |||
2 × 4 コア、32 GB | 21.37% | 28.00% | +31% | 1077 | 1001 | -7.06% |
4 × 8 コア、64 GB | 47.09% | 69.90% | +48% | 1048 | 1024 | -2.29% |
暗号化有効後のクライアントリソース消費
100% の列暗号化を有効にすると、クライアント側の CPU 使用率が大幅に増加します。このオーバーヘッドを処理するために、アプリケーションに十分な CPU リソースがあることを確認してください。
テスト条件
同時実行数は 1024 です。
テスト結果
仕様 | CPU 使用率 (暗号化前) | CPU 使用率 (100% 暗号化) | CPU 増加率 |
2 × (4 コア、32 GB) | 13.01% | 33.45% | +157% |
4 × (4 コア、32 GB) | 20.60% | 32.07% | +56% |
2 × (8 コア、64 GB) | 19.93% | 36.77% | +85% |
4 × (8 コア、64 GB) | 17.73% | 43.59% | +146% |
結論
完全な暗号化を有効にすると、クライアント側の CPU 消費量が 56% から 157% 増加し、最大で 1.5 倍以上増加します。
さまざまな暗号化率がパフォーマンスとリソースに与える影響
暗号化された列の数は、パフォーマンスとクライアントの CPU 消費に直接影響します。以下の表は、暗号化された列の割合が増加するにつれて、パフォーマンスオーバーヘッドとクライアントの CPU 使用率がどのように変化するかを示しています。
テスト条件
同時実行数は 1024 です。
テスト結果
2 × (4 コア、32 GB)
暗号化率
クライアント CPU 使用率
TPS
パフォーマンスオーバーヘッド
20%
20.01%
96,792
2%
50%
22.23%
96,639
2%
100%
33.45%
95,182
4%
4 × (8 コア、64 GB)
暗号化率
クライアント CPU 使用率
TPS
パフォーマンスオーバーヘッド
20%
22.50%
276,640
3%
50%
28.80%
276,640
8%
100%
43.59%
276,640
11%
結論
セキュリティとパフォーマンスの最適なバランスを達成するために、必要な機密データ列のみを暗号化することをお勧めします。
付録: テスト手順
ステップ 1: ECS クライアントの準備
ECS インスタンスを準備します。この ECS インスタンスは、データのインポートやテストの実行など、後続の操作に使用されます。
ECS インスタンスに推奨されるアーキテクチャとオペレーティングシステム:
x86:
CentOS 7.9 以降。
Alibaba Cloud Linux 3。
Ubuntu 18.0 以降。
ARM: CentOS 8.0 以降。
テストに使用する ECS インスタンスを VPC にデプロイします。後続のすべてのインスタンスがこの VPC にデプロイされるため、この VPC の名前と ID をメモしておきます。
テストツールを操作するために、ECS インスタンスのパブリック IP アドレスを公開します。
ステップ 2: PolarDB-X インスタンスの準備
- 説明
PolarDB-X インスタンスを作成するときは、ECS インスタンスと同じ VPC にデプロイします。
ECS インスタンスの内部 IP アドレスを PolarDB-X インスタンスのホワイトリストに追加します。
インスタンスで、データベースを作成します。この例では
tpcc_1000を使用します。CREATE DATABASE tpcc_1000 MODE = 'auto';
ステップ 3: ベンチマークデータの準備
テストツールの準備
ECS インスタンスで、テストツールパッケージ benchmarksql.tar.gz をダウンロードして解凍します。
tar xzvf benchmarksql.tar.gz常時暗号化ドライバーパッケージ aliyun-encdb-mysql-jdbc-1.0.9-2-20240910.094626-1.jar をダウンロードし、
benchmarksql/libフォルダに移動します。
テストパラメーターの構成
benchmarksql/runフォルダに移動し、props.mysql構成ファイルを編集します。cd benchmarksql/run vi props.mysqlご使用の環境に合わせて構成を変更します。以下は構成例と主要なパラメーターの説明です:
db=mysql driver=com.aliyun.encdb.mysql.jdbc.EncDriver conn=jdbc:mysql:encdb://{HOST}:{PORT}/tpcc_1000_enc?/MEK={MEK}&ENC_ALGO={ENC_ALGO}&useSSL=false&useServerPrepStmts=false&useConfigs=maxPerformance&rewriteBatchedStatements=true user={USER} password={PASSWORD} warehouses=1000 loadWorkers=100 terminals=128 // 端末ごとに指定されたトランザクションを実行するには、runMins を 0 にする必要があります runTxnsPerTerminal=0 // 指定された分数だけ実行するには、runTxnsPerTerminal を 0 にする必要があります runMins=5 // 1 分あたりの合計トランザクション数 limitTxnsPerMin=0 // 4.x 互換モードで実行するには true に設定します。構成されたデータベース全体を均等に使用するには false に設定します。 terminalWarehouseFixed=true // 以下の 5 つの値の合計は 100 になる必要があります // 45, 43, 4, 4, 4 のデフォルトのパーセンテージは TPC-C 仕様に一致します newOrderWeight=45 paymentWeight=43 orderStatusWeight=4 deliveryWeight=4 stockLevelWeight=4 // 詳細な結果データを収集するために作成するディレクトリ名。 // これをコメントアウトすると抑制されます。 resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS // osCollectorScript=./misc/os_collector_linux.py // osCollectorInterval=1 // osCollectorSSHAddr=user@dbhost // osCollectorDevices=net_eth0 blk_sdaパラメーターの説明
conn: データベース接続文字列。{HOST}と{PORT}を置き換えます。{MEK}: マスター暗号化キー (MEK)。32 文字の 16 進数文字列です。{ENC_ALGO}: 対称暗号化アルゴリズム。例:SM4_128_GCM。user: データベースのユーザー名。password: データベースのパスワード。warehouses: TPC-C ウェアハウスの数。これにより、総データ量が決まります。loadWorkers: データインポート用の同時実行スレッド数。terminals: テスト用の同時実行スレッド数。runMins: テストの実行時間 (分)。
データのインポート
benchmarksql/runフォルダで、次のコマンドを実行してデータのインポートを開始します。cd benchmarksql/run/sql.common cp tableCreates.sql.auto tableCreates.sql cd .. nohup ./runDatabaseBuild.sh props.mysql &データ整合性の認証データがインポートされた後、コマンドラインから PolarDB-X インスタンスに接続し、次の SQL 文を実行してデータ整合性を検証します。すべてのクエリが空の結果セットを返した場合、データは正常にインポートされ、完全です。
SELECT a.* FROM (SELECT w_id, w_ytd FROM bmsql_warehouse) a LEFT JOIN (SELECT d_w_id, sum(d_ytd) AS d_ytd_sum FROM bmsql_district GROUP BY d_w_id) b ON a.w_id = b.d_w_id AND a.w_ytd = b.d_ytd_sum WHERE b.d_w_id IS NULL; SELECT a.* FROM (SELECT d_w_id, d_id, D_NEXT_O_ID - 1 AS d_n_o_id FROM bmsql_district) a LEFT JOIN (SELECT o_w_id, o_d_id, max(o_id) AS o_id_max FROM bmsql_oorder GROUP BY o_w_id, o_d_id) b ON a.d_w_id = b.o_w_id AND a.d_id = b.o_d_id AND a.d_n_o_id = b.o_id_max WHERE b.o_w_id IS NULL; SELECT a.* FROM (SELECT d_w_id, d_id, D_NEXT_O_ID - 1 AS d_n_o_id FROM bmsql_district) a LEFT JOIN (SELECT no_w_id, no_d_id, max(no_o_id) AS no_id_max FROM bmsql_new_order GROUP BY no_w_id, no_d_id) b ON a.d_w_id = b.no_w_id AND a.d_id = b.no_d_id AND a.d_n_o_id = b.no_id_max WHERE b.no_id_max IS NULL; SELECT * FROM (SELECT (count(no_o_id)-(max(no_o_id)-min(no_o_id)+1)) AS diff FROM bmsql_new_order GROUP BY no_w_id, no_d_id) a WHERE diff != 0; SELECT a.* FROM (SELECT o_w_id, o_d_id, sum(o_ol_cnt) AS o_ol_cnt_cnt FROM bmsql_oorder GROUP BY o_w_id, o_d_id) a LEFT JOIN (SELECT ol_w_id, ol_d_id, count(ol_o_id) AS ol_o_id_cnt FROM bmsql_order_line GROUP BY ol_w_id, ol_d_id) b ON a.o_w_id = b.ol_w_id AND a.o_d_id = b.ol_d_id AND a.o_ol_cnt_cnt = b.ol_o_id_cnt WHERE b.ol_w_id IS NULL; SELECT a.* FROM (SELECT d_w_id, sum(d_ytd) AS d_ytd_sum FROM bmsql_district GROUP BY d_w_id) a LEFT JOIN (SELECT w_id, w_ytd FROM bmsql_warehouse) b ON a.d_w_id = b.w_id AND a.d_ytd_sum = b.w_ytd WHERE b.w_id IS NULL;
ステップ 4: テストの実行
benchmarksql/run フォルダで、次のコマンドを実行して TPC-C テストを実行します。ターミナルには、1 分あたりのライブトランザクション数 (tpmC) が表示され、テスト完了後に最終的な平均値が出力されます。
cd benchmarksql/run
./runBenchmark.sh props.mysql