Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ /
Atlas Architecture Center
/

Atlas の高可用性に関するガイダンス

高可用性とは、インフラストラクチャの停止やシステムのメンテナンスなどの中断時に、継続的な操作を確保し、ダウンタイムを最小限に抑えるアプリケーションの能力です。 MongoDB のデフォルトの配置アーキテクチャは、 データの冗長性 と 自動フェイルオーバー のための組み込み機能を備えており、高可用性向けに設計されています。このページでは、ゾーン、リージョン、およびクラウドプロバイダーの停止時に中断を防ぎ、堅牢なフェイルオーバーメカニズムをサポートするために選択できる追加の構成オプションと配置アーキテクチャの強化について説明します。

MongoDB のデフォルトの配置アーキテクチャは、冗長性を確保するように設計されています。 Atlas は各クラスターを レプリカセットとして配置し、選択したクラウドプロバイダーデータベース内の個別のアベイラビリティーゾーンに分散されるようにします。アプリケーションによりレプリカセットの プライマリノードにデータが書き込まれます。その後、Atlas はそのデータを複製して保存し、クラスター内のすべてのノードに保存します。データストレージの耐久性を制御するには、アプリケーションコードの書込み保証 (write concern)を調整して、特定の数のセカンダリが書込み (write) をコミットした後にのみ書込みを完了します。デフォルトの動作では、アクションを確認する前に、選挙可能なノードの過半数にデータを保持します。

次の図は、デフォルトの3 ノードレプリカセットでのレプリケーションの仕組みを表しています。

3 ノードのレプリカセットでのレプリケーションプロセスを示す画像。
クリックして拡大します

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

次の図は、レプリカセットの選挙プロセスを表します。

3 ノードのレプリカセット内の自己修復プライマリ選挙プロセスを示す画像。
クリックして拡大します

最もクリティカル アプリケーションの可用性を向上させるには、ノード、リージョン、またはクラウドプロバイダーを追加して、それぞれゾーン、リージョン、またはプロバイダーの停止時に耐えられるようにして配置を増やすことができます。詳細については、以下の「 フォールトトレランスのための配置パラダイムのスケーリング 」推奨事項を参照してください。

次の推奨事項では、配置の可用性を高めるために実行できる追加の構成オプションと配置アーキテクチャの強化について説明します。

新しいクラスターを作成するときは、専用、フレキシブル、または無料の配置タイプで使用可能なクラスター階層の範囲を選択できます。 MongoDB Atlasのクラスター層は、クラスター内の各ノードで使用可能なリソース(メモリ、ストレージ、 vCPU 、 IOPS )を指定します。より高い階層にスケーリングすると、クラスターのトラフィックの急増を処理する能力が向上し、高いワークロードへの応答がより高速になることでシステムの信頼性が向上します。アプリケーションサイズに推奨されるクラスター層を決定するには、 Atlas クラスター サイズ ガイドを参照してください。

Atlas は、クラスターが需要の急増に対応できるようにするためのオートスケーリングもサポートしています。このアクションを自動化すると、リソースの制約による停止時のリスクを軽減できます。詳細については、「 Atlas 自動インフラストラクチャのプロビジョニング 」に関するガイダンスを参照してください。

Atlas 配置のフォールトトレランスは、配置が引き続き機能している間に使用できなくなるレプリカセットメンバーの数として測定できます。アベイラビリティーゾーン、リージョン、またはクラウドプロバイダーが停止時イベント、Atlas はレプリカセットの選挙で既存のセカンダリノードを プライマリノードのロールに昇格させ、クラスターの自己修復を行います。プライマリノードが停止時したときにレプリカセット選挙を実行するには、レプリカセット内の投票ノードの過半数が稼働中である必要があります。

部分的なリージョン停止時た場合にレプリカセットがプライマリを選択できるようにするには、少なくとも 3 つのアベイラビリティーゾーンのあるリージョンにクラスターを配置する必要があります。アベイラビリティーゾーンは、1 つのクラウドプロバイダーのリージョン内のデータセンターの個別のグループであり、それぞれが独自の電源、冷却、ネットワーク インフラストラクチャを備えています。 Atlas は、選択したクラウドプロバイダーリージョンがサポートする場合、クラスターを複数のアベイラビリティーゾーンに自動的に分散するため、1 つのゾーンで停止時 が発生しても、クラスター内の残りのノードは引き続きリージョン サービスをサポートできます。 Atlas がサポートするほとんどのクラウドプロバイダーリージョンには、少なくとも 3 つのアベイラビリティーゾーンがあります。これらのリージョンは、Atlas UIではスター アイコンでマークされます。推奨リージョンの詳細については、「 クラウドプロバイダーとリージョン 」を参照してください。

最もクリティカル アプリケーションのフォールトトレランスをさらに向上させるには、ノード、リージョン、またはクラウドプロバイダーを追加して、それぞれアベイラビリティーゾーン、リージョン、またはプロバイダーの停止時に耐えられるように配置を増やす。ノード数は任意の奇数ノードに増やすことができ、最大で 7 の選択可能なノードと 50 のノードを含めることができます。また、クラスターを複数のリージョンに配置して、より大きな地理的条件で可用性を向上させ、リージョン全体が停止時プライマリ リージョン内のすべてのアベイラビリティーゾーンが無効になった場合に自動フェイルオーバーを有効にすることもできます。クラウドプロバイダーの完全な停止時 に耐えられるように、クラスターを複数のクラウドプロバイダーに配置する場合にも同じパターンが適用されます。

高可用性、 低レイテンシ、コンプライアンス、コスト のバランスを取る配置を選択するガイダンスについては、 Atlas 配置パラメータ のドキュメントを参照してください。

終了保護を有効にすると、クラスターが誤って終了されたり、バックアップからの復元 にダウンタイムが必要になったりすることがなくなります。終了保護が有効になっているクラスターを削除するには、まず終了保護を無効にする必要があります。デフォルトでは 、Atlas はすべてのクラスターの終了保護を無効にします。

終了保護を有効にすることは、Terraform などの IaC ツールを活用して、再配置によって新しいインフラストラクチャがプロビジョニングされないようにする場合に特に重要です。

アプリケーションを本番にデプロイする前に、自動ノードフェイルオーバーを必要とするさまざまなシナリオをシミュレートして、このようなイベントに対する準備状況を測定することを強くお勧めします。 Atlas を使用すると、レプリカセットのプライマリノードのフェイルオーバーをテストし、マルチリージョン配置のリージョン停止をシミュレートできます。

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メジャー バージョンにアップグレードするようにしてください。

Atlas UIを使用してMongoDBのバージョンをダウングレードすることはできません。そのため、アップグレード プロセス中に発生する可能性のある問題を回避するために、メジャー バージョン アップグレードを計画および実行する際には、MongoDB の プロフェッショナル サービス または テクニカル サービス を直接利用することをお勧めします。

Atlas は、一度に 1 つのノードにローリング方式でアップデートを適用することで、スケジュールされたメンテナンス中にアップタイムを維持します。このプロセス中に現在のプライマリがメンテナンスのためにオフラインになるたびに、Atlas は 自動レプリカセット選挙 によって新しいプライマリを選択します。これは、 プライマリノードの停止時に応答して自動フェイルオーバー中に発生するプロセスと同じです。

ビジネスクリティカル 時間中にメンテナンス関連のレプリカセットの選挙を回避するために、プロジェクトに カスタムメンテナンスウィンドウを設定することをお勧めします。また、メンテナンスウィンドウ設定で保護されている時間を設定して、標準更新を開始できない日次の時間ウィンドウを定義することもできます。標準更新では、クラスターの再起動や再同期は含まれません。

次の例では、Atlas のオートメーション用ツールを使用して、単一リージョン、3 ノード レプリカセット / シャード配置トポロジーを構成します。

これらの例では、次のようなその他の推奨される構成も適用されます。

  • 開発およびテスト環境用にクラスター階層が M10 に設定されました。クラスター サイズ ガイドを使用して、アプリケーションのサイズに合った推奨クラスター階層を確認してください。

  • 単一リージョン、3 ノード レプリカ セットまたはシャード配置トポロジー。

当社の例では、AWSAzure、および Google Cloud を互換的に使用します。これら 3 つのクラウド プロバイダーのいずれかを使用できますが、クラウド プロバイダーに一致するようにリージョン名を変更する必要があります。クラウドプロバイダーとそのリージョンに関する詳細は、「クラウドプロバイダー」をご覧ください。

  • 中規模アプリケーション用のクラスター階層が M30 に設定されました。クラスター サイズ ガイドを使用して、アプリケーションのサイズに合った推奨クラスター階層を確認してください。

  • 単一リージョン、3 ノード レプリカ セットまたはシャード配置トポロジー。

当社の例では、AWSAzure、および Google Cloud を互換的に使用します。これら 3 つのクラウド プロバイダーのいずれかを使用できますが、クラウド プロバイダーに一致するようにリージョン名を変更する必要があります。クラウドプロバイダーとそのリージョンに関する詳細は、「クラウドプロバイダー」をご覧ください。

注意

Atlas CLI を使用してリソースを作成する前に、次の手順を実行する必要があります。

開発環境およびテスト環境では、プロジェクトごとに次のコマンドを実行します。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 コマンド 」を参照してください。

注意

Terraform でリソースを作成する前に、次の手順を実行する必要があります。

開発環境およびテスト環境では、アプリケーションと環境のペアごとに次のファイルを作成します。各アプリケーションと環境ペアのファイルを 独自のディレクトリに配置します。ID と名前を変更して、 値を使用します。

# 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 フィールドは降順で定義する必要があり、次の例に示すように、71 の間の値で構成されている必要があります。

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"
}
}
# 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"
}
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"
# 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 と名前を変更して、自分の値を使用します。

# 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"
}
}
# 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"
}
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"
# 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 のブログ記事をご覧ください。

戻る

Reliability