Atlas 확장성에 대한 지침
Atlas 확장성 기능
자동 확장을 통해 클러스터는 실시간 사용에 따라 계층, 저장 용량 또는 둘 다를 자동으로 조정할 수 있습니다. Atlas는 CPU 및 메모리 사용률을 분석하여 클러스터 계층을 확장하거나 축소할 시기와 여부를 결정합니다. Atlas가 클러스터 노드를 확장하거나 축소하는 조건에 대해 자세히 알아보려면 클러스터 계층 확장을 참조하세요. 최소 성능을 보장하거나 비용을 관리하기 위해 클러스터가 자동으로 확장할 수 있는 최대 및 최소 클러스터 크기 범위를 지정할 수도 있습니다. Atlas는 새 계층이 지정된 크기 범위를 벗어나거나 메모리 사용량이 새 계층의 용량을 초과할 경우 클러스터를 확장하지 않습니다. 자동 확장으로 인한 애플리케이션 영향을 방지하기 위해 클러스터 계층을 확장하거나 축소하는 데 지연 시간이 적용됩니다. 따라서 이는 데이터베이스가 사용량으로 인해 급격히 과부하되는 상황이 아닌, 꾸준히 증가하거나 감소하는 애플리케이션 부하에 가장 적합합니다. 워크로드에 빈번한 스파이크가 발생하거나 이벤트 또는 출시로 인해 트래픽이 크게 증가할 것으로 예상되는 경우 MongoDB는 프로그래밍 방식으로 미리 확장할 것을 권장합니다.
권장 배포 토폴로지에 언급된 Atlas 배포 템플릿은 수평 및 수직 확장 옵션을 제공합니다. 특히 샤딩은 데이터를 여러 머신에 분산시키므로 단일 서버로 워크로드를 처리할 수 없을 때 유용합니다. 샤딩은 노드 간에 리소스를 공유하지 않는 분산 컴퓨팅 아키텍처인 '공유 없음' 아키텍처를 따릅니다. 일반적인 쿼리 패턴을 용이하게 하면서 MongoDB가 클러스터 전체에 문서를 균등하게 분산할 수 있는 이상적인 샤드 키 선택에 대해 자세히 알아보려면 샤드 키 선택을 참조하세요. 또한 범위 샤딩, 해시 샤딩, 영역 샤딩과 같은 주요 샤딩 전략에 대해 알아보려면 성능 모범 사례: 샤딩을 참조하세요.
Atlas cluster 다음으로 사용 가능한 Atlas 계층 으로 업그레이드하는 것은 Atlas 컨트롤 플레인 GUI, Atlas 관리 API 또는 IaC 도구(예: Atlas Kubernetes Operator, MongoDB & HashiCorp Terraform 또는 Atlas CLI ) 를 통해 수행할 수 있습니다. 자세한 학습 은 Atlas 자동 인프라 프로비저닝 지침 을 참조하세요. 업스케일링 또는 다운스케일링을 통해 Atlas 계층 변경하면 다운타임이 없습니다. 계층 순차적으로 변경되며, 세컨더리 멤버를 교체 멤버로 선택하고, 이 세컨더리 멤버를 새 프라이머리 멤버로 승격시킨 다음, 클러스터 가능한 한 빨리 대상 구성으로 돌아가도록 실패한 멤버를 복원하거나 교체합니다. 수평 확장 프로그래밍 스크립트 에서 트리거할 수 있는 관리자 조치 에 따라 배포 후 발생합니다. 일부 클러스터 템플릿에는 샤딩된 클러스터가 필요합니다. MongoDB 버전 8.0부터, 임베디드 config 서버 를 사용하여 소규모 샤딩된 클러스터에서 config 서버와 관련된 비용을 줄일 수 있습니다.
Atlas의 저용량 CPU 옵션은 더 많은 메모리가 필요하지만 처리 능력은 그만큼 필요하지 않은 애플리케이션에 도움이 됩니다. 이 옵션은 동일한 클러스터 크기의 일반 계층에 비해 인스턴스에 절반의 vCPU를 제공하므로 메모리를 많이 사용하지만 CPU에 크게 의존하지 않는 워크로드의 비용을 절감합니다.
데이터 계층화 및 보관은 저비용 저장소에 데이터를 보관하면서 실시간 클러스터 데이터와 함께 쿼리를 가능하게 하여 장기 기록 보존에 특히 유용합니다. 이 프로세스를 최적화하기 위해 MongoDB는 간단하고 구성 가능한 규칙으로 데이터 보관을 자동화할 것을 권장합니다. 보관 규칙에서 지정할 수 있는 기준에 대한 자세한 내용은 데이터 보관을 참조하세요. 데이터 보존이 우선 순위가 아닌 경우 Atlas는 날짜 기준에 따라 사용하지 않는 데이터를 자동으로 삭제하는 옵션을 제공합니다. 자주 액세스하지 않는 데이터의 경우 TTL 인덱스는 특정 기간 후 또는 설정된 시간에 컬렉션에서 문서를 자동으로 삭제하는 특수한 단일 필드 인덱스입니다. 이는 제한된 시간 동안만 보존해야 하는 로그, 세션 정보 또는 이벤트 데이터와 같은 데이터에 특히 유용합니다. TTL 인덱스를 생성하려면 날짜 값을 포함하는 필드에 인덱스를 정의하고 초 단위로 유효 기간을 지정할 수 있습니다.
Atlas는 Performance Advisor와 같은 자동화된 도구도 제공합니다. 이 도구는 인덱스를 추가 및 제거하거나 클라이언트의 쿼리 구조를 변경하여 비효율적인 쿼리를 식별하고 최적화합니다. 실행 가능한 권장 사항을 따라 쿼리 성능을 개선하여 불필요한 컴퓨팅 시간과 리소스 소비를 줄일 수 있습니다. 또한 Atlas에서 제공하는 지능형 인덱스 권장 사항을 활용하여 데이터 검색 효율성을 더욱 개선하고 데이터베이스 운영에 필요한 리소스를 최소화할 수 있습니다.
Atlas 확장성에 대한 권장 사항
개발 및 테스트 환경에서는 자동 확장 컴퓨팅 및 자동 확장 저장소를 활성화하지 않습니다. 이는 비프로덕션 환경의 비용을 절감합니다.
스테이징 및 프로덕션 환경에서는 다음을 수행하는 것이 좋습니다.
애플리케이션이 소규모에서 중간 규모로 유기적으로 성장하는 인스턴스의 경우 컴퓨팅 및 스토리지에 대한 자동 확장을 활성화합니다.
If you use 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] }
)
자동화 예시: Atlas 확장성
모든 핵심 영역에 걸쳐 스테이징/프로덕션 권장 사항을 적용하는 Terraform 예시는 GitHub에서 확인할 수 있습니다.
다음 예시는 Atlas 자동화 도구를 사용하여 컴퓨팅 및 스토리지 자동 확장을 활성화합니다.
이러한 예시는 다음을 포함한 다른 권장 구성에도 적용됩니다.
개발/테스트 환경을 위해 클러스터 계층을
M10
으로 설정합니다. 애플리케이션 크기에 맞는 권장 클러스터 계층을 알아보려면 클러스터 크기 가이드를 참조하세요.단일 리전, 3-노드 복제본 세트/샤드 배포 토폴로지
당사의 예시는 AWS, Azure 및 Google Cloud를 상호 교체하여 사용합니다. 세 곳의 클라우드 공급자 중 어느 곳이든 사용할 수 있지만 클라우드 공급자에 맞게 지역 이름을 변경해야 합니다. 클라우드 공급자와 그 지역에 대해 알아보려면 클라우드 공급자를 참조하세요.
중간 규모 애플리케이션을 위해 클러스터 계층을
M30
으로 설정합니다. 애플리케이션 크기에 맞는 권장 클러스터 계층을 알아보려면 클러스터 크기 가이드를 참조하세요.단일 리전, 3-노드 복제본 세트/샤드 배포 토폴로지
당사의 예시는 AWS, Azure 및 Google Cloud를 상호 교체하여 사용합니다. 세 곳의 클라우드 공급자 중 어느 곳이든 사용할 수 있지만 클라우드 공급자에 맞게 지역 이름을 변경해야 합니다. 클라우드 공급자와 그 지역에 대해 알아보려면 클라우드 공급자를 참조하세요.
참고
Atlas CLI로 리소스를 생성하기 전에 다음을 수행해야 합니다.
Programmatic Use의 단계에 따라 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 클러스터 생성을 참조하세요.
참고
프로젝트 및 배포 생성
개발 및 테스트 환경의 경우 비용 절감을 위해 컴퓨팅 및 스토리지 자동 확장이 비활성화됩니다.
스테이징 및 프로덕션 환경의 경우 각 애플리케이션과 환경 쌍에 대해 다음 파일을 생성하세요. 각 애플리케이션과 환경 쌍의 파일은 별도의 디렉토리에 배치하세요. 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 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 }
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
블록의 주석을 해제합니다.
애플리케이션 및 환경 쌍에 대해 하나의 프로젝트와 하나의 배포를 생성하려면 다음 명령을 실행합니다. 명령은 파일과 MongoDB & HashiCorp Terraform을 사용하여 프로젝트와 클러스터를 생성합니다.
terraform apply
메시지가 표시되면 yes
를 입력하고 Enter
키를 눌러 구성을 적용합니다.
이 예제에 대한 추가 구성 옵션과 정보는 MongoDB & HashiCorp Terraform 및 MongoDB Terraform 블로그 게시물을 참조하세요.