Docs Menu
Docs Home
/ /

Atlas 확장성에 대한 지침

자동 확장을 통해 클러스터는 실시간 사용에 따라 계층, 저장 용량 또는 둘 다를 자동으로 조정할 수 있습니다. Atlas는 CPU 및 메모리 사용률을 분석하여 클러스터 계층을 확장하거나 축소할 시기와 여부를 결정합니다. Atlas가 클러스터 노드를 확장하거나 축소하는 조건에 대해 자세히 알아보려면 클러스터 계층 확장을 참조하세요. 최소 성능을 보장하거나 비용을 관리하기 위해 클러스터가 자동으로 확장할 수 있는 최대 및 최소 클러스터 크기 범위를 지정할 수도 있습니다. Atlas는 새 계층이 지정된 크기 범위를 벗어나거나 메모리 사용량이 새 계층의 용량을 초과할 경우 클러스터를 확장하지 않습니다. 자동 확장으로 인한 애플리케이션 영향을 방지하기 위해 클러스터 계층을 확장하거나 축소하는 데 지연 시간이 적용됩니다. 따라서 이는 데이터베이스가 사용량으로 인해 급격히 과부하되는 상황이 아닌, 꾸준히 증가하거나 감소하는 애플리케이션 부하에 가장 적합합니다. 워크로드에 빈번한 스파이크가 발생하거나 이벤트 또는 출시로 인해 트래픽이 크게 증가할 것으로 예상되는 경우 MongoDB는 프로그래밍 방식으로 미리 확장할 것을 권장합니다.

권장 배포 토폴로지에 언급된 Atlas 배포 템플릿은 수평 및 수직 확장 옵션을 제공합니다. 특히 샤딩은 데이터를 여러 머신에 분산시키므로 단일 서버로 워크로드를 처리할 수 없을 때 유용합니다. 샤딩은 노드 간 리소스를 공유하지 않는 분산 컴퓨팅 아키텍처인 '공유 없음(Shared-nothing)' 아키텍처를 따릅니다. 일반적인 쿼리 패턴을 용이하게 하면서 MongoDB가 클러스터 전체에 문서를 균등하게 분산할 수 있는 이상적인 샤드 키 선택에 대해 자세히 알아보려면 샤드 키 선택을 참조하세요. 또한 범위 샤딩, 해시 샤딩, 영역 샤딩과 같은 주요 샤딩 전략에 대해 알아보려면 Performance 모범 사례: 샤딩을 참조하세요.

Atlas 클러스터는 Atlas 제어판 GUI, Atlas Administration API 또는 IaC 도구(예: Atlas Kubernetes Operator, MongoDB 및 HashiCorp Terraform, Atlas CLI)를 통해 다음 사용 가능한 Atlas 계층으로 업그레이드할 수 있습니다. 자세한 내용은 Atlas 자동 인프라 프로비저닝 지침을 참조하세요. Atlas 계층을 업스케일 또는 다운스케일로 변경하는 경우 무중단으로 진행됩니다. 계층 변경은 롤링 방식으로 이루어지며, 이 과정에는 세컨더리 멤버를 대체 멤버로 선출하고, 해당 세컨더리 멤버를 새 프라이머리로 승격시킨 후, 장애가 발생한 멤버를 복구 또는 교체하여 클러스터가 최대한 빠르게 목표 구성으로 복구되도록 합니다. 수평 확장은 배포 후 관리자의 작업에 따라 수행되며, 프로그램 스크립트를 통해 트리거할 수 있습니다. 일부 클러스터 템플릿에는 샤딩된 클러스터가 필요합니다. MongoDB 버전 8.0부터는 소규모 샤딩 클러스터에서 config 서버와 관련된 비용을 줄이기 위해 임베디드 config 서버를 사용할 수 있습니다.

Atlas의 저용량 CPU 옵션은 더 많은 메모리가 필요하지만 처리 능력은 그만큼 필요하지 않은 애플리케이션에 도움이 됩니다. 이 옵션은 동일한 클러스터 크기의 일반 계층에 비해 인스턴스에 절반의 vCPU를 제공하므로 메모리를 많이 사용하지만 CPU에 크게 의존하지 않는 워크로드의 비용을 절감합니다.

데이터 계층화 및 보관 기능을 사용하면 저비용 스토리지에 데이터를 보관하면서도 라이브 클러스터 데이터와 함께 쿼리를 실행할 수 있으므로 장기 기록 보관에 특히 유용합니다. 이 과정을 최적화하기 위해 MongoDB는 단순하고 구성 가능한 규칙을 통해 데이터 보관을 자동화할 것을 권장합니다. 보관 규칙에서 지정할 수 있는 기준에 대한 자세한 내용은 데이터 보관을 참조하세요. 데이터 보존이 우선 순위가 아닌 경우 Atlas는 날짜 기준에 따라 사용하지 않는 데이터를 자동으로 삭제하는 옵션을 제공합니다. 자주 액세스하지 않는 데이터의 경우 TTL 인덱스는 지정된 시간이나 설정된 시각이 지나면 컬렉션에서 문서를 자동으로 삭제하는 특수 단일 필드 인덱스입니다. 이는 제한된 시간 동안만 보존해야 하는 로그, 세션 정보 또는 이벤트 데이터와 같은 데이터에 특히 유용합니다. TTL 인덱스를 생성하려면 날짜 값을 포함하는 필드에 인덱스를 정의하고 초 단위로 유효 기간을 지정할 수 있습니다.

또한 Atlas 인덱스 추가 또는 제거하거나 클라이언트의 쿼리 구조를 변경하여 비효율적인 쿼리를 식별하고 최적화할 수 있는 Performance Advisor와 같은 자동화된 도구를 제공합니다. 쿼리 성능을 향상시키기 위한 Performance Advisor의 실행 가능한 권장 사항을 따르면 불필요한 컴퓨팅 시간과 리소스 소비를 줄일 수 있습니다. 또한 Atlas 에서 제공하는 지능형 인덱스 권장 사항을 활용하여 데이터 검색 효율성 더욱 향상시키고 데이터베이스 작업에 필요한 리소스를 최소화할 수 있습니다.

단일 리전 배포서버에만 적용되는 권장사항

단일 리전 배포서버의 경우 단일 클라우드 리전 내에서 성능을 최적화하는 수직 확장 전략에 집중합니다.

  • 컴퓨팅과 저장 모두에 자동 확장 기능을 활성화하여 점진적인 트래픽 증가에 수동 개입 없이 대응할 수 있도록 합니다.

  • 데이터 세트가 단일 리전 내에서도 단일 서버 의 용량 초과하는 경우 샤딩 사용하여 여러 샤드에 부하를 분산합니다.

  • 고성능 처리가 필요하지 않고 메모리 사용량이 많은 워크로드에는 저사양 CPU 인스턴스 옵션을 고려하세요.

  • 기록 데이터를 위한 데이터 계층화 및 보관을 구현해 쿼리 기능을 유지하면서 저장 비용을 절감합니다.

  • Performance Advisor 로 쿼리 성능을 모니터링하고 권장 인덱스를 구현 리소스 사용률을 최적화하세요.

  • 트래픽이 급증할 것으로 예상되는 경우, 갑작스러운 부하 증가에 자동 확장만 의존하지 말고 사전에 클러스터를 확장합니다.

멀티 리전 또는 여러 클라우드 공급자에 걸친 배포서버에만 적용되는 권장사항

멀티 리전 및 멀티 클라우드 배포의 경우 지리적 분포와 클라우드 간 복잡성을 고려한 확장 전략을 구현합니다.

  • 사용자에게 가장 가까운 리전에 읽기 전용 복제본을 구성하여 지연 시간 줄이고 읽기 워크로드를 지리적으로 분산하세요.

  • 지리적 또는 논리적 경계를 기준으로 데이터를 분할하는 구역 샤딩을 적용함으로써 데이터 지역성 및 컴플라이언스 요건을 충족합니다.

  • 로컬 읽기 및 쓰기 기능이 있는 글로벌 클러스터를 구현하여 데이터 일관성 유지하면서 리전 전반에 걸쳐 성능을 최적화합니다.

  • 리전 간 네트워크 지연 시간을 모니터링하고 복제본 우선 순위를 조정하여 최적의 페일오버 동작을 보장합니다.

  • 여러 리전에 걸쳐 자동 확장을 구현할 때는 리전 간 데이터 전송 비용의 영향을 고려합니다.

  • 지역별 사용 패턴과 비용 최적화 전략에 따라 각 리전에 서로 다른 클러스터 계층을 사용합니다.

  • 데이터 상주 요구 사항을 준수하기 위해 지역별 백업 및 아카이브 전략을 구현합니다.

다음 권장사항은 모든 배포서버 패러다임에 적용됩니다.

개발 및 테스트 환경에서는 자동 확장 컴퓨팅 및 자동 확장 저장소를 활성화하지 않습니다. 이는 비프로덕션 환경의 비용을 절감합니다.

스테이징 및 프로덕션 환경에서는 다음을 수행하는 것이 좋습니다.

  • 애플리케이션이 소규모에서 중간 규모로 유기적으로 성장하는 인스턴스의 경우 컴퓨팅 및 스토리지에 대한 자동 확장을 활성화합니다.

    IaC 도구를 사용하는 경우 자동 확장 으로 인한 리소스 드리프트를 무시하도록 설정을 활용하세요. 예시 를 들어 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 구성에 지정된 값과 다를 수 있으며, 이에 유의하지 않고 계획을 적용하면 Terraform은 클러스터 를 원래 instanceSizeName 값으로 다시 확장하다 합니다. 이를 방지하려면 lifecycle { ignore_changes = [provider_instance_size_name] }과 같은 수명 주기 사용자 지정을 사용해야 합니다.

모든 필러에 권장 사항을 시행하다 하는 Terraform 예시는 Github 에서 다음 예시 중 하나를 참조하세요.

다음 예시는 Atlas 자동화 도구를 사용하여 컴퓨팅 및 스토리지 자동 확장을 활성화합니다.

이러한 예시는 다음을 포함한 다른 권장 구성에도 적용됩니다.

  • 개발/테스트 환경을 위해 클러스터 계층을 M10으로 설정합니다. 애플리케이션 크기에 맞는 권장 클러스터 계층을 알아보려면 클러스터 크기 가이드를 참조하세요.

  • 단일 리전, 3-노드 복제본 세트/샤드 배포 토폴로지

당사의 예시는 AWS, Azure 및 Google Cloud를 상호 교체하여 사용합니다. 세 곳의 클라우드 공급자 중 어느 곳이든 사용할 수 있지만 클라우드 공급자에 맞게 지역 이름을 변경해야 합니다. 클라우드 공급자와 그 지역에 대해 알아보려면 클라우드 공급자를 참조하세요.

  • 중간 규모 애플리케이션을 위해 클러스터 계층을 M30으로 설정합니다. 애플리케이션 크기에 맞는 권장 클러스터 계층을 알아보려면 클러스터 크기 가이드를 참조하세요.

  • 단일 리전, 3-노드 복제본 세트/샤드 배포 토폴로지

당사의 예시는 AWS, Azure 및 Google Cloud를 상호 교체하여 사용합니다. 세 곳의 클라우드 공급자 중 어느 곳이든 사용할 수 있지만 클라우드 공급자에 맞게 지역 이름을 변경해야 합니다. 클라우드 공급자와 그 지역에 대해 알아보려면 클라우드 공급자를 참조하세요.

참고

Atlas CLI로 리소스를 생성하기 전에 다음을 수행해야 합니다.

개발 및 테스트 환경의 경우 비용 절감을 위해 컴퓨팅 및 스토리지 자동 확장이 비활성화됩니다.

스테이징 및 프로덕션 환경의 경우 각 프로젝트에 대해 다음 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 클러스터 생성을 참조하세요.

참고

Terraform으로 리소스를 생성하기 전에 다음을 수행해야 합니다.

  • 결제 조직을 생성하고 해당 결제 조직에 대한 API 키를 생성합니다. 터미널에서 다음 명령을 실행하여 API 키를 환경 변수로 저장하세요.

    export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>"
    export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
  • Terraform 설치하기

중요

다음 예제에서는 MongoDB Atlas Terraform Provider 2 버전.x()를~> 2.2 사용합니다. 제공자 1 버전.x에서 업그레이드하는 경우 호환성이 손상되는 변경 사항 및 마이그레이션 단계는 2.0.0 업그레이드 가이드를 참조하세요. 이 예제에서는 mongodbatlas_advanced_cluster 2v.x 구문과 함께 리소스 사용합니다.

개발 및 테스트 환경의 경우 비용 절감을 위해 컴퓨팅 및 스토리지 자동 확장이 비활성화됩니다.

스테이징 및 프로덕션 환경의 경우 각 애플리케이션과 환경 쌍에 대해 다음 파일을 생성하세요. 각 애플리케이션과 환경 쌍의 파일은 별도의 디렉토리에 배치하세요. 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 team to project with specific roles
resource "mongodbatlas_team_project_assignment" "project_team" {
project_id = mongodbatlas_project.atlas-project.id
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
disk_size_gb = var.disk_size_gb
}
auto_scaling = {
disk_gb_enabled = var.auto_scaling_disk_gb_enabled
compute_enabled = var.auto_scaling_compute_enabled
compute_max_instance_size = var.compute_max_instance_size
}
priority = 7
provider_name = var.cloud_provider
region_name = var.atlas_region
}
]
}
]
# Prevent Terraform from reverting auto-scaling changes
lifecycle {
ignore_changes = [
replication_specs[0].region_configs[0].electable_specs.instance_size,
replication_specs[0].region_configs[0].electable_specs.disk_size_gb
]
}
tags = {
BU = "ConsumerProducts"
TeamName = "TeamA"
AppName = "ProductManagementApp"
Env = "Production"
Version = "8.0"
Email = "marissa@example.com"
}
}
# Outputs to Display
output "atlas_cluster_connection_string" { value = mongodbatlas_advanced_cluster.atlas-cluster.connection_strings.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"
},
{
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 Group Name
variable "atlas_group_name" {
type = string
description = "Atlas Group 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_enabled" {
type = bool
description = "Flag that specifies whether disk auto-scaling is enabled"
}
# Compute Auto-scaling Enablement Flag
variable "auto_scaling_compute_enabled" {
type = bool
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"
}
atlas_org_id = "32b6e34b3d91647abb20e7b8"
atlas_project_name = "Customer Portal - Prod"
atlas_group_name = "Atlas Group"
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
# Define the MongoDB Atlas Provider
terraform {
required_providers {
mongodbatlas = {
source = "mongodb/mongodbatlas"
version = "~> 2.2"
}
}
required_version = ">= 1.0"
}
# Configure the MongoDB Atlas Provider
provider "mongodbatlas" {
# Legacy API key authentication (backward compatibility)
public_key = var.mongodbatlas_public_key
private_key = var.mongodbatlas_private_key
# Recommended: Service account authentication
# Uncomment and configure the following for service account auth:
# service_account_id = var.mongodb_service_account_id
# private_key_file = var.mongodb_service_account_key_file
}

파일을 생성한 후 각 애플리케이션과 환경 쌍의 디렉토리로 이동하여 다음 명령을 실행하여 Terraform을 초기화합니다.

terraform init

Terraform 계획을 보려면 다음 명령을 실행합니다.

terraform plan

lifecycle 블록을 추가하여 disk_size_gbinstant_size를 명시적으로 변경한 후 lifecycle 블록을 주석 처리하고 terraform apply를 실행합니다. 완료 후에는 우발적인 변경을 방지하기 위해 lifecycle 블록의 주석을 해제합니다.

애플리케이션 및 환경 쌍에 대해 하나의 프로젝트와 하나의 배포를 생성하려면 다음 명령을 실행합니다. 명령은 파일과 MongoDB & HashiCorp Terraform을 사용하여 프로젝트와 클러스터를 생성합니다.

terraform apply

메시지가 표시되면 yes를 입력하고 Enter 키를 눌러 구성을 적용합니다.

이 예제에 대한 추가 구성 옵션과 정보는 MongoDB & HashiCorp TerraformMongoDB Terraform 블로그 게시물을 참조하세요.

돌아가기

성능

이 페이지의 내용