Atlas のスケーラビリティに関する機能
自動スケーリングにより、クラスターはリアルタイムの使用状況に応じて、階層、ストレージ キャパシティー、またはその両方を自動的に調整します。Atlas は CPU とメモリの使用率を分析し、クラスター階層をスケールアップまたはスケールダウンするタイミングと必要性を決定します。Atlas がクラスター ノードをスケールアップまたはスケールダウンする条件に関する詳細は、「クラスター階層のスケーリング」をご覧ください。また、クラスターの最低限のパフォーマンスを保証したり、コストを管理したりするために、クラスターが自動的にスケーリングできる最大および最小のクラスターサイズの範囲を指定することもできます。新しい階層が指定したサイズ範囲外であるか、メモリ使用量が新しい階層のキャパシティーを超える場合、Atlas はクラスターのスケーリングを行いません。自動スケーリングは、アプリケーションに影響を与えないように、クラスター階層のスケールアップまたはスケールダウンを遅延させて調整されます。したがって、データベースが使用量で圧倒されるような急上昇ではなく、安定して増減するアプリケーション負荷に最適です。ワークロードが頻繁に急増する場合、またはイベントやローンチによってトラフィックが大幅に増加することが予想される場合、MongoDB は、事前にプログラムでスケーリングすることを推奨します。
「推奨される配置トポロジー」で参照されている Atlas の配置テンプレートには、水平および垂直方向のスケーリングオプションが用意されています。具体的には、シャーディングは多数のマシンにデータを分散させるものであり、1 台のサーバーではワークロードを処理できない場合に有用です。シャーディングはシェアードナッシングアーキテクチャに従います。これは、どのノードも互いにリソースを共有しない分散型コンピューティングアーキテクチャです。MongoDB がドキュメントをクラスター全体に均等に分散させながら、一般的なクエリパターンを促進できる理想的なシャードキーの選択については、「シャードキーの選択」をご覧ください。さらに、「Performance のベストプラクティス: シャーディング」を参照して、範囲ベースのシャーディング、ハッシュされたシャーディング、ゾーンシャーディングなどの主要なシャーディング戦略についてご確認ください。
Atlas クラスターを次の利用可能な Atlas 階層にアップグレードするには、Atlas コントロール プレーン GUI、Atlas 管理API、または IaC ツール(Atlas Kubernetes Operator、MongoDB および HashiCorp Terraform、Atlas CLI など)を使用できます。詳細については、「Atlas の自動化されたインフラストラクチャのプロビジョニングに関するガイダンス」を参照してください。Atlas の階層を変更する際、それがアップスケーリングでもダウンスケーリングでも、ダウンタイムは発生しません。階層はローリング方式で変化します。これには、代替ノードとしてセカンダリを選出し、このセカンダリを新しいプライマリに昇格させ、障害が発生したノードを復元または交換して、クラスターができるだけ早く目標の構成に戻るようにします。水平スケーリングは、プログラム スクリプトからトリガーできる管理者のアクションに基づいて、配置後に行われます。一部のクラスター テンプレートには、シャーディングされたクラスターが必要です。MongoDB バージョン 8.0 以降では、埋め込みコンフィギュレーションサーバーを利用して、小規模なシャーディングされたクラスターのコンフィギュレーションサーバーに関連するコストを削減できます。
Atlas の低 CPU オプションは、より多くのメモリを必要とする一方で、処理能力をそれほど必要としないアプリケーションに役立ちます。このオプションは、同じクラスターサイズの General 階層と比較して、インスタンスに半分の vCPU を提供するため、メモリ集約型であるものの CPU に依存しないワークロードのコストを削減します。
データの階層化とアーカイブにより、低コストのストレージにデータをアーカイブしつつ、ライブクラスターデータと共にクエリを実行できます。これは、特に長期的な記録保持に役立ちます。このプロセスを最適化するために、MongoDB は、シンプルで構成しやすいルールを使用してデータのアーカイブを自動化することを推奨します。「データのアーカイブ」を参照して、アーカイブ化のルールで指定できる基準の詳細をご確認ください。データ保持の優先順位が高くないシナリオでは、Atlas は日付を基準として未使用のデータを自動的に削除するオプションを提供します。アクセス頻度の低いデータに対して、TTL インデックスは、指定された期間の後または設定された時刻に、コレクションからドキュメントを自動的に削除する特別な単一フィールドインデックスです。これは、ログ、セッション情報、イベントデータなど、限られた時間だけ保持する必要があるデータには特に有効です。TTL インデックスを作成するには、日付値を保持するフィールドにインデックスを定義し、秒単位で保持期間を指定します。
Atlas は、インデックスの追加または削除、クライアントのクエリ構造の変更により、非効率的なクエリを識別して最適化するための Performance Advisor などの自動ツールも提供します。Performance Advisor の実行可能な推奨事項に従うことで、不要なコンピューティング時間とリソースの消費を削減し、クエリのパフォーマンスを向上させることができます。さらに、Atlas が提供するインテリジェントなインデックス推奨機能を活用して、データ検索効率をさらに向上させ、データベース操作に必要なリソースを最小限に抑えることができます。
Atlas のスケーラビリティに関する推奨事項
シングルリージョンの配置では、シングルクラウド リージョン内でのパフォーマンスを最適化するために、垂直スケーリング戦略に重点を置いてください。
コンピュートとストレージの両方に対してオートスケーリングを有効にし、手動による介入なしで段階的なトラフィックの増加に対応してください。
データセットが 1 つのリージョン内でも 1 つのサーバーのキャパシティーを超える場合は、シャーディングを使用して、複数のシャード間で負荷を分散します。
高いプロセシング能力を必要としないメモリ集約型ワークロードには、低CPUインスタンス オプションを検討してください。
履歴データについては、データ階層化とアーカイブを実装することで、ストレージ コストを削減しつつクエリ機能を維持してください。
Performance Advisor でクエリのパフォーマンスをモニターし、リソース使用を最適化するために推奨する インデックス を実装します。
予期されるトラフィックの急増に備えてクラスターを事前にスケールしてください。突発的な負荷増大に対して自動スケーリングのみに依存することは避けてください。
マルチリージョンおよびマルチクラウド配置では、地理的分散やクロス クラウドの複雑性に対応するスケーリング戦略を実装してください。
ユーザーに最も近いリージョンに読み取りレプリカを設定してレイテンシを削減し、読み取りワークロードを地理的に分散します。
ゾーン シャーディングを使用して、地理的または論理的な境界に基づいてデータを分割し、データのローカリティおよびコンプライアンス要件を満たしてください。
ローカルの読み取りと書込みを使用して グローバルクラスター を実装し、データの一貫性を維持しつつリージョン全体のパフォーマンスを最適化します。
ネットワーク レイテンシをモニターし、リージョン間でレプリカの優先度を調整して、最適なフェイルオーバー動作を確保してください。
クロスリージョンのデータ転送コストの影響を考慮し、複数リージョンにまたがるオートスケーリングを実装する際には注意してください。
異なるリージョンで異なるクラスター階層を使用し、地域ごとの使用パターンおよびコスト最適化戦略に基づいて調整してください。
リージョン固有のバックアップおよびアーカイブ戦略を実装し、データ所在地要件に準拠してください。。
すべての配置パラダイムに共通する推奨事項
以下の推奨事項は、すべての配置パラダイムに適用されます。
開発環境およびテスト環境では、オートスケーリングコンピュートとオートスケーリングストレージを有効にしないでください。これにより、非本番環境でのコストを削減できます。
ステージング環境および本番環境では、次のことが推奨されます。
アプリケーションが小規模から中規模へと有機的に成長するインスタンスに対して、計算能力およびストレージの自動スケーリングを有効にします。
コードツールとして インフラストラクチャ を使用する場合は、 設定を活用して、オートスケーリングによるリソースドリフトを無視します。例、Terraform では、
disk_gb_enabledが true の場合、Atlas はディスク サイズを自動的に増やすアップまたはスケールダウンします。これにより、返されるdisk_size_gbの値は Terraform 構成で指定されている値と異なる可能性があり、その後プランが適用されると、Terraform はクラスターのディスク サイズを元のdisk_size_gb値に増やすします。これを防ぐには、ライフサイクルのカスタマイズを使用する必要があります。つまり、lifecycle { ignore_changes = [disk_size_gb] }です。同様に、Terraform では、
compute_enabledが true の場合、Atlas は指定された最大値まで自動的にスケールアップし、指定された最小値まで自動的にスケールダウンします。これにより、返されるprovider_instance_size_nameの値が Terraform config で指定された値と異なる可能性があり、この点に注意せずにプランを適用すると、Terraform はクラスターを元のinstanceSizeNameの値に戻します。これを防ぐには、ライフサイクルのカスタマイズを使用する必要があります。すなわち、lifecycle { ignore_changes = [provider_instance_size_name] }です。
オートメーションの例: Atlas のスケーラビリティ
Tip
すべてのピリオドにわたって推奨事項を強制する Terraform の例については、 Githubの次のいずれかの例を参照してください。
次の例では、Atlas のオートメーション ツールを使用して、オートスケーリング コンピューティングとストレージを有効にします。
これらの例では、次のようなその他の推奨される構成も適用されます。
開発およびテスト環境用にクラスター階層が
M10に設定されました。クラスター サイズ ガイドを使用して、アプリケーションのサイズに合った推奨クラスター階層を確認してください。単一リージョン、3 ノード レプリカ セットまたはシャード配置トポロジー。
当社の例では、AWS、Azure、および Google Cloud を互換的に使用します。これら 3 つのクラウド プロバイダーのいずれかを使用できますが、クラウド プロバイダーに一致するようにリージョン名を変更する必要があります。クラウドプロバイダーとそのリージョンに関する詳細は、「クラウドプロバイダー」をご覧ください。
中規模アプリケーション用のクラスター階層が
M30に設定されました。クラスター サイズ ガイドを使用して、アプリケーションのサイズに合った推奨クラスター階層を確認してください。単一リージョン、3 ノード レプリカ セットまたはシャード配置トポロジー。
当社の例では、AWS、Azure、および Google Cloud を互換的に使用します。これら 3 つのクラウド プロバイダーのいずれかを使用できますが、クラウド プロバイダーに一致するようにリージョン名を変更する必要があります。クラウドプロバイダーとそのリージョンに関する詳細は、「クラウドプロバイダー」をご覧ください。
注意
Atlas CLI を使用してリソースを作成する前に、次の手順を実行する必要があります。
Programmatic Useの手順に従って Atlas CLI から接続します。
プロジェクトごとに 1 つのデプロイメントを作成
開発およびテスト環境では、コストを節約するためにコンピューティングおよびストレージのオートスケーリングが無効になっています。
ステージング環境と本番環境において、各プロジェクトごとに次の cluster.json ファイルを作成します。ID と名前を変更して、自分の値を使用します。
{ "clusterType": "REPLICASET", "links": [], "name": "CustomerPortalProd", "mongoDBMajorVersion": "8.0", "replicationSpecs": [ { "numShards": 1, "regionConfigs": [ { "electableSpecs": { "instanceSize": "M30", "nodeCount": 3 }, "priority": 7, "providerName": "GCP", "regionName": "EASTERN_US", "analyticsSpecs": { "nodeCount": 0, "instanceSize": "M30" }, "autoScaling": { "compute": { "enabled": true, "scaleDownEnabled": true }, "diskGB": { "enabled": true } }, "readOnlySpecs": { "nodeCount": 0, "instanceSize": "M30" } } ], "zoneName": "Zone 1" } ] }
cluster.json ファイルを作成した後、各プロジェクトで次のコマンドを実行します。このコマンドは、cluster.json ファイルを使用してクラスターを作成します。
atlas cluster create --projectId 5e2211c17a3e5a48f5497de3 --file cluster.json
その他の構成オプションとこの例に関する情報については「atlas clusters create」を参照してください。
注意
プロジェクトとデプロイメントを作成する
開発およびテスト環境では、コストを節約するためにコンピューティングおよびストレージのオートスケーリングが無効になっています。
ステージング環境と本番環境において、各アプリケーションと環境のペアごとに以下のファイルを作成します。各アプリケーションと環境のペアごとに、それぞれのディレクトリ内でファイルを配置します。ID、名前、ディスク サイズを変更して、自分の値を使用します。
main.tf
# Create a Group to Assign to Project resource "mongodbatlas_team" "project_group" { org_id = var.atlas_org_id name = var.atlas_group_name usernames = [ "user1@example.com", "user2@example.com" ] } # Create a Project resource "mongodbatlas_project" "atlas-project" { org_id = var.atlas_org_id name = var.atlas_project_name # Assign the Project the Group with Specific Roles teams { team_id = mongodbatlas_team.project_group.team_id role_names = ["GROUP_READ_ONLY", "GROUP_CLUSTER_MANAGER"] } } # Create an Atlas Advanced Cluster resource "mongodbatlas_advanced_cluster" "atlas-cluster" { project_id = mongodbatlas_project.atlas-project.id name = "ClusterPortalProd" cluster_type = "REPLICASET" mongo_db_major_version = var.mongodb_version replication_specs { region_configs { electable_specs { instance_size = var.cluster_instance_size_name node_count = 3 } priority = 7 provider_name = var.cloud_provider region_name = var.atlas_region } } tags { key = "BU" value = "ConsumerProducts" } tags { key = "TeamName" value = "TeamA" } tags { key = "AppName" value = "ProductManagementApp" } tags { key = "Env" value = "Production" } tags { key = "Version" value = "8.0" } tags { key = "Email" value = "marissa@acme.com" } } # Outputs to Display output "atlas_cluster_connection_string" { value = mongodbatlas_advanced_cluster.atlas-cluster.connection_strings.0.standard_srv } output "project_name" { value = mongodbatlas_project.atlas-project.name }
注意
マルチリージョンクラスターを作成するには、各リージョンをそれぞれ独自のregion_configs で指定し、それらをreplication_specs オブジェクトにネストします。以下の例をご覧ください。
replication_specs { region_configs { electable_specs { instance_size = "M10" node_count = 2 } provider_name = "GCP" priority = 7 region_name = "NORTH_AMERICA_NORTHEAST_1" } region_configs { electable_specs { instance_size = "M10" node_count = 3 } provider_name = "GCP" priority = 6 region_name = "WESTERN_US" } }
variables.tf
# Atlas Organization ID variable "atlas_org_id" { type = string description = "Atlas Organization ID" } # Atlas Project Name variable "atlas_project_name" { type = string description = "Atlas Project Name" } # Atlas Project Environment variable "environment" { type = string description = "The environment to be built" } # Cluster Instance Size Name variable "cluster_instance_size_name" { type = string description = "Cluster instance size name" } # Cloud Provider to Host Atlas Cluster variable "cloud_provider" { type = string description = "AWS or GCP or Azure" } # Atlas Region variable "atlas_region" { type = string description = "Atlas region where resources will be created" } # MongoDB Version variable "mongodb_version" { type = string description = "MongoDB Version" } # Storage Auto-scaling Enablement Flag variable "auto_scaling_disk_gb" { type = boolean description = "Flag that specifies whether disk auto-scaling is enabled" } # Compute Auto-scaling Enablement Flag variable "auto_scaling_compute" { type = boolean description = "Flag that specifies whether cluster tier auto-scaling is enabled" } # Disk Size in GB variable "disk_size_gb" { type = int description = "Disk Size in GB" }
terraform.tfvars
atlas_org_id = "32b6e34b3d91647abb20e7b8" atlas_project_name = "Customer Portal - Prod" environment = "prod" cluster_instance_size_name = "M30" cloud_provider = "AWS" atlas_region = "US_WEST_2" mongodb_version = "8.0" auto_scaling_disk_gb_enabled = "true" auto_scaling_compute_enabled = "true" disk_size_gb = "40000"
provider.tf
# Define the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" } } required_version = ">= 0.13" }
ファイルを作成した後、各アプリケーションと環境ペアのディレクトリに移動し、次のコマンドを実行して Terraform を初期化します。
terraform init
Terraform プランを表示するには、次のコマンドを実行します。
terraform plan
lifecycle ブロックを追加して disk_size_gb と instant_size を明示的に変更した後、lifecycle ブロックをコメントアウトして terraform apply を実行します。完了したら、誤って変更しないように、lifecycle ブロックのコメントを必ず外します。
次のコマンドを実行して、アプリケーションと環境のペアに対して 1 つのプロジェクトと 1 つのデプロイメントを作成します。コマンドは、ファイルと MongoDB & HashiCorp Terraform を使用して、プロジェクトとクラスターを作成します。
terraform apply
プロンプトが表示されたら、yes を入力し、Enter を押して設定を適用します。
この例に関するその他の設定オプションや情報については、「MongoDB & HashiCorp Terraform」およびMongoDB Terraform のブログ記事をご覧ください。