개요
이 가이드 에서는 쓰기 고려 (write concern), 읽기 고려 (read concern) 및 읽기 설정 (read preference) 옵션을 구성하여 C++ 드라이버 복제본 세트에서 읽기 및 쓰기 (write) 작업을 실행하는 방식을 수정하는 방법을 학습 수 있습니다.
읽기 및 쓰기 설정 우선 순위
다음 수준에서 쓰기 고려, 읽기 고려, 읽기 설정 옵션을 설정할 수 있습니다.
트랜잭션
Database
컬렉션
이 목록은 옵션 설정의 우선 순위가 높아지는 순서도 나타냅니다. 예시 를 들어, 데이터베이스 에 대해 읽기 고려 (read concern) 설정하다 하면 트랜잭션 에서 상속된 읽기 고려 (read concern) 설정이 재정의됩니다.
읽기 및 쓰기 작업 구성
읽기 설정( read preference)을 설정하여 드라이버가 읽기 작업을 라우팅하는 방법을 제어할 수 있습니다. 또한 읽기 고려 및 쓰기 고려를 설정하여 드라이버가 복제본 세트에 대한 읽기 및 쓰기 작업의 승인을 기다리는 방법에 대한 옵션을 제어할 수도 있습니다.
읽기 및 쓰기 (write) 설정과 해당 옵션에 대해 자세히 학습 MongoDB Server 매뉴얼에서 다음 가이드를 참조하세요.
기본값 읽기 및 쓰기 (write) 설정에 대한 자세한 내용은 MongoDB Server 매뉴얼의 기본 MongoDB 읽기 고려 (read concern)/쓰기 고려 (write concern) 를 참조하세요.
트랜잭션 구성
트랜잭션은 세션 내에서 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업의 그룹인 세션 내에서 실행 . start_session() 메서드를 사용하여 트랜잭션에 사용할 세션을 가져옵니다. 그런 다음 mongocxx::options::transaction 객체 세션의 with_transaction() 메서드에 전달합니다. 이 예시 트랜잭션 의 읽기 설정 (read preference), 읽기 고려 (read concern)) 및 쓰기 고려 (write concern) 설정하다 방법을 보여줍니다.
팁
세션에 대해 자세히 학습 MongoDB Server 매뉴얼의 서버 세션을 참조하세요.
이 예시 다음 설정을 구성합니다.
k_primary읽기 설정 (read preference) : 읽기 작업은 프라이머리 복제본 세트 멤버에서 데이터를 조회 .k_majority읽기 고려 (read concern): 읽기 작업은 대부분의 복제본 세트 멤버에 기록된 인스턴스의 가장 최근 데이터를 반환합니다.k_acknowledged쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버는 쓰기 (write) 작업을 확인해야 합니다.
auto session = client.start_session(); mongocxx::options::transaction txn_opts; { mongocxx::read_preference rp; mongocxx::read_concern rc; mongocxx::write_concern wc; rp.mode(mongocxx::read_preference::read_mode::k_primary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); txn_opts.read_preference(rp); txn_opts.read_concern(rc); txn_opts.write_concern(wc); } session.with_transaction([&](mongocxx::client_session*) { // Specify transaction operations here }, txn_opts);
데이터베이스 구성
이 예시 데이터베이스 에 대해 다음 읽기 설정을 구성하는 방법을 보여 줍니다.
k_secondary읽기 설정 (read preference) : 읽기 작업은 세컨더리 복제본 세트 멤버에서만 데이터를 조회 .k_majority읽기 고려 (read concern): 읽기 작업은 대부분의 복제본 세트 멤버에 기록된 인스턴스의 가장 최근 데이터를 반환합니다.
auto db = client["test_database"]; mongocxx::read_preference rp; mongocxx::read_concern rc; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); db.read_preference(rp); db.read_concern(rc);
collection 구성
이 예시 컬렉션 에 대해 다음과 같은 읽기 및 쓰기 고려 (write concern) 설정을 지정하는 방법을 보여 줍니다.
k_local읽기 고려 (read concern): 읽기 작업은 인스턴스의 가장 최근 데이터를 반환하며, 데이터가 대부분의 복제본 세트 멤버에 기록되었다는 보장은 없습니다.k_acknowledged쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버는 쓰기 (write) 작업을 확인해야 합니다.
auto coll = client["test_database"]["test_collection"]; mongocxx::read_concern rc; mongocxx::write_concern wc; rc.acknowledge_level(mongocxx::read_concern::level::k_local); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); coll.read_concern(rc); coll.write_concern(wc);
태그 세트
MongoDB Server 에서는 선택한 기준에 따라 복제본 세트 멤버에 키-값 태그를 적용 할 수 있습니다. 그런 다음 해당 태그를 사용하여 읽기 작업의 멤버를 한 명 이상 대상으로 지정할 수 있습니다.
기본값 으로 C++ 운전자 읽을 멤버를 선택할 때 태그를 무시합니다. C++ 운전자 특정 태그를 선호하도록 하려면 mongocxx::read_preference 객체 만들고 해당 tags() 멤버 함수를 호출합니다. 원하는 태그를 배열 인수로 tags()에 전달합니다.
다음 코드 예시 에서 tags() 함수에 전달된 태그 세트 C++ 운전자 뉴욕 데이터 센터 ("dc": "ny")에서 읽기를 선호하고 샌프란시스코 데이터 센터 ("dc": "sf")로 대체하도록 지시합니다.
auto tag_set_ny = make_document(kvp("dc", "ny")); auto tag_set_sf = make_document(kvp("dc", "sf")); mongocxx::read_preference rp; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rp.tags(make_array(tag_set_ny, tag_set_sf).view());
재시도 가능 읽기 및 쓰기
C++ 운전자 네트워크 또는 서버 오류로 인해 특정 읽기 및 쓰기 (write) 작업이 실패한 경우 자동으로 한 번 다시 시도합니다.
연결 URI에서 retryReads 또는 retryWrites 옵션을 false 로 설정하여 재시도 가능 읽기 또는 재시도 가능 쓰기를 명시적으로 비활성화할 수 있습니다. 다음 예시 클라이언트 에 대해 재시도 가능 읽기 및 쓰기를 비활성화합니다.
mongocxx::uri uri{"mongodb://localhost:27017/?retryReads=false&retryWrites=false"}; mongocxx::client client{uri};
지원되는 재시도 가능 읽기 및 쓰기 (write) 작업에 대해 자세히 학습 MongoDB Server 매뉴얼에서 다음 가이드를 참조하세요.
부하 분산
샤딩된 클러스터 또는 복제본 세트에 연결할 때 C++ 운전자는 로드 밸런싱 을 사용하여 읽기 및 쓰기 (write) 요청을 처리하다. 로드 밸런싱을 통해 운전자 이러한 요청을 여러 서버에 분산할 수 있으므로 하나의 서버 과부하가 걸리는 것을 방지하고 최적의 성능을 보장합니다.
When connecting to a sharded cluster, the C++ driver determines the closest mongos instance by calculating which one has the lowest network round-trip time. Then, the driver determines the latency window by adding this mongos's average round-trip time to the localThresholdMS value. The driver load balances requests across up to two random mongos instances that fall within the latency window. For each request, the driver chooses the server with the lower operation load by determining its operationCount value.
복제본 세트 에 연결할 때 C++ 드라이버 먼저 읽기 설정 (read preference) 에 따라 복제본 세트 멤버를 선택합니다. 그런 다음 운전자 이전 단락에서 설명한 것과 동일한 프로세스 따릅니다. 지연 시간 창 계산한 후 드라이버 이 창 에 속하는 무작위 복제본 세트 멤버를 최대 두 개 선택하고 operationCount 값이 더 작은 노드를 선택하여 요청 받습니다.
팁
로드 밸런싱에 대해 자세히 학습하려면 MongoDB Server 매뉴얼에서 샤드 클러스터 밸런서 를 참조하세요.
LocalThreshold
C++ 운전자 로컬 임계값을 사용하여 서버 선택에 대한 지연 시간 창 계산합니다. 이 값은 읽기 및 쓰기 (write) 요청을 수신할 수 있는 서버를 결정합니다.
기본값 으로 운전자 핑 시간이 가장 가까운 서버 에서 15 밀리초 이내인 mongos 인스턴스 또는 복제본 세트 멤버만 사용합니다. 지연 시간이 더 긴 서버에 읽기를 분산하려면 연결 URI에서 localThreshold 매개 변수를 설정하다 .
참고
단일 mongos 인스턴스 에서 복제본 세트 멤버를 선택할 때 C++ 드라이버 localThresholdMS 옵션을 무시합니다. 이 경우 localThreshold 명령줄 옵션을 사용합니다.
다음 예시 에서는 복제본 세트 에 연결하고 로컬 임계값을 35 밀리초로 지정합니다.
mongocxx::uri uri{"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"}; mongocxx::client client{uri};
앞의 예시 에서 C++ 드라이버 가장 가까운 노드의 핑 시간 35 밀리초 이내에 일치하는 노드에게 읽기를 분산합니다.
데이터 정렬
컬렉션에서 읽기 및 쓰기 (write) 작업을 수행할 때 데이터 정렬 을 지정할 수 있습니다.
데이터 정렬은 대소문자 및 악센트 표시와 같이 문자열 비교를 위한 언어별 규칙 설정하다 입니다.
데이터 정렬을 지정하려면 데이터 정렬 정의를 옵션 객체 의 collation() 메서드에 전달한 다음 이 옵션 객체 읽기 또는 쓰기 (write) 작업에 전달합니다.
데이터 정렬 예시
다음 문서가 포함된 컬렉션 생각해 보세요.
{ _id: 1, category: "café" }, { _id: 2, category: "cafe" }, { _id: 3, category: "cafE" }
다음 예시 프랑스어 국가 및 언어 설정 설정을 지정하고 대소문자와 문자 변형 간의 차이를 무시하는 데이터 정렬을 만듭니다. 그런 다음 이 데이터 정렬을 사용하여 category 필드 값이 "cafe"와 일치하는 문서를 찾습니다. 지정된 데이터 정렬로 인해 쿼리 세 개의 문서를 모두 반환합니다.
mongocxx::options::find opts{}; opts.collation(bsoncxx::from_json(R"({"locale": "fr", "strength": 1})")); auto cursor = collection.find(make_document(kvp("category", "cafe")), opts); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
API 문서
이 가이드 에 설명된 클래스 또는 메서드에 학습 보려면 다음 API 설명서를 참조하세요.