チェーンレプリケーションはプライマリーノードの負荷を軽減できますが、レプリケーションラグが増加する可能性があります。本ドキュメントでは、3、7、15 ノードの ApsaraDB for MongoDB レプリカセットインスタンスにおけるパフォーマンスへの影響をベンチマーク測定し、最適な構成の選択を支援します。
チェーンレプリケーション
チェーンレプリケーションとは
MongoDB はチェーンレプリケーションをサポートしています。チェーンレプリケーションは、レプリカセット内のセカンダリノードが別のセカンダリノードからデータを同期する際に発生します。これにより、プライマリノードの負荷を軽減できますが、特定のネットワークトポロジではレプリケーションラグが増加する可能性があります。詳細については、「Self-Managed Chained Replication」をご参照ください。
チェーンレプリケーションでは、すべてのノードが単一のチェーンを形成する必要はありません。セカンダリノードは、ラウンドトリップタイム (RTT) などのメトリクスに基づいて、プライマリノード以外の同期ソースを選択できます。次の図は、チェーンレプリケーションを使用するいくつかの 5 ノードレプリカセットトポロジを示しています。
チェーンレプリケーションの設定
コンソールの パラメーター設定 ページで settings.chainingAllowed パラメーターを調整することで、チェーンレプリケーションを有効または無効にできます。パラメーターの調整方法の詳細については、「データベースパラメーターの設定」をご参照ください。
チェーンレプリケーションによってレプリケーションラグが発生した場合は、この機能を無効にすることで同期パフォーマンスを最適化できます。
セキュリティ上の理由から、ApsaraDB for MongoDB インスタンスで replSetReconfig コマンドを実行することはできません。コンソールでパラメーターを変更する必要があります。
インスタンスのパフォーマンスへの影響テスト
テスト環境
Elastic Compute Service (ECS) インスタンスと ApsaraDB for MongoDB レプリカセットインスタンスを作成します。詳細については、「レプリカセットインスタンスの作成」および「ウィザードを使用したECSインスタンスの作成」をご参照ください。
-
ApsaraDB for MongoDB インスタンスアーキテクチャ:プライマリノード 1 台、セカンダリノード 1 台、非表示ノード 1 台で構成される標準の 3 ノードレプリカセット。より大きな構成には、追加のセカンダリノードと読み取り専用ノードが含まれます。
-
ECS インスタンスと ApsaraDB for MongoDB インスタンス間のネットワークラウンドトリップタイム (RTT):両インスタンスが同じリージョンおよびゾーンにある場合、平均 0.103 ms。
次の表に、このテストで使用したインスタンス構成を示します。
|
パラメーター |
ECS インスタンス |
ApsaraDB for MongoDB インスタンス |
|
リージョンとゾーン |
中国 (北京) ゾーンH |
中国 (北京) ゾーンH |
|
ネットワークタイプ |
VPC |
VPC |
|
インスタンスファミリー |
コンピューティング最適化 c6 |
専用 |
|
インスタンスタイプ |
ecs.c6.xlarge (4 vCPU, 8 GiB) |
ecs.c7.xlarge (4 vCPU, 8 GiB) |
|
ストレージタイプ |
Elastic Simple Storage Device (ESSD) PL0 |
ESSD PL1 |
|
オペレーティングシステム |
Alibaba Cloud Linux 3.2104 LTS 64 ビット |
4.19.91-26.al7.x86_64 |
|
MongoDB バージョン |
N/A |
メジャーバージョン:5.0 マイナーベースラインバージョン:5.0.30 |
テストツール
このテストでは、オープンソースの YCSB 0.17.0 ベンチマークツールを使用します。
Yahoo! Cloud Serving Benchmark (YCSB) は、データベースのパフォーマンスをベンチマークするための Java ベースのツールです。インストールと使用方法については、公式のYCSBリポジトリをご参照ください。
手順
-
IPアドレスをホワイトリストに追加します。ECS コンソールにログインし、インスタンス詳細ページで ECS インスタンスのプライマリプライベートIPアドレスを見つけ、ApsaraDB for MongoDB インスタンスのホワイトリストに追加します。
-
YCSB を使用してテストデータをロードします。
./bin/ycsb.sh load mongodb -s -p workload=site.ycsb.workloads.CoreWorkload -p recordcount=5000000 -p mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin" -p table=test -threads 8パラメーター:
-
recordcount:ApsaraDB for MongoDB インスタンスにロードするレコードの総数。 -
mongodb.url:ApsaraDB for MongoDB インスタンスの接続文字列。このテストでは、データベースアカウントはtest、データベースはadminです。接続文字列は、ApsaraDB for MongoDB コンソールの [内部接続 - VPC] セクションの Database Connection ページで確認できます。 -
threads:同時クライアントスレッドの数。
-
-
YCSB のテスト結果とインスタンスのモニタリングデータを表示します。Monitoring Information ページで、[ノードモニタリング] タブに移動します。テストの時間範囲を選択し、プライマリノードの [CPU 使用率]、[QPS および平均応答時間] のメトリクスを表示します。詳細については、「ノードモニタリング (旧基本モニタリング)」をご参照ください。
テスト結果
パラメーター
書き込み懸念:書き込み操作に対して MongoDB から要求される確認レベル。このテストでは、次の値を使用します:
-
{w:"majority"}:デフォルト設定。書き込みは、レプリカセット内の投票ノードの過半数に複製された後に確認されます。 -
{w: 1}:書き込みは、プライマリノードが確認した後に確認されます。
詳細なテスト結果
3 ノードインスタンス
レプリカセットトポロジ:プライマリノード 1 台、セカンダリノード 1 台、非表示ノード 1 台。
書き込み懸念:{w:"majority"}
|
項目 |
チェーンレプリケーション有効 |
チェーンレプリケーション無効 |
|
スループット (ops) |
5277 |
5241 |
|
CPU 使用率 |
65% |
65% |
|
QPS (カウント) |
|
|
|
平均応答時間 (μs) |
|
|
書き込み懸念:{w:1}
|
項目 |
チェーンレプリケーション有効 |
チェーンレプリケーション無効 |
|
スループット (ops) |
15075 |
14785 |
|
CPU 使用率 |
93% |
93% |
|
QPS (カウント) |
|
|
|
平均応答時間 (μs) |
|
|
7 ノードインスタンス
レプリカセットトポロジ:プライマリノード 1 台、セカンダリノード 5 台、非表示ノード 1 台。
書き込み懸念:{w:"majority"}
|
項目 |
チェーンレプリケーション有効 |
チェーンレプリケーション無効 |
|
スループット (ops) |
3005 |
4312 |
|
CPU 使用率 |
56% |
85% |
|
QPS (カウント) |
|
|
|
平均応答時間 (μs) |
|
|
書き込み懸念:{w:1}
|
項目 |
チェーンレプリケーション有効 |
チェーンレプリケーション無効 |
|
スループット (ops) |
14414 |
11492 |
|
CPU 使用率 |
91% |
93% |
|
QPS (カウント) |
|
|
|
平均応答時間 (μs) |
|
|
15 ノードインスタンス
レプリカセットトポロジ:プライマリノード 1 台、セカンダリノード 5 台、非表示ノード 1 台、読み取り専用ノード 8 台。
この構成には、7 つの投票ノードと 8 つの非投票ノードがあります (読み取り専用ノードは投票しません)。
書き込み懸念:{w:"majority"}
|
項目 |
チェーンレプリケーション有効 |
チェーンレプリケーション無効 |
|
スループット (ops) |
2932 |
3123 |
|
CPU 使用率 |
58% |
91% |
|
QPS (カウント) |
|
|
|
平均応答時間 (μs) |
|
|
書き込み懸念:{w:1}
|
項目 |
チェーンレプリケーション有効 |
チェーンレプリケーション無効 |
|
スループット (ops) |
14093 |
7500 |
|
CPU 使用率 |
90% |
94% |
|
QPS (カウント) |
|
|
|
平均応答時間 (μs) |
|
|
パフォーマンスの比較とまとめ
-
ノード数が固定の場合、書き込み懸念の設定によって、チェーンレプリケーションを無効にすると書き込みパフォーマンスが低下するかどうかが決まります。
書き込み懸念:
{w:1}-
3 ノードインスタンスの場合、チェーンレプリケーションを無効にした場合のパフォーマンス低下はごくわずかです。
-
7 ノードインスタンスの場合、チェーンレプリケーションを無効にすると、パフォーマンスが約 20.3% 低下します。
-
15 ノードインスタンスの場合、パフォーマンスは 46.8% 低下し、プライマリノードの CPU 使用率が大幅に増加します。
書き込み懸念:
{w:"majority"}-
3 ノードインスタンスの場合、チェーンレプリケーションを無効にした場合のパフォーマンス低下はごくわずかです。
-
7 ノードおよび 15 ノードのインスタンスの場合、チェーンレプリケーションを無効にすると、パフォーマンスが約 6.5% から 43.5% 向上します。
パフォーマンス向上の理由:チェーンレプリケーションを無効にすると、レプリカセット内のすべてのノードの同期パスが短縮され、過半数条件を満たしやすくなり、各書き込み操作のレイテンシが短縮されます。
非投票ノードの影響:投票ノードの数が 7 つに固定されている場合、プライマリノードのレプリケーション負荷が増加するため、非投票ノードを追加するほど、チェーンレプリケーションを無効にすることによるパフォーマンスの向上は減少します。
-
-
chainingAllowedとwriteConcernの設定が同じ場合、ノード数が増えるにつれて書き込みパフォーマンスは低下します。この低下は、チェーンレプリケーションを無効にした場合により顕著になります。-
デフォルト設定 (
chainingAllowed:trueおよびwriteConcern:{w:"majority"}) では、レプリカセットの投票メンバーは最大 7 つであるため、過半数条件は変わらず、7 ノードから 15 ノードに拡張してもパフォーマンスの低下は大きくありません。 -
チェーンレプリケーションが有効かどうかにかかわらず、
writeConcern:{w:1}のパフォーマンスはwriteConcern:{w:"majority"}よりも大幅に優れています。これは、書き込み懸念の仕組みを考えると想定内の結果です。 -
書き込み懸念の設定が固定されている場合、チェーンレプリケーションを無効にすると、有効にした場合と比べて、ノード数が増えるにつれてプライマリノードの CPU 使用率が大幅に増加します。
-
ベストプラクティス
-
ノード数が少ないデプロイメントの場合、チェーンレプリケーションを有効または無効にしても、インスタンスのパフォーマンスや CPU 使用率に大きな影響はありません。
-
ノード数が多いデプロイメントの場合:
-
writeConcernが{w:1}の場合は、チェーンレプリケーションを有効にすることを推奨します。 -
writeConcernが{w:"majority"}の場合は、プライマリノードの負荷 (CPU 使用率など) とインスタンスのパフォーマンスのバランスを取る必要があります。チェーンレプリケーションを無効にすると、書き込みパフォーマンスは向上しますが、プライマリノードの負荷が大幅に増加します。
-























