高可用性とは、インフラストラクチャの停止やシステムのメンテナンスなどの中断時に、継続的な操作を確保し、ダウンタイムを最小限に抑えるアプリケーションの能力です。 MongoDB のデフォルトの配置アーキテクチャは、 データの冗長性 と 自動フェイルオーバー のための組み込み機能を備えており、高可用性向けに設計されています。このページでは、ゾーン、リージョン、およびクラウドプロバイダーの停止時に中断を防ぎ、堅牢なフェイルオーバーメカニズムをサポートするために選択できる追加の構成オプションと配置アーキテクチャの強化について説明します。
高可用性のための Atlas 機能
データベース レプリケーション
MongoDB のデフォルトの配置アーキテクチャは、冗長性を確保するように設計されています。 Atlas は各クラスターを レプリカセットとして配置し、選択したクラウドプロバイダーデータベース内の個別のアベイラビリティーゾーンに分散されるようにします。アプリケーションによりレプリカセットの プライマリノードにデータが書き込まれます。その後、Atlas はそのデータを複製して保存し、クラスター内のすべてのノードに保存します。データストレージの耐久性を制御するには、アプリケーションコードの書込み保証 (write concern)を調整して、特定の数のセカンダリが書込み (write) をコミットした後にのみ書込みを完了します。デフォルトの動作では、アクションを確認する前に、選挙可能なノードの過半数にデータを保持します。
次の図は、デフォルトの3 ノードレプリカセットでのレプリケーションの仕組みを表しています。

自動フェイルオーバー
インフラストラクチャの停止時、定期メンテナンス、またはその他の中断によりレプリカセット内のプライマリノードが利用できなくなったイベント、Atlas はレプリカセットの選挙において既存のセカンダリノードをプライマリノードのロールに昇格させることで、クラスターの自己修復を行います。このフェイルオーバープロセスは完全に自動であり、 再試行可能な書込み が有効になっている場合は、障害時に実行されていた操作など、データを失うことなく 秒以内に完了します。レプリカセットの選挙後、Atlas は失敗したノードを復元または置換して、クラスターができるだけ早くターゲット構成に戻るようにします。 MongoDBクライアントドライバーも、障害中と障害後にすべてのクライアント接続を自動的に切り替えます。
次の図は、レプリカセットの選挙プロセスを表します。

最もクリティカル アプリケーションの可用性を向上させるには、ノード、リージョン、またはクラウドプロバイダーを追加して、それぞれゾーン、リージョン、またはプロバイダーの停止時に耐えられるようにして配置を増やすことができます。詳細については、以下の「 フォールトトレランスのための配置パラダイムのスケーリング 」推奨事項を参照してください。
Atlas の高可用性に関する推奨事項
次の推奨事項では、配置の可用性を高めるために実行できる追加の構成オプションと配置アーキテクチャの強化について説明します。
配置の目的に合わせてクラスター階層を選択する
新しいクラスターを作成するときは、専用、フレキシブル、または無料の配置タイプで使用可能なクラスター階層の範囲を選択できます。 MongoDB Atlasのクラスター層は、クラスター内の各ノードで使用可能なリソース(メモリ、ストレージ、 vCPU 、 IOPS )を指定します。より高い階層にスケーリングすると、クラスターのトラフィックの急増を処理する能力が向上し、高いワークロードへの応答がより高速になることでシステムの信頼性が向上します。アプリケーションサイズに推奨されるクラスター層を決定するには、 Atlas クラスター サイズ ガイドを参照してください。
Atlas は、クラスターが需要の急増に対応できるようにするためのオートスケーリングもサポートしています。このアクションを自動化すると、リソースの制約による停止時のリスクを軽減できます。詳細については、「 Atlas 自動インフラストラクチャのプロビジョニング 」に関するガイダンスを参照してください。
フォールトトレランスのための配置パラダイムの拡張
Atlas 配置のフォールトトレランスは、配置が引き続き機能している間に使用できなくなるレプリカセットメンバーの数として測定できます。アベイラビリティーゾーン、リージョン、またはクラウドプロバイダーが停止時イベント、Atlas はレプリカセットの選挙で既存のセカンダリノードを プライマリノードのロールに昇格させ、クラスターの自己修復を行います。プライマリノードが停止時したときにレプリカセット選挙を実行するには、レプリカセット内の投票ノードの過半数が稼働中である必要があります。
部分的なリージョン停止時た場合にレプリカセットがプライマリを選択できるようにするには、少なくとも 3 つのアベイラビリティーゾーンのあるリージョンにクラスターを配置する必要があります。アベイラビリティーゾーンは、1 つのクラウドプロバイダーのリージョン内のデータセンターの個別のグループであり、それぞれが独自の電源、冷却、ネットワーク インフラストラクチャを備えています。 Atlas は、選択したクラウドプロバイダーリージョンがサポートする場合、クラスターを複数のアベイラビリティーゾーンに自動的に分散するため、1 つのゾーンで停止時 が発生しても、クラスター内の残りのノードは引き続きリージョン サービスをサポートできます。 Atlas がサポートするほとんどのクラウドプロバイダーリージョンには、少なくとも 3 つのアベイラビリティーゾーンがあります。これらのリージョンは、Atlas UIではスター アイコンでマークされます。推奨リージョンの詳細については、「 クラウドプロバイダーとリージョン 」を参照してください。
最もクリティカル アプリケーションのフォールトトレランスをさらに向上させるには、ノード、リージョン、またはクラウドプロバイダーを追加して、それぞれアベイラビリティーゾーン、リージョン、またはプロバイダーの停止時に耐えられるように配置を増やす。ノード数は任意の奇数ノードに増やすことができ、最大で 7 の選択可能なノードと 50 のノードを含めることができます。また、クラスターを複数のリージョンに配置して、より大きな地理的条件で可用性を向上させ、リージョン全体が停止時プライマリ リージョン内のすべてのアベイラビリティーゾーンが無効になった場合に自動フェイルオーバーを有効にすることもできます。クラウドプロバイダーの完全な停止時 に耐えられるように、クラスターを複数のクラウドプロバイダーに配置する場合にも同じパターンが適用されます。
高可用性、 低レイテンシ、コンプライアンス、コスト のバランスを取る配置を選択するガイダンスについては、 Atlas 配置パラメータ のドキュメントを参照してください。
誤ってクラスター削除を防止する
終了保護を有効にすると、クラスターが誤って終了されたり、バックアップからの復元 にダウンタイムが必要になったりすることがなくなります。終了保護が有効になっているクラスターを削除するには、まず終了保護を無効にする必要があります。デフォルトでは 、Atlas はすべてのクラスターの終了保護を無効にします。
終了保護を有効にすることは、Terraform などの IaC ツールを活用して、再配置によって新しいインフラストラクチャがプロビジョニングされないようにする場合に特に重要です。
自動フェイルオーバーのテスト
アプリケーションを本番にデプロイする前に、自動ノードフェイルオーバーを必要とするさまざまなシナリオをシミュレートして、このようなイベントに対する準備状況を測定することを強くお勧めします。 Atlas を使用すると、レプリカセットのプライマリノードのフェイルオーバーをテストし、マルチリージョン配置のリージョン停止をシミュレートできます。
majority
書込み保証を使用
MongoDB、書込み保証 (write concern)を使用して、書込み (write) 操作に要求される確認応答のレベルを指定できます。 Atlas のデフォルトの書込み保証 (write concern)はmajority
です。つまり、Atlas が成功を報告する前に、クラスター内の 5 つ以上のノードにデータが複製されている必要があります。majority
のような明確な数値ではなく2
を使用すると、一時的なノード停止時 が発生した場合に、Atlas はより少ないノードのレプリケーションを必要とするように自動的に調整でき、 自動フェイルオーバー後も書き込みを継続できます。これにより、すべての環境で一貫した 設定が提供されるため、テスト環境に 3 つのノードがある場合でも、本番環境に多数のノードがある場合でも、接続文字列は同じままです。
再試行可能なデータベースの読み取りと書込みの構成
Atlas は、 再試行可能な読み取り と 再試行可能な書込み操作 をサポートしています。有効にすると、Atlas は読み取りおよび書込み操作を 1 回再試行し、断続的なネットワーク停止やレプリカセットの選挙でアプリケーションが正常な プライマリノードを一時的に見つけられない場合を防ぎます。再試行可能な書き込みには、確認済みの書込み保証 (write concern)が必要です。つまり、書込み保証 (write concern)が{w:
0}
になることはできません。
リソース使用率の監視と計画
リソースキャパシティーの問題を回避するには、リソースの使用率をモニターし、定期的にキャパシティープランニング セッションを保持することをお勧めします。 MongoDB のプロフェッショナル サービスはこれらのセッションを提供します。リソースキャパシティーの問題から回復するための推奨方法については、「 リソース容量障害復旧プラン 」を参照してください。
リソース使用率に関するアラートとモニタリングのベストプラクティスについては、Atlas のモニタリングとアラートのガイダンスを参照してください。
MongoDB バージョンの変更を計画する
新機能と改善されたセキュリティ保証を活用するには、最新のMongoDBバージョンを実行することをお勧めします。現在のバージョンのサポートが終了する前に、常に最新のMongoDBメジャー バージョンにアップグレードするようにしてください。
Atlas UIを使用してMongoDBのバージョンをダウングレードすることはできません。そのため、アップグレード プロセス中に発生する可能性のある問題を回避するために、メジャー バージョン アップグレードを計画および実行する際には、MongoDB の プロフェッショナル サービス または テクニカル サービス を直接利用することをお勧めします。
メンテナンスウィンドウの構成
Atlas は、一度に 1 つのノードにローリング方式でアップデートを適用することで、スケジュールされたメンテナンス中にアップタイムを維持します。このプロセス中に現在のプライマリがメンテナンスのためにオフラインになるたびに、Atlas は 自動レプリカセット選挙 によって新しいプライマリを選択します。これは、 プライマリノードの停止時に応答して自動フェイルオーバー中に発生するプロセスと同じです。
ビジネスクリティカル 時間中にメンテナンス関連のレプリカセットの選挙を回避するために、プロジェクトに カスタムメンテナンスウィンドウを設定することをお勧めします。また、メンテナンスウィンドウ設定で保護されている時間を設定して、標準更新を開始できない日次の時間ウィンドウを定義することもできます。標準更新では、クラスターの再起動や再同期は含まれません。
オートメーションの例:Atlas の高可用性
次の例では、Atlas のオートメーション用ツールを使用して、単一リージョン、3 ノード レプリカセット / シャード配置トポロジーを構成します。
これらの例では、次のようなその他の推奨される構成も適用されます。
開発およびテスト環境用にクラスター階層が
M10
に設定されました。クラスター サイズ ガイドを使用して、アプリケーションのサイズに合った推奨クラスター階層を確認してください。単一リージョン、3 ノード レプリカ セットまたはシャード配置トポロジー。
当社の例では、AWS、Azure、および Google Cloud を互換的に使用します。これら 3 つのクラウド プロバイダーのいずれかを使用できますが、クラウド プロバイダーに一致するようにリージョン名を変更する必要があります。クラウドプロバイダーとそのリージョンに関する詳細は、「クラウドプロバイダー」をご覧ください。
中規模アプリケーション用のクラスター階層が
M30
に設定されました。クラスター サイズ ガイドを使用して、アプリケーションのサイズに合った推奨クラスター階層を確認してください。単一リージョン、3 ノード レプリカ セットまたはシャード配置トポロジー。
当社の例では、AWS、Azure、および Google Cloud を互換的に使用します。これら 3 つのクラウド プロバイダーのいずれかを使用できますが、クラウド プロバイダーに一致するようにリージョン名を変更する必要があります。クラウドプロバイダーとそのリージョンに関する詳細は、「クラウドプロバイダー」をご覧ください。
注意
Atlas CLI を使用してリソースを作成する前に、次の手順を実行する必要があります。
Programmatic Useの手順に従って Atlas CLI から接続します。
プロジェクトごとに 1 つのデプロイメントを作成
開発環境およびテスト環境では、プロジェクトごとに次のコマンドを実行します。ID と名前を変更して、 値を使用します。
atlas clusters create CustomerPortalDev \ --projectId 56fd11f25f23b33ef4c2a331 \ --region EASTERN_US \ --members 3 \ --tier M10 \ --provider GCP \ --mdbVersion 8.0 \ --diskSizeGB 30 \ --tag bu=ConsumerProducts \ --tag teamName=TeamA \ --tag appName=ProductManagementApp \ --tag env=Production \ --tag version=8.0 \ --tag email=marissa@acme.com \ --watch
ステージング環境と本番環境において、各プロジェクトごとに次の 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": false, "scaleDownEnabled": false }, "diskGB": { "enabled": false } }, "readOnlySpecs": { "nodeCount": 0, "instanceSize": "M30" } } ], "zoneName": "Zone 1" } ], "tag" : [{ "bu": "ConsumerProducts", "teamName": "TeamA", "appName": "ProductManagementApp", "env": "Production", "version": "8.0", "email": "marissa@acme.com" }] }
cluster.json
ファイルを作成した後、各プロジェクトで次のコマンドを実行します。このコマンドは、cluster.json
ファイルを使用してクラスターを作成します。
atlas cluster create --projectId 5e2211c17a3e5a48f5497de3 --file cluster.json
その他の構成オプションとこの例に関する情報については、「 atlas clusters create コマンド 」を参照してください。
注意
プロジェクトとデプロイメントを作成する
開発環境およびテスト環境では、アプリケーションと環境のペアごとに次のファイルを作成します。各アプリケーションと環境ペアのファイルを 独自のディレクトリに配置します。ID と名前を変更して、 値を使用します。
main.tf
# Create a Project resource "mongodbatlas_project" "atlas-project" { org_id = var.atlas_org_id name = var.atlas_project_name } # Create an Atlas Advanced Cluster resource "mongodbatlas_advanced_cluster" "atlas-cluster" { project_id = mongodbatlas_project.atlas-project.id name = "ClusterPortalDev" 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 = "Test" } 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
オブジェクトにネストします。 priority
フィールドは降順で定義する必要があり、次の例に示すように、7
と 1
の間の値で構成されている必要があります。
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" } # Atlas Group Name variable "atlas_group_name" { type = string description = "Atlas Group Name" }
terraform.tfvars
atlas_org_id = "32b6e34b3d91647abb20e7b8" atlas_project_name = "Customer Portal - Dev" environment = "dev" cluster_instance_size_name = "M10" cloud_provider = "AWS" atlas_region = "US_WEST_2" mongodb_version = "8.0"
provider.tf
# Define the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" } } required_version = ">= 0.13" }
ファイルを作成した後、各アプリケーションと環境ペアのディレクトリに移動し、次のコマンドを実行して Terraform を初期化します。
terraform init
Terraform プランを表示するには、次のコマンドを実行します。
terraform plan
次のコマンドを実行して、アプリケーションと環境のペアに対して 1 つのプロジェクトと 1 つのデプロイメントを作成します。コマンドは、ファイルと MongoDB & HashiCorp Terraform を使用して、プロジェクトとクラスターを作成します。
terraform apply
プロンプトが表示されたら、yes
を入力し、Enter
を押して設定を適用します。
ステージング環境と本番環境において、各アプリケーションと環境のペアごとに以下のファイルを作成します。各アプリケーションと環境のペアごとに、それぞれのディレクトリ内でファイルを配置します。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" } # Atlas Group Name variable "atlas_group_name" { type = string description = "Atlas Group Name" }
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" atlas_group_name = "Atlas Group"
provider.tf
# Define the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" } } required_version = ">= 0.13" }
ファイルを作成した後、各アプリケーションと環境ペアのディレクトリに移動し、次のコマンドを実行して Terraform を初期化します。
terraform init
Terraform プランを表示するには、次のコマンドを実行します。
terraform plan
次のコマンドを実行して、アプリケーションと環境のペアに対して 1 つのプロジェクトと 1 つのデプロイメントを作成します。コマンドは、ファイルと MongoDB & HashiCorp Terraform を使用して、プロジェクトとクラスターを作成します。
terraform apply
プロンプトが表示されたら、yes
と入力し、Enter
を押して設定を適用してください。
この例に関するその他の設定オプションや情報については、「MongoDB & HashiCorp Terraform」およびMongoDB Terraform のブログ記事をご覧ください。