Atlas クラスターのサイズ設定と階層の選択
正しい Atlas クラスター階層と構成を選択することは、MongoDB の本番デプロイを成功させるための重要なステップです。クラスターは後でいつでも変更できますが、データセットのサイズとネットワーク要件に基づいていくつか計算するだけで、初めから適切な構成を実現できます。
また、クラスターの使用状況に応じてクラスター階層、ストレージ容量、またはその両方を自動的にスケーリングするようにクラスターを構成して、クラスターに必要な手動メンテナンスを減らすこともできます。詳細については、 クラスターのオートスケーリングを参照してください。
注意
本番環境での使用には M30 以上のクラスターを推奨
本番環境には M30 以上のクラスターが推奨されています。M10 および M20 クラスターは、低トラフィックアプリケーションの実稼働環境として使用できます。 M10 および M20 で持続的な負荷がかかるクラスターでは、時間の経過とともにパフォーマンスが低下する可能性があります。
クラスターの自動スケーリング
専有クラスターはクラスターのオートスケーリングをサポートします 。クラスター階層のオートスケーリングは、ユーザー インターフェイスで新しいクラスターを作成するとデフォルトで有効になります。 APIで新しいクラスタを作成する場合は、デフォルトで無効になります。 オートスケーリングを有効にすると、Atlas ではクラスターの使用状況に応じて、クラスター層、ストレージキャパシティー、またはその両方が自動的にスケーリングされます。 オートスケーリングにより、クラスターを現在のワークロードに適応させ、手動で最適化する必要性を減らすことができます。
クラスターストレージのスケーリングでは、ディスクキャパシティーの 90% が使用されると、クラスターストレージのキャパシティーが自動的に追加されます。この設定はデフォルトで有効になっており、クラスターが突然のデータの流入にいつでも対応できるようにしています。クラスターストレージのスケーリングをオプトアウトするには、Auto-scale セクションの Storage Scaling チェックボックスのチェックを外します。
クラスター階層のスケーリングでは、さまざまなクラスターメトリクスに応じてクラスター階層が自動的にスケールアップまたはスケールダウンされます。クラスター階層のオートスケーリングをオプトアウトするには、Auto-scale セクションの Cluster Tier Scaling チェックボックスをオフにします。
Atlas がクラスターをオートスケールする方法をコントロールするには、以下を設定します。
クラスターが自動的にスケールアップできる最大のクラスター階層。デフォルトでは、この設定は現在のクラスター階層の次のクラスター階層に設定されています。
クラスターをスケールダウンできる最小のクラスター階層。デフォルトでは、この設定は現在のクラスター階層に設定されています。
メモリ
メモリとは、Atlas クラスターの各 データを保持するノードで使用可能な物理RAMの合計を指します。例、 M30
標準レプリカセットは、3 データを保持するノードのそれぞれに 8 GBのRAMを使用して構成されます。
Atlasは WiredTiger ストレージ エンジン を使用します。
デフォルトでは、M40 以上のクラスターの場合、WiredTiger は物理 RAM の 50% 以上を WiredTiger キャッシュ専用にします。残りのメモリは、次の用途のために保留されています。
ソートや計算などのインメモリ操作
基礎となるオペレーティング システムとその他のシステム サービス
デフォルトでは、M30 以下のクラスターの場合、WiredTiger により物理 RAM の 25% が WiredTiger キャッシュ専用として割り当てられます。
メモリ使用量について詳しくは「WiredTiger とメモリ使用量」を参照してください。
MongoDB では、最近使用したデータとインデックスの保持のために WiredTiger キャッシュが使用されます。ワーキングセットは、すべてのインデックスに、頻繁にアクセスされるドキュメントのセットを合わせたものです。ワーキングセットが RAM に収まる場合、MongoDB ではメモリからクエリに対応できるため、クエリの応答時間が最も短くなります。
ワーキングセットのサイズを見積もるには、db.stats()
から取得した情報を使用して合計インデックススペースを算出した上で頻繁にアクセスされるデータスペースの割合を想定するか、前例に基づいてメモリ要件を見積もります。
例: Atlas サンプルデータセット
Atlas サンプルデータセットを使用して、これらすべてのデータベースを単独の Atlas クラスターで実行するためのメモリ要件を計算します。次の JavaScript プログラムでは、クラスターのデータベース情報が返されます:
var totalIndexSize = 0; var totalDataSize = 0; var reservedDBs = ["admin","config","local"]; // Switch to admin database and get list of databases. db = db.getSiblingDB("admin"); dbs = db.runCommand({ "listDatabases": 1 }).databases; // Iterate through each database and get its stats. dbs.forEach(function(database) { if (reservedDBs.includes(database.name)) return; db = db.getSiblingDB(database.name); print("Obtaining stats for " + database.name); var stats = db.stats(); totalIndexSize += (stats.indexSize / (1024*1024*1024)) ; totalDataSize += (stats.dataSize / (1024*1024*1024)) ; }); print ("Total data size in GB: " + totalDataSize.toFixed(2)); print ("Total index size in GB: " + totalIndexSize.toFixed(2));
このプログラムでは次の結果が返されます。
Obtaining stats for sample_airbnb Obtaining stats for sample_geospatial Obtaining stats for sample_mflix Obtaining stats for sample_supplies Obtaining stats for sample_training Obtaining stats for sample_weatherdata Total data size in GB: 0.32 Total index size in GB: 0.02
これらのデータベースを完全にメモリ内で実行するには、少なくとも 0.68 GB の物理 RAM が必要です。WiredTiger が物理 RAM の 50% を使用し、ワーキングセットをメモリに収めるために少なくとも 0.34 GB が必要となるためです。
実際の本番クラスターでは、データとインデックスのサイズがはるかに大きくなることがあり、データセット全体とインデックスをメモリ内で動作させるのは現実的ではないか、ビジネス上またはパフォーマンス上の要件にはならない場合もあります。別のシナリオを見てみます。
例:モバイルアプリ
ある人気のモバイルゲームには 512 GB のデータと 32 GB のインデックスがありますゲームの内部システムデータが 16 GB を占め、残りはプレイヤーのプロファイルデータです。プレイヤーがゲーム内でアクティブである間は、プレイヤーのプロファイルはメモリ内に存在している必要があります。どの時点でも、全プレイヤーのうち約 25 % がアクティブです。システムデータは常時使用されており、ゲームパフォーマンスを最適に保つため RAM 内に完全に収める必要があります。クエリの応答時間を最短に保つため、インデックスも全て RAM に収める必要があります。メモリのサイズ設定は次のとおりです。
データ | RAM要件 | WiredTiger キャッシュ用の RAM |
---|---|---|
システム:16 GB | RAM 100 % | 16 GB |
Index: 32 GB | RAM 100 % | 32 GB |
プレイヤープロファイル:496 GB | RAM 25 % | 124 GB |
これらの要件を考慮すると、平均的なワーキングセットには 172 GB の RAM が必要になることが予想されます。
WiredTiger は物理 RAM の 50% を WiredTiger キャッシュ専用にするため、ワーキングセットを格納するために必要な物理 RAM の最小合計はワーキングセットの 2 倍になります。
この例では、WiredTiger キャッシュと 172 GB のワーキングセットを格納するために、少なくとも 344 GB の物理 RAM が必要です。次の表では適切な Atlas クラスター階層をまとめています。
サービスプロバイダー | クラスター階層の選択肢 | ノート |
---|---|---|
Amazon Web Services |
| M300 十分な RAM があり、より高いクラスター階層への垂直スケーリングの余地があります。 |
GCP |
| M300 十分な RAM がありますが、垂直スケーリングが必要な場合に利用できる上位階層はありません。 |
Azure |
| M300 十分な RAM があり、より高いクラスター階層への垂直スケーリングの余地があります。 |
注意
256 GB RAM の Azure M200
など、十分な RAM のないクラスター階層を選択した場合は、シャーディングが必要です。
ネットワークトラフィック
Atlas クラスターからのデータを消費するクラスターノード間およびクライアント間のすべてのネットワークトラフィックは、ネットワーク帯域幅に影響を与えます。クラスターのサイジングに関しては、クラスター上の任意のノードが処理することになるトラフィックの最大量を検討して、それを基に適切な Atlas クラスター階層を選択します。
クラスターからクライアント アプリケーションという下流へのデータ転送速度は、一定期間に返されたドキュメントの合計として計算できます。プライマリ ノードからのみ読み取る場合は、この計算のみを実行する必要があります。アプリケーションがセカンダリ ノードからも読み取る場合は、この数を読み取り操作を処理できるノードの数で割ることができます。
db.stats()
メソッドを使用して、データベースの平均ドキュメント サイズを調べることができます。平均ドキュメントサイズ (avgObjSize
) に、1 秒あたりに提供されるドキュメントの数を掛けて、必要な帯域幅を見積もります。
例
平均ドキュメントサイズ 10 KB
毎秒 100,000 ドキュメントを提供
10 KB * 100,000 = 1 GB/秒
Atlas インスタンスでは、上位階層ほど帯域幅速度が向上します。AWS によってサポートされるインスタンスでは、 M30
レベルで最大 10 ギガビット / 秒をを実現し、 M200
レベルでは最大 25 ギガビット / 秒を提供します。
接続
1つの Atlas クラスターがサポートできるクライアント接続の数は、クラスター階層に応じて決まっています。 たとえば、 M30
クラスターは最大3000の同時接続をサポートし、 M200
クラスターは最大128 、 000の同時接続をサポートします。 詳細については、「接続制限とクラスター階層 」を参照してください。