자체 관리 배포서버를 위한 프로덕션 노트
이 페이지의 내용
이 페이지에서는 특히 프로덕션 환경에서 실행할 때 MongoDB에 영향을 미치는 시스템 구성을 자세히 설명합니다.
참고
MongoDB Atlas는 클라우드에 호스팅되는 서비스형 데이터베이스입니다. 호스팅 서비스인 MongoDB Cloud Manager와 온프레미스 솔루션인 Ops Manager는 MongoDB 인스턴스의 모니터링, 백업 및 자동화를 제공합니다. 자세한 설명은 Atlas 문서, MongoDB Cloud Manager 문서 및 Ops Manager 문서를 참조하세요.
MongoDB Atlas에서 호스팅되는 배포의 프로덕션 실행에 대해 자세히 알아보려면 Atlas 프로덕션 노트를 참조하세요.
플랫폼 지원
프로덕션 환경에서 실행하려면 운영 체제 권장 사항에 대한 권장 플랫폼을 참조하세요.
플랫폼 지원 참고 사항
x86_64
MongoDB에는 다음 최소 x86_64
마이크로아키텍처가 필요합니다.
Intel
x86_64
의 경우 MongoDB에는 다음 중 하나가 필요합니다.Sandy Bridge 이상 코어 프로세서, 또는
Tiger Lake 이상의 Celeron 또는 Pentium 프로세서.
AMD
x86_64
의 경우 MongoDB에는 다음이 필요합니다.Bulldozer 이상의 프로세서.
MongoDB 5.0부터 mongod
, mongos
및 레거시 mongo
Shell은 이 최소 마이크로아키텍처 요구 사항을 충족하지 않는 x86_64
플랫폼을 더 이상 지원 하지 않습니다.
MongoDB는 RHCK(Red Hat Compatible Kernel)를실행하는 Oracle Linux만 지원합니다. MongoDB는 UEK(Unbreakable Enterprise Kernel)를 지원하지 않습니다.
MongoDB 5.0에서는 특정 Intel 및 AMD 프로세서에서 사용할 수 있는 AVX 명령어 세트를 사용해야 합니다.
ARM64
arm64
의 MongoDB에는 ARMv8.2-A 또는 그 이상의 마이크로 아키텍처가 필요합니다.
MongoDB 5.0부터 mongod
, mongos
및 레거시 mongo
셸은 이 최소 마이크로아키텍처 요구 사항을 충족하지 않는 arm64
플랫폼을 더 이상 지원하지 않습니다.
ARM v8.4-A 이상의 마이크로아키텍처를 사용하려면 MongoDB 버전 7.0 이상을 사용하세요.
참고
MongoDB는 더 이상 적절한 CPU 아키텍처(Raspberry Pi 4)가 없는 단일 보드 하드웨어를 지원하지 않습니다. 자세한 내용은 MongoDB 5.0의 호환성 변경 사항을 참조하세요.
플랫폼 지원 매트릭스
MongoDB 8.0 부터 새로운 MongoDB Server 버전(메이저 및 마이너)은 OS 벤더 에서 정의한 최소 운영 체제(OS) 마이너 버전을 지원 합니다. OS 벤더 에서 OS 마이너 버전을 더 이상 지원하지 않는 경우, MongoDB 는 다음 OS 마이너 버전을 지원 하도록 MongoDB Server 를 업데이트합니다. 자세한 내용은 MongoDB 플랫폼 지원 개선 사항을 참조하세요.
MongoDB 8.0 은 다음과 같은 최소 OS 마이너 버전을 지원합니다.
Red Hat Enterprise Linux 8.8
Red Hat Enterprise Linux 9.3
SUSE Linux 엔터프라이즈 서버 15 SP5
Amazon Linux 2023 버전 2023.3
중요
v4.4 사용 종료
v4.4는 2024년 2월 29에 사용이 종료되어 더 이상 MongoDB에서 지원되지 않습니다.
플랫폼 | 아키텍처 | 에디션 | 8.0 | 7.0 | 6.0 | 5.0 | 4.4 |
---|---|---|---|---|---|---|---|
Amazon Linux 2023 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
Amazon Linux 2023 | x86_64 | Community | ✓ | ✓ | |||
Amazon Linux V2 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | |
Amazon Linux V2 | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | |
Debian 12 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
Debian 12 | x86_64 | Community | ✓ | ✓ | |||
Debian 11 | x86_64 | 엔터프라이즈 | ✓ | ✓ | 5.0.8+ | ||
Debian 11 | x86_64 | Community | ✓ | ✓ | 5.0.8+ | ||
Debian 10 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
Debian 10 | x86_64 | Community | ✓ | ✓ | ✓ | ||
Debian 9 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
Debian 9 | x86_64 | Community | ✓ | ✓ | |||
RHEL/Rocky/Alma/Oracle Linux 9.0+ [1] | x86_64 | 엔터프라이즈 | ✓ | ✓ | 6.0.4+ | ||
RHEL/Rocky/Alma/Oracle Linux 9.0+ [1] | x86_64 | Community | ✓ | ✓ | 6.0.4+ | ||
RHEL/Rocky/Alma/Oracle Linux 8.0+ [1] | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | ✓ |
RHEL/Rocky/Alma/Oracle Linux 8.0+ [1] | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | ✓ |
RHEL/CentOS/Oracle Linux 7.0+ [1] | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | |
RHEL/CentOS/Oracle Linux 7.0+ [1] | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | |
RHEL/CentOS/Oracle Linux 6.2+ [1] | x86_64 | 엔터프라이즈 | ✓ | ||||
RHEL/CentOS/Oracle Linux 6.2+ [1] | x86_64 | Community | ✓ | ||||
SLES 15 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | ✓ |
SLES 15 | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | ✓ |
SLES 12 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | |
SLES 12 | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | |
Ubuntu 24.04 | x86_64 | 엔터프라이즈 | ✓ | ||||
Ubuntu 24.04 | x86_64 | Community | ✓ | ||||
Ubuntu 22.04 | x86_64 | 엔터프라이즈 | ✓ | ✓ | 6.0.4+ | ||
Ubuntu 22.04 | x86_64 | Community | ✓ | ✓ | 6.0.4+ | ||
Ubuntu 20.04 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | ✓ |
Ubuntu 20.04 | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | ✓ |
Ubuntu 18.04 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
Ubuntu 18.04 | x86_64 | Community | ✓ | ✓ | ✓ | ||
Ubuntu 16.04 | x86_64 | 엔터프라이즈 | ✓ | ||||
Ubuntu 16.04 | x86_64 | Community | ✓ | ||||
Windows 11 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
Windows 11 | x86_64 | Community | ✓ | ✓ | ✓ | ||
Windows Server 2022 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
Windows Server 2022 | x86_64 | Community | ✓ | ✓ | ✓ | ||
Windows Server 2019 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | |
Windows Server 2019 | x86_64 | Community | ✓ | ✓ | ✓ | ✓ | |
Windows 10 / Server 2016 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
Windows 10 / Server 2016 | x86_64 | Community | ✓ | ✓ | ✓ | ||
macOS 14 | x86_64 | 엔터프라이즈 | ✓ | ||||
macOS 14 | x86_64 | Community | ✓ | ||||
macOS 13 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 13 | x86_64 | Community | ✓ | ✓ | |||
macOS 12 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 12 | x86_64 | Community | ✓ | ✓ | |||
macOS 11 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 11 | x86_64 | Community | ✓ | ✓ | |||
macOS 10.15 | x86_64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
macOS 10.15 | x86_64 | Community | ✓ | ✓ | ✓ | ||
macOS 10.14 | x86_64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 10.14 | x86_64 | Community | ✓ | ✓ | |||
macOS 10.15 | x86_64 | 엔터프라이즈 | ✓ | ||||
macOS 10.15 | x86_64 | Community | ✓ | ||||
macOS 14 | arm64 | 엔터프라이즈 | ✓ | ||||
macOS 14 | arm64 | Community | ✓ | ||||
macOS 13 | arm64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 13 | arm64 | Community | ✓ | ✓ | |||
macOS 12 | arm64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 12 | arm64 | Community | ✓ | ✓ | |||
macOS 11 | arm64 | 엔터프라이즈 | ✓ | ✓ | |||
macOS 11 | arm64 | Community | ✓ | ✓ | |||
Amazon Linux 2023 | arm64 | 엔터프라이즈 | ✓ | ✓ | |||
Amazon Linux 2023 | arm64 | Community | ✓ | ✓ | |||
Amazon Linux 2 | arm64 | 엔터프라이즈 | ✓ | ✓ | ✓ | 4.4.4+ | |
Amazon Linux 2 | arm64 | Community | ✓ | ✓ | ✓ | 4.4.4+ | |
RHEL/CentOS/Rocky/Alma 9 | arm64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
RHEL/CentOS/Rocky/Alma 9 | arm64 | Community | ✓ | ✓ | ✓ | ||
RHEL/CentOS/Rocky/Alma 8 | arm64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | 4.4.4+ |
RHEL/CentOS/Rocky/Alma 8 | arm64 | Community | ✓ | ✓ | ✓ | ✓ | 4.4.4+ |
Ubuntu 24.04 | arm64 | 엔터프라이즈 | ✓ | ||||
Ubuntu 24.04 | arm64 | Community | ✓ | ||||
Ubuntu 22.04 | arm64 | 엔터프라이즈 | ✓ | ✓ | 6.0.4+ | ||
Ubuntu 22.04 | arm64 | Community | ✓ | ✓ | 6.0.4+ | ||
Ubuntu 20.04 | arm64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | ✓ |
Ubuntu 20.04 | arm64 | Community | ✓ | ✓ | ✓ | ✓ | ✓ |
Ubuntu 18.04 | arm64 | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
Ubuntu 18.04 | arm64 | Community | ✓ | ✓ | ✓ | ||
Ubuntu 16.04 | arm64 | 엔터프라이즈 | ✓ | ||||
RHEL/Rocky/Alma 9 | ppc64le | 엔터프라이즈 | ✓ | ✓ | |||
RHEL/Rocky/Alma 8 [5] | ppc64le | 엔터프라이즈 | ✓ | ✓ | ✓ | ✓ | ✓ |
RHEL/CentOS 7 | ppc64le | 엔터프라이즈 | 6.0.7+ | ✓ | ✓ | ||
RHEL/Rocky/Alma 8 [5] | s390x | 엔터프라이즈 | ✓ | ✓ | ✓ | 5.0.9+ | |
RHEL/CentOS 7 | s390x | 엔터프라이즈 | ✓ | ✓ | ✓ | ||
RHEL/CentOS 7 | s390x | Community | ✓ | ✓ |
[1] | (1, 2, 3, 4, 5, 6, 7, 8) Oracle Linux에서 MongoDB는 Red Hat 호환 커널만 지원합니다. |
[2] | MongoDB 버전 5.0 이상은 SLES 12 서비스 팩 5에 대해 테스트됩니다. 이전 버전의 MongoDB는 서비스 팩 없이 SLES 12에 대해 테스트됩니다. |
[3] | MongoDB 버전 7.0 이상은 SLES 15 서비스 팩 4에 대해 테스트됩니다. 이전 버전의 MongoDB는 서비스 팩 없이 SLES 15에 대해 테스트됩니다. |
[4] | MongoDB 버전 7.0은 RHEL 7.9에 대해 빌드 및 테스트되었습니다. 이전 버전의 MongoDB는 RHEL 7에 대해 테스트되었으며 이전 버전과 호환되는 것으로 가정합니다. |
[5] | (1, 2) PPC64LE 및 s390x의 RHEL 8은 MongoDB 버전 8.0 이상에서 사용되는 TCMalloc의 업데이트된 버전을 지원하지 않습니다. 이러한 아키텍처에서 RHEL 8은 레거시 TCMalloc 버전을 사용합니다. 자세한 내용은 자체 관리형 배포를 위한 TCMalloc 성능 최적화를 참조하세요. |
[6] | PPC64LE의 RHEL 9은 MongoDB 버전 8.0 이상에서 사용되는 업데이트된 버전의 TCMalloc을 지원하지 않습니다. 이 아키텍처에서 RHEL 9은 레거시 TCMalloc 버전을 사용합니다. 자세한 내용은 자체 관리 배포를 위한 TCMalloc 성능 최적화를 참조하세요. |
권장 플랫폼
MongoDB는 다양한 플랫폼을 지원하지만 x86_64
아키텍처의 프로덕션에서는 다음 운영 체제를 사용하는 것이 좋습니다.
Amazon Linux
Debian
RHEL [ 7 ]
SLES
Ubuntu LTS
Windows 서버
최상의 결과를 얻으려면 최신 버전의 플랫폼을 실행하세요. 이전 버전을 실행하는 경우 해당 제공자가 해당 버전을 지원하는지 확인합니다.
[7] | RHEL 버전 8.0+용으로 출시된 MongoDB 온프레미스 제품은 해당 배포판이 완전한 RHEL 호환성을 제공해야 하는 의무를 충족하는 경우에 한해 Rocky Linux 버전 8.0+ 및 AlmaLinux 버전 8.0+와 호환됩니다. |
최신 스테이블 패키지 사용
안정적인 최신 릴리스가 설치되어 있는지 확인합니다.
MongoDB 릴리스는 MongoDB 다운로드 센터에서 확인할 수 있습니다.
최신 마이너 출시하다 로 업그레이드하는 방법에 대한 자세한 내용 은 MongoDB 의 최신 자체 관리 패치 릴리스로 업그레이드를 참조하세요.
MongoDB 다운로드 센터에서도 다음과 같은 관련 패키지를 사용할 수 있습니다.
다른 MongoDB 제품에 대해서는 해당 설명서 를 참조하세요.
MongoDB dbPath
dbPath
디렉토리의 파일은 구성된 스토리지 엔진과 일치해야 합니다. mongod
dbPath
에 지정된 것이 아닌, 스토리지 엔진에서 만든 데이터 파일이 포함되어 있는 경우 --storageEngine
가 시작되지 않습니다.
mongod
는 지정된 dbPath
에 대한 읽기 및 쓰기 권한이 있어야 합니다.
바이러스 백신(AV) 스캐너 또는 엔드포인트 탐지 및 대응(EDR) 스캐너를 사용하는 경우 database storage path
및 database log path
를 검사에서 제외하도록 스캐너를 구성하세요.
database storage path
의 데이터 파일이 압축됩니다. 또한 암호화된 스토리지 엔진을 사용하는 경우 데이터 파일도 암호화됩니다. 이러한 파일을 스캔하는 데 드는 I/O 및 CPU 비용은 보안상의 이점 없이 성능을 크게 저하시킬 수 있습니다.
database storage path
및 database log path
에서 디렉토리를 제외하지 않으면 스캐너가 중요한 파일을 격리하거나 삭제할 수 있습니다. 파일이 누락되거나 격리되면 데이터베이스가 손상되고 MongoDB 인스턴스가 충돌할 수 있습니다.
동시성
wiredTiger
WiredTiger는 컬렉션의 문서에 대해 읽기 수행자와 쓰기 수행자의 동시 액세스를 지원합니다. 클라이언트는 쓰기 작업이 진행되는 동안 문서를 읽을 수 있으며, 여러 스레드가 동시에 컬렉션의 여러 문서를 수정할 수 있습니다.
데이터 일관성
저널링
MongoDB는 온디스크 저널에 미리 쓰기 로깅을 사용합니다. 저널링을 사용하면 MongoDB가 충돌 또는 기타 심각한 오류로 인해 종료된 mongod
경우 저널에 기록되었지만 데이터 파일에 기록되지 않은 쓰기 작업을 신속하게 복구할 수 있습니다. 자세한 내용은 저널링을 참조하세요.
readConcern
쓰기에서 승인을 요청하는 경우 인과적으로 일관된 세션을 사용하여 자신의 쓰기를 읽을 수 있습니다.
쓰기 고려
쓰기 고려는 쓰기 작업에 대해 MongoDB에서 요청하는 승인 수준을 설명합니다. 쓰기 고려 수준은 쓰기 작업이 얼마나 빨리 반환되는지에 영향을 줍니다. 쓰기 작업은 쓰기 우려가 약한 경우 빠르게 반환됩니다. 더욱 강한 쓰기 고려를 사용하면 클라이언트는 쓰기 작업을 보낸 후 MongoDB가 요청된 쓰기 고려 수준에서 쓰기 작업을 확인할 때까지 기다려야 합니다. 쓰기 고려가 충분하지 않은 경우 클라이언트에는 쓰기 고려가 성공한 것으로 표시될 수 있지만 서버 장애가 발생하는 경우 지속되지 않을 수 있습니다.
배포에 적합한 쓰기 고려 수준을 선택하는 방법에 대한 자세한 내용은 쓰기 고려 문서를 참조하세요.
Networking
신뢰할 수 있는 네트워킹 환경 사용
알 수 없는 모든 컴퓨터, 시스템, 네트워크의 액세스를 차단하는 네트워크 규칙을 사용하여 항상 신뢰할 수 있는 환경에서 MongoDB를 실행하세요. 네트워크에 의존하는 모든 민감한 시스템과 마찬가지로 MongoDB deployment는 애플리케이션 서버, 모니터링 서비스 및 기타 MongoDB 구성 요소와 같이 액세스가 필요한 특정 시스템에서만 액세스할 수 있어야 합니다.
중요
기본적으로 권한 부여는 활성화되어 있지 않으며 mongod
는 신뢰할 수 있는 환경을 가정합니다. 필요에 따라 authorization
모드를 활성화합니다. MongoDB에서 지원되는 인증 메커니즘 및 MongoDB의 권한 부여에 대한 자세한 내용은 자체 관리 배포에 대한 인증 및 자체 관리 배포의 역할 기반 액세스 제어를 참조하세요.
보안에 대한 추가 정보 및 고려 사항은 보안 섹션의 문서, 특히 다음을 참조하세요.
Windows 사용자의 경우 Windows에서 MongoDB를 배포할 때 TCP 구성에 관한 Windows Server 테크넷 문서를 참조하세요.
HTTP 인터페이스 비활성화
HTTP 인터페이스는 기본적으로 비활성화되어 있습니다. 프로덕션 환경에서는 HTTP 인터페이스를 활성화하지 마세요.
연결 풀 크기 관리
사용 사례에 맞게 연결 풀 크기를 조정하여 mongod
또는 mongos
인스턴스의 연결 리소스에 과부하가 걸리지 않도록 하세요. 현재 데이터베이스의 일반적인 요청 수를 기준으로 110~115%에서 시작하여 필요에 따라 연결 풀 크기를 수정합니다. 연결 풀 크기를 조정하려면 연결 풀 옵션을 참조하세요.
connPoolStats
명령은 샤딩된 클러스터 내 mongos
및 mongod
인스턴스에 대한 현재 데이터베이스의 열려 있는 연결 수에 관한 정보를 반환합니다.
충분한 RAM 및 CPU 할당도 참조하세요.
하드웨어 고려 사항
MongoDB는 상용 하드웨어를 염두에 두고 특별히 설계되었으며, 하드웨어 요구 사항이나 제한 사항이 거의 없습니다. MongoDB의 핵심 구성 요소는 주로 x86/x86_64 프로세서와 같은 리틀 엔디안 하드웨어에서 실행됩니다. 클라이언트 라이브러리(예: 드라이버)는 빅 또는 리틀 엔디안 시스템에서 실행될 수 있습니다.
충분한 RAM 및 CPU 할당
최소한 각 mongod
또는 mongos
인스턴스가 실제 코어 2개 또는 멀티 코어인 물리적 CPU 1개에 액세스할 수 있어야 합니다.
wiredTiger
WiredTiger 스토리지 엔진은 멀티스레드로, 추가 CPU 코어를 활용할 수 있습니다. 특히 활성 스레드의 총 개수(예 동시 작업)는 사용 가능한 CPU 수와 관련이 있으며 성능에 영향을 줄 수 있습니다.
동시 활성 작업 수가 CPU 수만큼 증가하면 처리량이 증가합니다.
동시 활성 작업 수가 CPU 수를 일부 임계값만큼 초과하면 처리량이 감소합니다.
임계값은 애플리케이션에 따라 다릅니다. 처리량을 실험하고 측정하여 애플리케이션에 가장 적합한 동시 활성 작업 수를 결정할 수 있습니다. mongostat
의 출력은 (ar|aw
) 열의 활성 읽기/쓰기 수에 대한 통계를 제공합니다.
MongoDB는 WiredTiger를 통해 내부 캐시와 파일 시스템 캐시 모두를 활용합니다.
기본 WiredTiger 내부 캐시 크기는 다음 중 더 큰 값입니다.
(RAM - 1GB)의 50%
256 MB.
예를 들어 총 4 GB RAM이 있는 시스템에서 WiredTiger 캐시는 1.5 GB RAM(0.5 * (4 GB - 1 GB) =
1.5 GB
)을 사용합니다. 반대로, 총 RAM이 1.25 GB인 시스템에서는 WiredTiger는 WiredTiger 캐시에 256 MB를 할당하는데, 이는 전체 RAM에서 1 GB(0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB
)를 뺀 값의 절반 이상이기 때문입니다.
참고
컨테이너에서 실행할 때 등의 일부 인스턴스에서는 데이터베이스 메모리 제한이 총 시스템 메모리보다 낮을 수 있습니다. 이러한 인스턴스에서는 총 시스템 메모리가 아니라 이 메모리 제한이 사용 가능한 최대 RAM으로 사용됩니다.
메모리 제한을 보려면 hostInfo.system.memLimitMB
참조하세요.
기본적으로 WiredTiger는 모든 컬렉션에 Snappy 블록 압축을 사용하고 모든 인덱스에 접두사 압축을 사용합니다. 압축 기본값은 전역 수준에서 구성할 수 있으며 컬렉션 및 인덱스 생성 중에 컬렉션 및 인덱스별로 설정할 수도 있습니다.
WiredTiger 내부 캐시와 온디스크 형식의 데이터에는 서로 다른 표현이 사용됩니다.
파일 시스템 캐시의 데이터는 온디스크 형식과 동일하며, 데이터 파일에 대한 모든 압축의 이점을 누릴 수 있습니다. 파일시스템 캐시는 운영 체제에서 디스크 I/O를 줄이기 위해 사용됩니다.
WiredTiger 내부 캐시에 로드된 인덱스는 온디스크 형식과는 다른 데이터 표현을 갖지만, 인덱스 접두사 압축을 활용하여 RAM 사용량을 줄일 수 있습니다. 인덱스 접두사 압축은 인덱싱된 필드에서 공통 접두사를 중복 제거합니다.
WiredTiger 내부 캐시의 컬렉션 데이터는 압축되지 않으며 온디스크 형식과 다른 표현을 사용합니다. 차단 압축은 상당한 온디스크 스토리지 절감을 제공할 수 있지만 서버에서 데이터를 조작하려면 압축을 풀어야 합니다.
MongoDB는 파일 시스템 캐시를 통해 자동으로 WiredTiger 캐시나 다른 프로세스에서 사용되지 않는 모든 여유 메모리를 사용합니다.
와이어드타이거 내부 캐시 크기를 조정하려면 storage.wiredTiger.engineConfig.cacheSizeGB
및 --wiredTigerCacheSizeGB
를 참조하세요. WiredTiger 내부 캐시 크기를 기본값 이상으로 늘리지 마세요.
참고
storage.wiredTiger.engineConfig.cacheSizeGB
는 WiredTiger 내부 캐시의 크기를 제한합니다. 운영 체제는 사용 가능한 여유 메모리를 파일 시스템 캐시에 사용하여 압축된 MongoDB 데이터 파일을 메모리에 유지할 수 있습니다. 또한 운영 체제는 사용 가능한 RAM을 사용하여 파일 시스템 차단과 파일 시스템 캐시를 버퍼링합니다.
추가적인 RAM 소비를 수용하려면 WiredTiger 내부 캐시 크기를 줄여야 할 수 있습니다.
기본 WiredTiger 내부 캐시 크기 값은 머신당 단일 mongod
인스턴스가 있다고 가정합니다. 단일 머신에 여러 MongoDB 인스턴스가 포함된 경우 다른 mongod
인스턴스를 수용할 수 있도록 설정을 줄여야 합니다.
시스템에서 사용 가능한 모든 RAM에 액세스할 수 없는 컨테이너에서 mongod
를 실행하는 경우(예를 들어, lxc
, cgroups
, Docker 등) storage.wiredTiger.engineConfig.cacheSizeGB
를 반드시 컨테이너에서 사용 가능한 RAM의 양보다 적은 값으로 설정해야 합니다. 정확한 양은 컨테이너에서 실행 중인 다른 프로세스에 따라 달라집니다. memLimitMB
를 참조하세요.
캐시 및 퇴거율에 대한 통계를 보려면 serverStatus
명령에서 반환된 wiredTiger.cache
필드를 참조하세요.
압축 및 암호화
암호화를 사용할 때 AES-NI 지침 세트 확장이 장착된 CPU는 상당한 성능 이점을 보여줍니다. 암호화된 스토리지 엔진과 함께 MongoDB Enterprise를 사용하는 경우, 더 나은 성능을 위해 AES-NI를 지원하는 CPU를 선택하세요.
솔리드 스테이트 디스크(SSD) 사용
MongoDB는 SATA SSD(솔리드 스테이트 디스크)를 사용해 결과가 좋고 가격 대비 성능비도 좋습니다.
사용 가능하고 경제적인 경우 SSD를 사용하세요.
더 비싼 스피닝 드라이브의 랜덤 I/O 성능 향상이 그다지 탁월하지 않은 만큼(2배 정도에 불과) 상용(SATA) 스피닝 드라이브가 더욱 좋은 선택일 수 있습니다. SSD를 사용하거나 RAM을 늘리면 I/O 처리량을 늘리는 데 더욱 효과적일 수 있습니다.
MongoDB 및 NUMA 하드웨어
NUMA(Non-Uniform Memory Access)가 있는 시스템에서 MongoDB를 실행하면 일정 기간 동안 성능이 저하되고 시스템 프로세스 사용량이 많아지는 등 여러 운영 문제가 발생할 수 있습니다.
NUMA 하드웨어에서 MongoDB 서버와 클라이언트를 실행하는 경우, 호스트가 비NUMA 방식으로 작동하도록 메모리 인터리브 정책을 구성해야 합니다. MongoDB는 Linux(버전 2.0 이후) 및 Windows(버전 2.6 이후) 머신에 배포할 때 시작 시 NUMA 설정을 확인합니다. NUMA 구성으로 인해 성능이 저하될 수 있는 경우, MongoDB는 경고를 출력합니다.
numad
데몬 프로세스로 인해 mongod
성능이 저하될 수도 있습니다. MongoDB Server에서 numad
이(가) 활성화되어 있지 않은지 확인해야 합니다.
팁
다음도 참조하세요.
MySQL '비정상적인 스왑(swap)' 문제와 NUMA의 영향 게시물에서 NUMA가 데이터베이스에 미치는 영향에 대해 설명합니다. 이 게시물에서는 NUMA와 그 목표를 소개하고 이러한 목표가 프로덕션 데이터베이스와 어떻게 호환되지 않는지 설명합니다. 블로그 게시물에서는 NUMA가 MySQL에 미치는 영향을 다루고 있지만 MongoDB에 대한 문제도 비슷합니다.
Windows에서 NUMA 구성
Windows에서는 컴퓨터의 BIOS를 통해 메모리 인터리빙을 활성화해야 합니다. 자세한 내용은 시스템 설명서를 참조하세요.
Linux에서 NUMA 구성
Linux에서는 구역 회수 기능을 비활성화하고 mongod
및 mongos
인스턴스가 일반적으로 플랫폼의 init 시스템을 통해 구성되는 numactl
에 의해 시작되도록 해야 합니다. 이 두 가지 작업을 모두 수행해야 MongoDB와 함께 사용할 수 있도록 NUMA를 올바르게 비활성화할 수 있습니다.
다음 명령 중 하나를 사용하여 구역 회수 기능을 비활성화합니다:
echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mode sudo sysctl -w vm.zone_reclaim_mode=0 mongod
및mongos
가numactl
로 시작되는지 확인합니다. 이는 일반적으로 플랫폼의 init 시스템을 통해 구성됩니다. 다음 명령을 실행하여 플랫폼에서 사용 중인 init 시스템을 확인합니다:ps --no-headers -o comm 1 "
systemd
"인 경우 플랫폼에서 systemd 초기화 시스템을 사용하며, 아래 systemd 탭의 단계에 따라 MongoDB 서비스 파일을 편집해야 합니다."
init
"인 경우 플랫폼에서 SysV 초기화 시스템을 사용하므로 이 단계를 수행할 필요가 없습니다. SysV 초기화를 위한 기본 MongoDB init 스크립트에는 기본적으로numactl
을 통해 MongoDB 인스턴스를 시작하는 데 필요한 단계가 포함되어 있습니다.init 스크립트를 직접 관리하는 경우(예: 이러한 init 시스템 중 하나를 사용하고 있지 않은 경우), 아래의 init 스크립트 사용자 지정 탭에 있는 단계를 반드시 준수하여 사용자 정의 init 스크립트를 편집해야 합니다.
모든 config 서버,
mongos
인스턴스 및 클라이언트를 포함하여 각mongod
인스턴스를 시작하려면numactl
을 사용해야 합니다. 다음과 같이 각각에 대한 기본 systemd 서비스 파일을 편집합니다.기본 MongoDB 서비스 파일을 복사합니다.
sudo cp /lib/systemd/system/mongod.service /etc/systemd/system/ /etc/systemd/system/mongod.service
파일을 편집하고ExecStart
문을 업데이트하여 다음으로 시작합니다./usr/bin/numactl --interleave=all 예시
기존
ExecStart
문이 다음과 같은 경우.ExecStart=/usr/bin/mongod --config /etc/mongod.conf 해당 문을 업데이트하여 다음을 읽도록 합니다.
ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod --config /etc/mongod.conf systemd
에 변경 사항을 적용합니다.sudo systemctl daemon-reload 실행 중인
mongod
인스턴스를 다시 시작합니다.sudo systemctl stop mongod sudo systemctl start mongod 해당하는 경우 모든
mongos
인스턴스에 대해 이 단계를 반복합니다.
모든 config 서버,
mongos
인스턴스 및 클라이언트를 포함하여 각mongod
인스턴스를 시작하려면numactl
을 사용해야 합니다.아직 설치되지 않은 경우 플랫폼에 맞게
numactl
을(를) 설치합니다.numactl
패키지 설치에 대한 자세한 내용은 운영 체제 설명서를 참조하세요.각 사용자 정의 초기화 스크립트가
numactl
를 통해 각 MongoDB 인스턴스를 시작하도록 구성합니다.numactl --interleave=all <path> <options> 여기서
<path>
은(는) 시작하는 프로그램의 경로이고<options>
은(는) 해당 프로그램에 전달할 선택적 인수입니다.예시
numactl --interleave=all /usr/local/bin/mongod -f /etc/mongod.conf
자세한 내용은 /proc/sys/vm/* 문서를 참조하세요.
디스크 및 스토리지 시스템
Swap
스왑에서 데이터를 검색하는 것은 항상 RAM의 데이터에 액세스하는 것보다 느리기 때문에 스왑을 피하거나 최소한으로 유지할 수 있는 경우 MongoDB의 성능이 가장 우수합니다. 그러나 MongoDB를 호스팅하는 시스템의 RAM이 부족한 경우 스왑을 수행하면 Linux OOM 킬러가 mongod
프로세스를 종료하지 못할 수 있습니다.
일반적으로 다음 스왑 전략 중 하나를 선택해야 합니다:
시스템에 스왑 공간을 할당하고 메모리 부하가 높은 경우에만 스와핑을 허용하도록 커널을 구성합니다.
시스템에 스왑 공간을 할당하지 말고 스왑을 완전히 비활성화하도록 커널을 구성하세요.
이 가이드라인에 따라 Linux 시스템에서 스왑을 구성하는 방법과 관련한 정보를 알아보려면 vm.swappiness 설정을 참조하세요.
참고
웹 서버와 같은 다른 소프트웨어를 실행하는 시스템에서 MongoDB 인스턴스를 호스팅하는 경우, 첫 번째 스왑 전략을 선택해야 합니다. 이 경우 스왑을 비활성화하지 마세요. 가능하다면 MongoDB를 자체 전용 시스템에서 실행하는 것이 좋습니다.
RAID
스토리지 계층의 성능을 최적화하려면 RAID-10으로 지원되는 디스크를 사용하세요. RAID-5 및 RAID-6은 일반적으로 MongoDB deployment를 지원하기에 충분한 성능을 제공하지 않습니다.
원격 파일 시스템(NFS)
원격 파일 시스템이 ISO/IEC 9945-1:1996(POSIX.1)을 준수하는 경우, WiredTiger 스토리지 엔진을 통해 WiredTiger 객체를 원격 파일 시스템에 저장할 수 있습니다. 원격 파일 시스템은 로컬 파일 시스템보다 속도가 느린 경우가 많으므로, 원격 파일 시스템을 스토리지로 사용하면 성능이 저하될 수 있습니다.
NFS를 사용하기로 결정한 경우 /etc/fstab
파일에 다음 NFS 옵션을 추가합니다.
bg
hard
nolock
noatime
nointr
커널 버전에 따라 이러한 값 중 일부가 이미 기본값으로 설정되었을 수 있습니다. 자세한 내용은 해당 플랫폼의 설명서를 참조하세요.
구성 요소를 다른 저장 장치에 분리
성능을 향상시키려면 애플리케이션의 액세스 및 쓰기 패턴에 따라 데이터베이스의 데이터, 저널 및 로그를 서로 다른 저장 장치에 분리하는 것이 좋습니다. 컴포넌트를 별도의 파일 시스템으로 마운트하고 심볼릭 링크를 사용하여 각 컴포넌트를 저장된 장치에 매핑합니다.
WiredTiger 스토리지 엔진의 경우 인덱스를 다른 스토리지 장치에 저장할 수도 있습니다. storage.wiredTiger.engineConfig.directoryForIndexes
를 참조하세요.
참고
다른 저장 장치를 사용하면 파일이 서로 다른 디바이스와 볼륨에 있기 때문에 스냅샷 스타일의 데이터 백업을 생성하는 데 영향을 미칩니다.
일정 예약
가상 또는 클라우드 호스팅 장치에 대한 스케줄링
하이퍼바이저를 통해 가상 머신 인스턴스에 연결되거나 클라우드 호스팅 제공자에 의해 호스팅되는 로컬 블록 장치의 경우 게스트 운영 체제는 최상의 성능을 위해 cfq 스케줄러를 사용해야 합니다. cfq
스케줄러를 사용하면 운영 체제에서 I/O 스케줄링을 기본 하이퍼바이저로 연기할 수 있습니다.
참고
눕 스케줄러는 다음 조건이 모두 충족되는 경우 예약에 사용할 수 있습니다.
하이퍼바이저는 VMware입니다.
복제본 세트 토폴로지 또는 샤딩된 클러스터가 사용됩니다.
가상 머신은 동일한 가상 호스트에 배치됩니다.
DB 경로가 포함된 기본 스토리지는 일반적인 LUN 블록 저장소입니다.
물리적 서버에 대한 스케줄링
물리적 서버의 경우 운영 체제에서 마감일 스케줄러를 사용해야 합니다. 마감일 스케줄러는 요청당 최대 지연 시간을 제한하고 디스크 집약적인 데이터베이스 애플리케이션에 가장 적합한 디스크 처리량을 유지합니다.
아키텍처
복제본 세트
복제본 세트 배포에 대한 아키텍처 고려 사항에 대한 개요는 복제본 세트 아키텍처 문서를 참조하세요.
샤딩된 클러스터
프로덕션 배포에 권장되는 샤딩된 클러스터 아키텍처에 대한 개요는 샤딩된 클러스터 프로덕션 아키텍처를 참조하세요.
압축
WiredTiger는 다음 압축 라이브러리 중 하나를 사용하여 컬렉션 데이터를 압축할 수 있습니다.
- 스내피
zlib
또는zstd
보다 낮은 압축률을 제공하지만 둘 중 어느 것보다도 CPU 비용이 낮습니다.
- zlib
snappy
보다 더 나은 압축률을 제공하지만snappy
및zstd
보다 CPU 비용이 더 높습니다.
- zstd
snappy
및zlib
보다 더 나은 압축률을 제공하고zlib
보다 더 낮은 CPU 비용을 제공합니다.
기본적으로 WiredTiger는 스내피 압축 라이브러리를 사용합니다. 압축 설정을 변경하려면 storage.wiredTiger.collectionConfig.blockCompressor
를 참조하세요.
WiredTiger는 기본적으로 모든 인덱스에 접두사 압축을 사용합니다.
시계 동기화
MongoDB 구성 요소는 시간에 따라 달라지는 작업을 지원하기 위해 로지컬 시계를 유지합니다. NTP를 사용하여 호스트 시스템 클럭을 동기화하면 구성 요소 간의 클럭 드리프트 위험이 완화됩니다. 구성요소 간의 클럭 드리프트는 다음과 같은 시간 종속 작업의 부정확하거나 비정상적인 동작 가능성을 높입니다.
특정 MongoDB 구성 요소의 기본 시스템 시계가 동일한 배포의 다른 구성 요소와 1년 이상 차이가 나면, 해당 구성 요소 간의 통신이 불안정해지거나 완전히 중단될 수 있습니다.
maxAcceptableLogicalClockDriftSecs
매개변수는 구성 요소 간에 허용되는 클럭 드리프트의 양을 제어합니다.maxAcceptableLogicalClockDriftSecs
의 값이 더 낮은 클러스터는 클럭 드리프트에 대한 허용치가 더 낮습니다.시스템 클럭이 다른 두 클러스터 노드는 현재 클러스터 또는 시스템 시간을 반환하는 연산에 대해
Date()
,NOW
,CLUSTER_TIME
처럼 다른 값을 반환할 수 있습니다.MongoDB 구성 요소 간의 클럭 드리프트가 있는 클러스터에서는 시간 유지에 의존하는 기능이 일관되지 않거나 예측할 수 없는 동작을 가질 수 있습니다.
플랫폼별 고려 사항
Linux의 MongoDB
커널 및 파일 시스템
Linux 프로덕션 환경에서 MongoDB를 실행하는 경우, Linux 커널 버전 2.6.36 이상을 사용해야 하며, 파일시스템은 XFS 또는 EXT4여야 합니다. 가능하면 일반적으로 MongoDB에서 더 나은 성능을 발휘하는XFS를 사용하세요.
WiredTiger 스토리지 엔진과 함께 EXT4를 사용할 때 발생할 수 있는 성능 문제를 방지하려면 데이터 보유 노드에 XFS를 사용할 것을 적극 권장합니다.
일반적으로 XFS 파일 시스템을 사용하는 경우 Linux 커널 버전
2.6.25
이상을 사용해야 합니다.EXT4 파일 시스템을 사용하는 경우 Linux 커널 버전
2.6.28
이상을 사용해야 합니다.Red Hat Enterprise Linux 및 CentOS에서는 Linux 커널의
2.6.18-194
버전 이상을 사용하세요.
시스템 C 라이브러리
MongoDB는 Linux에서 GNU C 라이브러리(glibc)를 사용합니다. 일반적으로 각 Linux 배포판은 이 라이브러리의 자체 검증 버전을 제공합니다. 최상의 결과를 얻으려면 이 시스템 제공 버전에서 사용할 수 있는 최신 업데이트를 사용하세요. 시스템의 패키지 관리자를 사용하여 최신 버전이 설치되어 있는지 확인할 수 있습니다. 예시:
RHEL/CentOS에서 다음 명령은 시스템에서 제공하는 GNU C 라이브러리를 업데이트합니다:
sudo yum update glibc Ubuntu/Debian에서 다음 명령은 시스템에서 제공하는 GNU C 라이브러리를 업데이트합니다.
sudo apt-get install libc6
fsync()
디렉토리에서
중요
MongoDB는 디렉토리에서 fsync()
를 지원하는 파일 시스템이 필요합니다. 예를 들어, HGFS 및 Virtual Box의 공유 폴더는 이 작업을 지원하지 않습니다.
vm.swappiness
를 1
또는 0
으로 설정
'Swappiness'는 가상 메모리 관리자의 동작에 영향을 미치는 Linux 커널 설정입니다. vm.swappiness
설정 범위는 0
에서 100
까지입니다. 값이 클수록 RAM에서 페이지를 삭하는 것보다 메모리 페이지를 디스크로 스왑하는 것을 더 선호하게 됩니다.
0
으로 설정하면 스와핑이 완전히 비활성화됩니다 [8 ].1
설정은 메모리 부족 문제를 방지하기 위한 목적으로만 커널 교체를 허용합니다.60
설정은 커널이 디스크로 자주 교체하도록 지시하며, 이는 많은 Linux 배포판의 기본값입니다.100
으로 설정하면 커널이 디스크에 적극적으로 스왑하도록 지시합니다.
MongoDB는 스와핑을 피하거나 최소한으로 유지할 수 있는 경우 가장 우수한 성능을 발휘합니다. 따라서 애플리케이션 요구 사항 및 클러스터 구성에 따라 vm.swappiness
를 1
또는 0
으로 설정해야 합니다.
참고
대부분의 시스템 및 사용자 프로세스는 cgroup 내에서 실행되며, 기본적으로 vm.swappiness
을 60
로 설정합니다. RHEL /CentOS를 실행 중인 경우 지정된 vm.swappiness
값이 모든 cgroup 기본값을 재정의하도록 vm.force_cgroup_v2_swappiness
을 1
로 설정합니다.
[8] | 3.5 이전의 Linux 커널 버전 또는 2.6.32-303 이전의 RHEL/CentOS 커널 버전의 경우 0 을 vm.swappiness 로 설정하면 특정 긴급 상황에서 커널을 교체할 수 있습니다. |
참고
MongoDB 인스턴스가 웹 서버와 같은 다른 소프트웨어도 실행하는 시스템에서 호스팅되는 경우 인스턴스를 vm.swappiness
1
로 설정해야 합니다. 가능하다면 MongoDB를 자체 전용 시스템에서 실행하는 것이 좋습니다.
시스템의 현재 swappiness 설정을 확인하려면 다음을 실행하세요.
cat /proc/sys/vm/swappiness 시스템에서 스왑을 변경하려면 다음을 수행합니다.
/etc/sysctl.conf
파일을 편집하고 다음 줄을 추가합니다:vm.swappiness = 1 다음 명령을 실행하여 설정을 적용합니다.
sudo sysctl -p
참고
RHEL/CentOS를 실행 중이고 tuned
성능 프로필을 사용하는 경우 vm.swappiness
을 1
또는 0
으로 설정하도록 선택한 프로필도 편집해야 합니다.
권장 구성
모든 MongoDB deployments의 경우:
네트워크 시간 프로토콜(NTP)을 사용하여 호스트 간에 시간을 동기화할 수 있습니다. 이는 샤딩된 클러스터에서 특히 중요합니다.
WiredTiger 스토리지 엔진의 경우 다음 권장 사항을 고려하세요.
데이터베이스 파일이 들어 있는 스토리지 볼륨의
atime
를 끕니다.ulimit 참고의 권장 사항에 따라 플랫폼의
ulimit
설정을 조정합니다.ulimit
값이 낮으면 사용량이 많을 때 MongoDB에 부정적인 영향을 미치고 MongoDB 프로세스에 대한 연결 실패 및 서비스 손실로 이어질 수 있습니다.참고
열려 있는 파일 수의
ulimit
값이64000
미만인 경우 MongoDB가 시작 경고를 생성합니다.MongoDB 8.0 실행 중이라면 Transparent Hugepages를 활성화하세요.
MongoDB 7.0 또는 이전 버전을 실행 중이라면 Transparent Hugepages를 비활성화하세요. 이전 버전에서 MongoDB는 일반(4096 바이트) 가상 메모리 페이지에서 더 나은 성능을 발휘했습니다.
BIOS에서 NUMA를 비활성화합니다. 불가능한 경우 NUMA 하드웨어의 MongoDB를 참조하세요.
기본 MongoDB 디렉토리 경로 또는 포트 사용하지 않는 경우 MongoDB용 SELinux를 구성합니다.
참고
SELinux를 사용하는 경우 서버 측 JavaScript를 필요로 하는 모든 MongoDB 작업은 세그폴트 오류를 발생시킵니다. JavaScript의 서버 측 실행 비활성화에서는 서버 측 JavaScript의 실행을 비활성화하는 방법을 설명합니다.
WiredTiger 스토리지 엔진의 경우:
저장 미디어의 종류(스피닝 디스크, SSD 등)에 관계없이 8에서 32 사이의 readahead를 설정합니다.
일반적으로 읽기 헤드가 높을 수록 순차적 I/O 작업에 유리합니다. MongoDB 디스크 액세스 패턴은 일반적으로 무작위이기 때문에 더 높은 읽기 헤드 설정을 사용하면 이점이 제한적이거나 성능이 저하될 수 있습니다. 따라서 테스트 결과 더 높은 읽기 헤드 값에서 측정 가능하고 반복 가능하며 신뢰할 수 있는 이점을 얻을 수 있는 경우가 아니라면, 최적의 MongoDB 성능을 위해 읽기 헤드를 8~32 사이로 설정하세요. MongoDB 상업 부문 지원팀이 대체 읽기 헤드 구성에 대한 조언과 지침을 제공해 드릴 수 있습니다.
MongoDB 및 TLS/SSL 라이브러리
Linux 플랫폼에서는 MongoDB 로그에서 다음 명령문 중 하나를 볼 수 있습니다.
<path to TLS/SSL libs>/libssl.so.<version>: no version information available (required by /usr/bin/mongod) <path to TLS/SSL libs>/libcrypto.so.<version>: no version information available (required by /usr/bin/mongod)
이러한 경고는 시스템의 TLS/SSL 라이브러리가 mongod
가 컴파일된 TLS/SSL 라이브러리와 다르다는 것을 나타냅니다. 일반적으로 이러한 메시지에는 개입이 필요하지 않지만 다음 작업을 사용하여 mongod
가 예상하는 기호 버전을 확인할 수 있습니다:
objdump -T <path to mongod>/mongod | grep " SSL_" objdump -T <path to mongod>/mongod | grep " CRYPTO_"
이러한 작업은 다음 줄 중 하나와 유사한 출력을 반환합니다.
0000000000000000 DF *UND* 0000000000000000 libssl.so.10 SSL_write 0000000000000000 DF *UND* 0000000000000000 OPENSSL_1.0.0 SSL_write
이 출력의 마지막 두 문자열은 기호 버전과 기호 이름입니다. 이 값을 다음 작업에서 반환된 값과 비교하여 기호 버전 불일치를 검색합니다.
objdump -T <path to TLS/SSL libs>/libssl.so.1* objdump -T <path to TLS/SSL libs>/libcrypto.so.1*
이 절차는 정확하지도 완전하지도 않습니다. libcrypto
라이브러리에서 mongod
가 사용하는 기호 중 상당수는 CRYPTO_
로 시작하지 않습니다.
Windows의 MongoDB
WiredTiger 스토리지 엔진을 사용하는 MongoDB 인스턴스의 경우, Windows의 성능은 Linux의 성능과 비슷합니다.
가상 환경에서의 MongoDB
이 섹션에서는 보다 일반적인 가상 환경에서 MongoDB를 실행할 때 고려해야 할 사항에 대해 설명합니다.
모든 플랫폼에서 예약을 고려하세요.
AWS EC2
고려해야 할 두 가지 성능 구성이 있습니다.
성능 테스트 또는 벤치마킹을 위한 재현 가능한 성능, 그리고
원시 최대 성능
두 구성 모두에 대해 EC2에서 성능을 조정하려면 다음과 같이 해야 합니다:
인스턴스에 대해 AWS 향상된 네트워킹을 활성화합니다. 모든 인스턴스 유형이 향상된 네트워킹을 지원하는 것은 아닙니다.
향상된 네트워킹에 대해 자세히 알아보려면 AWS 설명서를 참조하세요.
tcp_keepalive_time
를 120으로 설정합니다.
EC2에서 재현 가능한 성능에 더 관심이 있는 경우라면 이 또한 고려해야 합니다:
저널과 데이터를 위한 별도의 장치로 스토리지에 프로비저닝된 IOPS를 사용하세요. 대부분의 인스턴스 유형에서 사용할 수 있는 임시(SSD) 스토리지는 성능이 시시각각 변하므로 사용하지 마십시오. (
i
시리즈는 주목할 만한 예외이지만 매우 비쌉니다.)DVFS 및 CPU 절전 모드를 비활성화합니다.
하이퍼스레딩을 비활성화합니다.
메모리 지역성을 단일 소켓에 바인딩하려면
numactl
를 사용합니다.
Azure
프리미엄 스토리지를 사용합니다. Microsoft Azure는 표준 스토리지와 프리미엄 스토리지라는 두 가지 일반적인 유형의 스토리지를 제공합니다. Azure의 MongoDB는 표준 스토리지보다 프리미엄 스토리지를 사용할 때 더 나은 성능을 제공합니다.
Azure 로드 밸런서의 TCP 유휴 시간 제한은 기본적으로 240초입니다. 이로 인해 Azure 시스템의 TCP 연결 유지가 이 값보다 큰 경우 자동으로 연결이 제거될 수 있습니다. 이 문제를 개선하려면 tcp_keepalive_time
을 120으로 설정해야 합니다.
Linux에서 킵얼라이브 설정을 확인하려면 다음 명령 중 하나를 사용합니다:
sysctl net.ipv4.tcp_keepalive_time 또는:
cat /proc/sys/net/ipv4/tcp_keepalive_time 값은 초 단위로 측정됩니다.
참고
설정 이름에
ipv4
가 포함되어 있지만,tcp_keepalive_time
값은 IPv4와 IPv6 모두에 적용됩니다.tcp_keepalive_time
값을 변경하려면 다음 명령 중 하나를 사용하여 <value>를 초 단위로 입력하면 됩니다sudo sysctl -w net.ipv4.tcp_keepalive_time=<value> 또는:
echo <value> | sudo tee /proc/sys/net/ipv4/tcp_keepalive_time 이러한 연산은 시스템 재부팅 시 지속되지 않습니다. 설정을 유지하려면 다음 줄을
/etc/sysctl.conf
에 추가하고 <value>를 초 단위로 입력한 후 머신을 재부팅하세요.net.ipv4.tcp_keepalive_time = <value> 300
초(5분)보다 큰 킵얼라이브 값은mongod
및mongos
소켓에서 재정의되고300
초로 설정됩니다.
Windows에서 킵얼라이브 설정을 확인하려면 다음 명령을 실행합니다:
reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime 레지스트리 값은 기본적으로 존재하지 않습니다. 값이 없는 경우 사용되는 시스템 기본값은
7200000
밀리초 또는 16진수로0x6ddd00
입니다.KeepAliveTime
값을 변경하려면 관리자 Command Prompt에서 다음 명령을 사용합니다. 여기서<value>
는 16진수로 표시됩니다 (예:120000
는0x1d4c0
입니다):reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value> Windows 사용자가 Windows 시스템에서 MongoDB 배포를 위한 킵얼라이브 설정에 대한 자세한 알아보려면 KeepAliveTime에 대한 Windows Server 테크넷 문서를 참조하세요. 600000 밀리초(10 분)보다 크거나 같은 킵얼라이브 값은
mongod
및mongos
에서 무시됩니다.
VMware
MongoDB는 VMware와 호환됩니다.
VMware는 물리적 머신의 사용 가능한 메모리보다 더 많은 메모리를 가상 머신에 할당할 수 있는 메모리 오버커밋을 지원합니다. 메모리가 오버커밋되면 하이퍼바이저는 가상 머신 간에 메모리를 재할당합니다. VMware의 벌룬 드라이버(vmmemctl
)가 가장 가치가 낮은 것으로 간주되는 페이지를 회수합니다.
벌룬 드라이버는 게스트 운영 체제 내에 상주합니다. 특정 구성에서 벌룬 드라이버가 확장되면 MongoDB의 메모리 관리를 방해하고 MongoDB의 성능에 영향을 미칠 수 있습니다.
벌룬 드라이버 및 메모리 오버 커밋 기능으로 인해 성능이 저하되는 것을 방지하려면 MongoDB를 실행하는 가상 머신에 전체 메모리 양을 비축해 두세요. 가상 머신에 적절한 양의 메모리를 비축해 두면 하이퍼바이저의 메모리가 부족할 때 로컬 운영 체제에서 벌룬이 팽창하는 것을 방지할 수 있습니다.
벌룬 드라이버 및 메모리 오버커밋 기능은 특정 구성에서 MongoDB 성능에 부정적인 영향을 미칠 수 있지만 이러한 기능을 비활성화하도록 설정하지 않습니다. 이러한 기능을 비활성화하면 하이퍼바이저가 메모리 요청을 처리하기 위해 스왑 공간을 사용할 수 있으므로 성능에 부정적인 영향을 미칩니다.
VMware의 선호도 규칙을 설정하여 가상 머신이 특정 ESX/ESXi 호스트에 유지되는지 확인합니다. 가상 머신을 다른 호스트로 수동으로 마이그레이션해야 하고 가상 머신의 mongod
인스턴스가 프라이머리인 경우, 먼저 프라이머리를 step down
하고, shut down the instance
해야 합니다.
vMotion 및 VMKernel에 대한 네트워킹 권장사항을 따릅니다. 권장사항을 따르지 않으면 성능 문제가 발생하고 복제본 세트 및 샤딩된 클러스터 고가용성 메커니즘에 영향을 미칠 수 있습니다.
MongoDB를 실행하는 가상 머신을 복제할 수 있습니다. 이 함수를 사용하여 새 가상 호스트를 배포하여 복제본 세트의 노드로 추가할 수 있습니다.
KVM
MongoDB는 KVM과 호환됩니다.
KVM은 메모리 오버커밋을 지원하여 가상 머신에 물리적 머신이 사용할 수 있는 메모리보다 더 많은 메모리를 할당할 수 있습니다. 메모리가 오버커밋되면 하이퍼바이저는 가상 머신 간에 메모리를 재할당합니다. KVM의 벌룬 드라이버는 가장 가치가 낮은 것으로 간주되는 페이지를 회수합니다.
벌룬 드라이버는 게스트 운영 체제 내에 상주합니다. 특정 구성에서 벌룬 드라이버가 확장되면 MongoDB의 메모리 관리를 방해하고 MongoDB의 성능에 영향을 미칠 수 있습니다.
벌룬 드라이버 및 메모리 오버 커밋 기능으로 인해 성능이 저하되는 것을 방지하려면 MongoDB를 실행하는 가상 머신에 전체 메모리 양을 비축해 두세요. 가상 머신에 적절한 양의 메모리를 비축해 두면 하이퍼바이저의 메모리가 부족할 때 로컬 운영 체제에서 벌룬이 팽창하는 것을 방지할 수 있습니다.
벌룬 드라이버 및 메모리 오버커밋 기능은 특정 구성에서 MongoDB 성능에 부정적인 영향을 미칠 수 있지만 이러한 기능을 비활성화하도록 설정하지 않습니다. 이러한 기능을 비활성화하면 하이퍼바이저가 메모리 요청을 처리하기 위해 스왑 공간을 사용할 수 있으므로 성능에 부정적인 영향을 미칩니다.
성능 모니터링
iostat
Linux에서는 iostat
명령을 사용하여 디스크 I/O가 데이터베이스에 병목 현상을 일으키는지 확인하세요. 서버 부팅 이후의 시간을 다루는 통계가 표시되지 않도록 하려면 iostat을 실행할 때 시간(초)을 지정하세요.
예를 들어, 다음 명령은 확장 통계와 표시된 각 보고서의 시간을 1초 간격으로 트래픽(MB/s)과 함께 표시합니다.
iostat -xmt 1
iostat
의 키 필드입니다.
%util
: 빠른 확인에 가장 유용한 필드로, 장치/드라이브가 사용 중인 시간의 백분율을 나타냅니다.avgrq-sz
: 평균 요청 크기. 이 값의 숫자가 작을수록 더 많은 임의 IO 작업이 반영됩니다.
bwm-ng
bwm-ng 네트워크 사용을 모니터링하기 위한 명령줄 도구입니다. 네트워크 기반 병목 현상이 의심되는 경우 bwm-ng
를 사용하여 진단 프로세스를 시작할 수 있습니다.
백업
MongoDB database를 백업하려면 MongoDB 백업 방법 개요를 참조하세요.