다음 체크 리스트는 자체 관리 배포서버를 위한 작업 체크리스트 와 함께 프로덕션 MongoDB deployment 에서 발생하는 문제를 방지하는 데 도움이 되는 권장 사항을 제공합니다.
데이터 내구성
스키마 설계
MongoDB 의 데이터에는 동적 스키마 가 있습니다. 컬렉션 은 문서 구조를 시행하지 않습니다. 이는 반복적인 개발과 다형성을 용이하게 합니다. 그럼에도 불구하고 컬렉션에는 매우 동질적인 구조의 문서가 포함되는 경우가 많습니다. 자세한 내용은 MongoDB의 데이터 모델링을 참조하세요.
필요한 컬렉션 집합과 쿼리를 지원하는 데 필요한 인덱스를 결정합니다.
_id인덱스를 제외한 모든 인덱스는 명시적으로 생성해야 합니다. MongoDB는_id이외의 인덱스를 자동으로 생성하지 않습니다.스키마 설계가 제한 없이 길이가 증가하는 인덱스 배열에 의존하지 않도록 합니다. 일반적으로 이러한 인덱싱된 배열의 요소가 1000개 미만일 때 최상의 성능을 얻을 수 있습니다.
스키마를 설계할 때 문서 크기 제한을 고려합니다. BSON 문서 크기 제한은 문서당 16 MB입니다. 더 큰 문서가 필요한 경우 GridFS를 사용합니다.
복제
투표가 성공적으로 진행될 수 있도록 투표 멤버 수를 홀수로 설정합니다. 투표 멤버는 최대 7개를 보유할 수 있습니다. 투표 멤버의 수가 짝수이고 비용과 같은 제약 조건으로 인해 다른 세컨더리를 투표 멤버로 추가하는 것이 금지된 경우 중재자를 추가하여 홀수 투표 수를 보장할 수 있습니다. 멤버가 3개인 복제본 세트(P-S-A)에 중재자를 사용할 때 고려해야 할 추가 사항은 복제본 세트 중재자를 참조하십시오.
모니터링 도구를 사용하고 적절한 쓰기 고려 (write concern)를 지정하여 세컨더리를 최신 상태로 유지하세요.
전체 읽기 처리량을 확장하기 위해 세컨더리 읽기를 사용하지 마세요. 참조: 읽기 확장의 개요에 대해 더 많은 복제본 노드를 사용할 수 있습니까(Can I use more replica nodes to scale)를 참조하세요. 세컨더리 읽기에 대한 자세한 내용은 읽기 설정을 참조하세요.
샤딩
샤드 키가 샤드에 부하를 고르게 분산시키는지 확인하세요. 자세한 내용은 샤드 키를 참조하세요.
샤드 수에 따라 크기를 조정해야 하는 워크로드에 대상 지정 작업을 사용합니다.
세컨더리는 읽기 고려 (read concern)(인과적으로 일관적인 세션과 연결되지 않은 경우 세컨더리에 대한 읽기에 대한 기본값 읽기 고려 (read
"available"concern) )를 사용하지 않는 한 더 이상 고아 데이터를 반환하지 않습니다.샤드 복제본 세트 의 모든 멤버는 청크 메타데이터 유지 관리하므로 를 사용하지 않을 때 고아를 필터하다 할 수
"available"있습니다. 따라서 를 사용하지 않는대상이 지정되지"available"않은 쿼리 또는 브로드캐스트 쿼리는 모든 멤버에서 안전하게 실행 수 있으며 고아 데이터를 반환하지 않습니다."available"읽기 고려는 업데이트된 청크 메타데이터를 확인하지 않으므로 세컨더리 멤버에서 고아 문서를 반환할 수 있습니다. 그러나 고아 문서의 반환이 애플리케이션에 중요하지 않은 경우"available"읽기 고려는 다양한 읽기 고려 중에서 최대한 짧은 지연 시간을 제공합니다.해시되지 않은 새로운 샤딩된 컬렉션에 대규모 데이터 세트를 삽입할 때 청크를 사전 분할하고 수동으로 밸런싱합니다. 사전 분할 및 수동 밸런싱을 통해 삽입 부하를 샤드 간에 분산하여 초기 부하의 성능을 향상할 수 있습니다.
드라이버
연결 풀링을 활용합니다. 대부분의 MongoDB 드라이버는 연결 풀링을 지원합니다. 일반적인 동시 데이터베이스 요청 수의 110-115%부터 시작하여 사용 사례에 맞게 연결 풀 크기를 조정합니다.
애플리케이션이 복제본 세트 투표 중에 일시적인 쓰기 및 읽기 오류를 처리하는지 확인하세요.
애플리케이션이 실패한 요청을 처리하고 해당되는 경우 다시 시도하는지 확인합니다. 드라이버는 실패한 요청을 자동으로 다시 시도하지 않습니다.
데이터베이스 요청 재시도에 지수 백오프 로직을 사용합니다.
데이터베이스 작업의 실행 시간을 제한해야 하는 경우 읽기에는
cursor.maxTimeMS()을 사용하고 쓰기에는wtimeout을 사용하세요.