문서 메뉴
문서 홈
/
MongoDB Atlas
/

MongoDB Atlas로 복원력이 뛰어난 애플리케이션 구축하기

이 페이지의 내용

  • 최신 드라이버 설치
  • 연결 문자열
  • 재시도 가능 쓰기 및 읽기
  • 쓰기 및 읽기 고려
  • 오류 처리
  • 페일오버 테스트
  • 회복 탄력성 애플리케이션 예시

MongoDB deployment 및 드라이버 라이브러리의 기능을 구성하여 네트워크 중단 및 페일오버 이벤트를 견딜 수 있는 회복 탄력성 있는 애플리케이션을 만들 수 있습니다. MongoDB Atlas의 상시 기능을 최대한 활용하는 애플리케이션 코드를 작성하려면 다음 작업을 수행해야 합니다.

  • 최신 드라이버를 설치합니다.

  • Atlas에서 제공하는 연결 문자열을 사용합니다.

  • 재시도 가능 쓰기 및 재시도 가능 읽기를 사용합니다.

  • 애플리케이션에 적합한 majority 쓰기 고려와 읽기 고려를 사용합니다.

  • 애플리케이션의 오류를 처리합니다.

먼저 MongoDB 드라이버 에서 해당 언어에 맞는 최신 드라이버를 설치합니다. 드라이버는 애플리케이션에서 데이터베이스에 쿼리를 연결하고 릴레이합니다. 최신 드라이버를 사용하면 최신 MongoDB 기능을 사용할 수 있습니다.

그런 다음 애플리케이션에서 종속성을 가져옵니다.

참고

Atlas는 사전 구성된 연결 문자열을 제공합니다. 사전 구성된 문자열을 복사하는 단계는 Atlas에서 제공하는 연결 문자열을 참조하세요.

Atlas cluster의 모든 노드를 지정하는 연결 문자열 을 사용하여 애플리케이션을 데이터베이스에 연결합니다. 클러스터가 복제본 세트 투표 를 수행하고 새 프라이머리가 선택되면 클러스터의 모든 노드를 지정하는 연결 문자열이 애플리케이션 로직 없이 새 프라이머리를 검색합니다.

둘 중 하나를 사용하여 클러스터의 모든 노드를 지정할 수 있습니다.

연결 문자열은 옵션, 특히 retryWriteswriteConcern을 지정할 수도 있습니다.

Atlas는 비공개 엔드포인트 서비스의 로드 밸런서를 사용하여 샤드 클러스터에 대해 최적화된 SRV 연결 문자열을 생성할 수 있습니다. 최적화된 연결 문자열을 사용하는 경우 Atlas는 애플리케이션과 샤딩된 클러스터 간의 mongos당 연결 수를 제한합니다. mongos당 제한된 연결은 연결 수가 급증하는 동안 성능을 향상시킵니다.

참고

Atlas는 Google Cloud 또는 Azure에서 실행되는 클러스터에 대해 최적화된 연결 문자열을 지원하지 않습니다.

비공개 엔드포인트 샤드 클러스터의 최적화된 연결 문자열에 대해 자세히 알아보려면 비공개 엔드포인트 샤드 클러스터를 위한 연결 성능 향상을 참고하세요.

Atlas cluster 인터페이스에서 연결 문자열을 복사하는 경우, 연결 문자열은 클러스터에 대해 미리 구성되어 있고, DNS 시드 목록 형식을 사용하며, 회복 탄력성을 위해 권장되는 retryWritesw(쓰기 고려) 옵션이 포함되어 있습니다.

Atlas에서 연결 문자열 URI를 복사합니다.

  1. MongoDB Atlas의 프로젝트 아래, 탐색 패널에서 Database을 선택합니다.

  2. 애플리케이션을 연결하려는 클러스터에서 Connect을 클릭합니다.

  3. 연결 방법으로 Drivers를 선택합니다.

  4. Driver 또는 Version을 선택합니다.

  5. 연결 문자열 또는 전체 드라이버 예시를 애플리케이션 코드에 복사합니다. 데이터베이스 사용자 자격 증명을 제공해야 합니다.

    참고

    이 가이드에서는 연결 문자열을 통해 SCRAM 인증 을 사용합니다. X.509 인증서를 사용하여 인증하는 방법을 알아보려면 X.509 를 참조하세요.

연결 문자열을 사용하여 애플리케이션에서 MongoDB 클라이언트를 인스턴스화합니다.

참고

MongoDB 버전 4 부터 시작됩니다.0 및 4.2-호환 드라이버, MongoDB는 기본적으로 쓰기와 읽기를 모두 한 번 재시도합니다.

재시도 가능 쓰기 를 사용하면 특정 쓰기 작업이 실패할 경우 한 번만 다시 시도할 수 있습니다. Atlas에서 연결 문자열을 복사한 경우에는 "retryWrites=true" 이 포함됩니다. 자체 연결 문자열을 제공하는 경우 "retryWrites=true" 를 쿼리 매개변수로 포함합니다.

애플리케이션이 일시적으로 정상적인 기본 노드를 찾을 수 없는 일시적인 네트워크 오류와 복제본 세트 선택을 처리하기 위해서는 쓰기를 정확히 한 번만 재시도하는 것이 가장 좋습니다. 재시도가 성공하면 작업 전체가 성공하고 오류가 반환되지 않습니다. 작업이 실패하는 경우 다음과 같은 이유 때문일 수 있습니다.

  • 지속적인 네트워크 오류

  • 잘못된 명령

작업이 실패하면 애플리케이션에서 오류 자체를 처리해야 합니다.

읽기 작업이 실패하면 MongoDB 버전 4 부터 자동으로 한 번만 재시도됩니다.0 및 4.2호환 드라이버. 읽기 재시도를 위해 추가 구성이 필요하지 않습니다.

쓰기 고려와 읽기 고려를 사용하여 애플리케이션의 일관성과 가용성을 조정할 수 있습니다. 고려가 엄격할 수록 데이터베이스 작업이 더 강력한 데이터 일관성 보장을 기다리며, 일관성 요구 사항을 완화하면 더 높은 가용성을 제공합니다.

예제

애플리케이션에서 금전적 잔액을 처리하는 경우 일관성이 매우 중요합니다. 오래된 데이터나 롤백될 수 있는 데이터를 읽지 않도록 하기 위해 majority 쓰기 및 읽기 고려를 사용할 수 있습니다.

또는 애플리케이션이 수백 개의 센서에서 초당 온도 데이터를 기록하는 경우, 가장 최근의 판독값이 포함되지 않은 데이터를 읽더라도 걱정하지 않아도 됩니다. 일관성 요구 사항을 완화하고 해당 데이터에 더 빠르게 액세스할 수 있습니다.

연결 문자열 URI를 통해 Atlas 복제본 세트의 쓰기 고려 수준 을 설정할 수 있습니다. majority 쓰기 고려를 사용하여 데이터가 데이터베이스에 성공적으로 기록되고 지속되는지 확인합니다. 이는 권장되는 기본값이며 대부분의 사용 사례에 충분합니다. Atlas에서 연결 문자열을 복사한 경우에는 "w=majority" 가 포함됩니다.

majority와 같이 승인이 필요한 쓰기 고려를 사용하는 경우, 해당 승인 수준에 도달하기 위한 최대 쓰기 시간 제한을 지정할 수도 있습니다.

  • 모든 쓰기에 대한 wtimeoutMS 연결 문자열 매개변수 또는

  • 단일 쓰기 작업을 위한 wtimeout 옵션입니다.

시간 제한의 사용 여부와 사용하는 값은 애플리케이션 컨텍스트에 따라 다릅니다.

중요

쓰기에 대한 시간 제한을 지정하지 않고 쓰기 고려 수준을 달성할 수 없는 경우 쓰기 작업이 무기한 중단됩니다.

연결 문자열 URI를 통해 Atlas 복제본 세트의 읽기 고려 수준 을 설정할 수 있습니다. 이상적인 읽기 고려 는 애플리케이션 요구 사항에 따라 다르지만 대부분의 사용 사례에는 기본값으로 충분합니다. 기본 읽기 고려를 사용하는 데 연결 문자열 매개변수는 필요하지 않습니다.

읽기 고려를 지정하면 애플리케이션이 Atlas로부터 수신하는 데이터에 대한 보장을 개선할 수 있습니다.

참고

애플리케이션에서 사용하는 쓰기 및 읽기 고려의 특정 조합은 작업 순서 보장에 영향을 미칩니다. 이를 인과적 일관성이라고 합니다. 인과적 일관성 보장에 대한 자세한 내용은 인과 적 일관성 및 읽기 및 쓰기 고려를 참조하세요.

재시도 가능 쓰기 로 처리되지 않는 잘못된 명령, 네트워크 중단 및 네트워크 오류는 오류를 반환합니다. 오류에 대한 자세한 내용은 드라이버의 API 설명서를 참조하세요.

예를 들어 애플리케이션이 데이터베이스 컬렉션에 이미 사용된 _id 값이 포함된 문서를 삽입하려고 하면 드라이버는 다음을 포함하는 오류를 반환합니다.

적절한 오류 처리가 없으면 오류로 인해 애플리케이션이 다시 시작될 때까지 요청 처리가 차단될 수 있습니다.

애플리케이션은 충돌이나 부작용 없이 오류를 처리해야 합니다. 컬렉션에 중복된 _id를 삽입하는 애플리케이션의 이전 예에서, 해당 애플리케이션은 다음과 같이 오류를 처리할 수 있습니다.

이 예시의 삽입 작업은 _id 필드가 고유해야 하기 때문에 두 번째로 호출할 때 "중복 키" 오류가 발생합니다. 오류가 감지되면 클라이언트에게 알림이 전송되고 앱은 계속 실행됩니다. 그러나 삽입 작업은 실패하므로 사용자에게 메시지를 표시할지, 작업을 다시 시도할지 또는 다른 작업을 수행할지를 결정해야 합니다.

항상 오류를 기록해야 합니다. 추가 처리 오류에 대한 일반적인 전략은 다음과 같습니다.

  • 오류 메시지와 함께 오류를 클라이언트에 반환. 이는 오류를 해결할 수 없어 사용자에게 작업을 완료할 수 없음을 알려야 할 때 좋은 전략입니다.

  • 백업 데이터베이스에 쓰기. 이는 오류를 해결할 수 없지만 요청 데이터가 손실되는 위험을 감수하고 싶지 않을 때 좋은 전략입니다.

  • 1회 기본 재시 도 이후에 작업을 다시 시도합니다. 이는 오류의 원인을 프로그래밍 방식으로 해결한 다음 다시 시도할 수 있는 경우에 좋은 전략입니다.

애플리케이션 컨텍스트에서 가장 적합한 전략을 선택해야 합니다.

예제

중복 키 오류의 경우, 오류를 기록해야 하지만 작업이 실패할 수 있으므로 작업을 다시 시도해서는 안 됩니다. 대신 대체 데이터베이스에 쓰고 나중에 해당 데이터베이스의 내용을 검토하여 정보가 손실되지 않도록 할 수 있습니다. 사용자는 다른 작업을 수행할 필요가 없으며 데이터가 기록되므로 클라이언트에 오류 메시지를 전송하지 않도록 선택할 수 있습니다.

오류를 반환하는 것은 작업이 무기한 중단되어 애플리케이션이 새 작업을 실행하지 못하도록 차단할 때 바람직한 동작일 수 있습니다. maxTimeMS 메서드를 사용하여 개별 작업에 시간 제한을 설정하고, 해당 시간 제한을 초과할 경우 애플리케이션에서 처리할 오류를 반환할 수 있습니다.

각 작업에 설정하는 시간 제한은 해당 작업의 컨텍스트에 따라 다릅니다.

예제

애플리케이션에서 inventory 컬렉션의 간단한 제품 정보를 읽고 표시하는 경우, 이러한 읽기 작업은 오래 걸리지 않는다고 가정할 수 있습니다. 비정상적으로 오래 실행되는 쿼리는 지속적인 네트워크 문제가 있음을 나타내는 지표입니다. 이 작업에서 maxTimeMS를 5000, 즉 5초로 설정하면 네트워크 문제가 있다고 확신하는 즉시 애플리케이션이 피드백을 받습니다.

카오스 테스트 의 정신으로 Atlas는 주기적인 유지 관리 및 특정 구성 변경을 위해 복제본 세트 투표를 자동으로 수행합니다.

애플리케이션이 복제본 세트 투표에 대해 회복 탄력성이 있는지 확인하려면 페일오버이벤트를 시뮬레이션하여 페일오버 프로세스를 테스트하세요.

예시 애플리케이션은 네트워크 중단 및 페일오버 이벤트에 대한 회복 탄력성을 보장하기 위해 다음 사항을 권장합니다.

  • 재시도 가능한 쓰기, 대다수 쓰기 고려 및 기본 읽기 고려와 함께 Atlas에서 제공하는 연결 문자열을 사용합니다.

  • maxTimeMS 메서드를 사용하여 작업 시간 제한을 지정합니다. maxTimeMS 설정 방법에 대한 지침은 해당 드라이버 설명서를 참조하세요.

  • 키 중복 및 시간 초과에 대한 오류를 처리합니다.

이 애플리케이션은 클라이언트가 사용자 레코드를 생성하거나 나열할 수 있는 HTTP API 입니다. GET 및 POST 요청을 수락하는 엔드포인트 http://localhost: 를 노출합니다.3000

메서드
엔드포인트
설명
GET
/users
users 컬렉션에서 사용자 이름 목록을 가져옵니다.
POST
/users
요청 본문에 name이 필요합니다. users 컬렉션에 새 사용자를 추가합니다.
← Atlas 클러스터 크기 조정 및 계층 선택