복제본 세트에 대한 작업 구성
개요
이 가이드 에서는 쓰기 고려 (write concern), 읽기 고려 (read concern) 및 읽기 설정 (read preference) 옵션을 구성하여 Java 운전자 복제본 세트에서 읽기 및 쓰기 (write) 작업을 실행하는 방식을 수정하는 방법을 학습 수 있습니다.
읽기 및 쓰기 설정 우선 순위
다음 수준에서 쓰기 고려, 읽기 고려, 읽기 설정 옵션을 설정할 수 있습니다.
재정의되지 않는 한 모든 작업 실행에 대한 기본값을 설정하는 클라이언트
트랜잭션
Database
컬렉션
이 목록은 옵션 설정의 우선 순위가 높아지는 순서도 나타냅니다. 예시 들어, 트랜잭션 에 대해 읽기 고려 (read concern) 설정하다 클라이언트 에서 상속된 읽기 고려 (read concern) 설정이 재정의됩니다.
쓰기 고려, 읽기 고려 (read concern) 및 읽기 설정 (read preference) 옵션을 사용하면 복제본 세트에 있는 데이터의 인과적 일관성 과 가용성을 사용자 지정할 수 있습니다. 이러한 옵션의 전체 목록을 보려면 MongoDB Server 매뉴얼에서 다음 가이드를 참조하세요.
읽기 및 쓰기 작업 구성
읽기 설정 (read preference) 설정하여 운전자 복제본 세트 멤버 간에 읽기 작업을 라우팅하는 방법을 제어할 수 있습니다. 또한 읽기 및 쓰기 (write) 고려를 설정하여 운전자 복제본 세트 에서 읽기 및 쓰기 (write) 작업의 승인을 기다리는 방법을 제어할 수도 있습니다.
다음 섹션에서는 다양한 수준에서 이러한 읽기 및 쓰기 (write) 설정을 구성하는 방법을 보여줍니다.
클라이언트 구성
이 예시 MongoClientSettings
인스턴스 생성자에 전달하여 MongoClient
인스턴스 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 이 코드는 다음 설정을 구성합니다.
secondary
읽기 설정 (read preference) : 읽기 작업은 세컨더리 복제본 세트 멤버에서 데이터를 조회 .LOCAL
읽기 고려 (read concern): 읽기 작업은 데이터가 대부분의 복제본 세트 멤버에 기록되었음을 보장하지 않고 인스턴스의 가장 최근 데이터를 반환합니다.W2
쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버와 한 명의 세컨더리 멤버가 쓰기 (write) 작업을 확인해야 합니다.
MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://localhost:27017/")) .readPreference(ReadPreference.secondary()) .readConcern(ReadConcern.LOCAL) .writeConcern(WriteConcern.W2) .build());
또는 MongoClients
생성자에 매개 변수로 전달되는 연결 URI에 읽기 및 쓰기 (write) 설정을 지정할 수 있습니다.
MongoClient uriClient = MongoClients.create("mongodb://localhost:27017/?readPreference=secondary&w=2&readConcernLevel=local");
트랜잭션 구성
이 예시 인스턴스 메서드에 전달하여 트랜잭션 의 읽기 설정 (read preference), 읽기 고려 (read TransactionOptions
startTransaction()
concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 트랜잭션은 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업을 그룹화한 세션 내에서 실행 . 트랜잭션 옵션을 적용하기 전에 ClientSession
인스턴스 생성하여 세션을 시작합니다.
팁
세션에 대해 자세히 학습 MongoDB Server 매뉴얼의 서버 세션을 참조하세요.
이 예시 다음 설정을 구성합니다.
primary
읽기 설정 (read preference) : 읽기 작업은 프라이머리 복제본 세트 멤버에서 데이터를 조회 .MAJORITY
읽기 고려 (read concern): 읽기 작업은 대부분의 복제본 세트 멤버에 기록된 인스턴스의 가장 최근 데이터를 반환합니다.W1
쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버는 쓰기 (write) 작업을 확인해야 합니다.
TransactionOptions tOptions = TransactionOptions.builder() .readPreference(ReadPreference.primary()) .readConcern(ReadConcern.MAJORITY) .writeConcern(WriteConcern.W1) .build(); try (ClientSession clientSession = client.startSession()) { clientSession.startTransaction(tOptions); // Specify transaction operations here }
데이터베이스 구성
이 예시 setter 메서드를 getDatabase()
메서드에 연결하여 test_database
데이터베이스 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 이 코드는 다음 설정을 구성합니다.
primaryPreferred
읽기 설정 (read preference) : 읽기 작업은 프라이머리 복제본 세트 멤버에서 데이터를 조회 , 프라이머리 사용할 수 없는 경우 세컨더리 멤버에서 데이터를 검색합니다.AVAILABLE
읽기 고려 (read concern): 읽기 작업은 데이터가 대부분의 복제본 세트 멤버에 기록되었음을 보장하지 않고 인스턴스의 가장 최근 데이터를 반환합니다.MAJORITY
쓰기 고려 (write concern): 모든 복제본 세트 멤버의 대다수가 쓰기 (write) 작업을 승인해야 합니다.
MongoDatabase database = mongoClient.getDatabase("test_database") .withReadPreference(ReadPreference.primaryPreferred()) .withReadConcern(ReadConcern.AVAILABLE) .withWriteConcern(WriteConcern.MAJORITY);
collection 구성
이 예시 setter 메서드를 getCollection()
메서드에 연결하여 test_collection
컬렉션 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 이 코드는 다음 설정을 구성합니다.
secondaryPreferred
읽기 설정 (read preference) : 읽기 작업은 세컨더리 복제본 세트 멤버 또는 사용 가능한 세컨더리 멤버가 없는 경우 프라이머리 멤버에서 데이터를 조회 .AVAILABLE
읽기 고려 (read concern): 읽기 작업은 데이터가 대부분의 복제본 세트 멤버에 기록되었음을 보장하지 않고 인스턴스의 가장 최근 데이터를 반환합니다.UNACKNOWLEDGED
쓰기 고려 (write concern): 복제본 설정하다 멤버는 쓰기 (write) 작업을 승인할 필요가 없습니다.
MongoCollection<Document> collection = database.getCollection("test_collection") .withReadPreference(ReadPreference.secondaryPreferred()) .withReadConcern(ReadConcern.AVAILABLE) .withWriteConcern(WriteConcern.UNACKNOWLEDGED);
고급 읽기 구성
다음 섹션에서는 Java 운전자 읽기 작업을 라우팅하는 방법을 추가로 사용자 지정하는 방법을 설명합니다.
샤딩된 클러스터
샤딩된 클러스터 에 연결할 때 읽기 설정 (read preference) 지정할 수 있습니다. MongoDB 샤딩 사용하여 데이터 세트를 키 범위별로 나누고 여러 데이터베이스 인스턴스에 데이터를 분산합니다. 샤딩된 클러스터 또는 샤딩된 배포서버 서버의 노드 설정하다 에는 다음과 같은 구성 요소가 포함됩니다.
샤드: 샤딩된 데이터의 하위 집합을 포함하는 복제본 세트 입니다.
Mongos: 애플리케이션 과 샤딩된 클러스터 간의 인터페이스를 제공하는 쿼리 라우터입니다.
config 서버: 클러스터의 구성 설정과 메타데이터 저장 서버입니다.
팁
샤딩된 클러스터에 대해 자세히 학습 MongoDB Server 매뉴얼의 샤딩을 참조하세요.
복제본 세트 샤드에서 읽을 때 mongos 지정된 읽기 설정 (read preference) 적용합니다. 읽기 설정 (read preference) 각 작업마다 다시 평가됩니다.
다음 예시 샤딩된 클러스터 에 연결하고 연결 문자열 에 secondary
읽기 설정 (read preference) 지정하는 방법을 보여 줍니다.
MongoClient uriClient = MongoClients.create("mongodb://user:[email protected],mongos2.example.com/?readPreference=secondary");
태그 세트
MongoDB Server 에서는 선택한 기준에 따라 복제본 세트 멤버에 키-값 태그를 적용 할 수 있습니다. 그런 다음 해당 태그를 사용하여 읽기 작업의 멤버를 한 명 이상 대상으로 지정할 수 있습니다.
기본값 으로 Java 운전자 읽을 멤버를 선택할 때 태그를 무시합니다. Java 운전자 특정 태그를 선호하도록 지시하려면 읽기 설정 (read preference) 설정자 메서드에 태그를 목록으로 전달합니다.
미국 전역의 여러 데이터 센터에서 호스팅되는 멤버가 포함된 복제본 세트 에 연결되어 있다고 가정해 보겠습니다. 운전자 다음 순서로 세컨더리 복제본 세트 멤버로부터 읽기를 선호하도록 하려고 합니다.
다음과 같이 태그가 지정된 뉴욕 데이터 센터 의 멤버
("dc", "ny")
다음과 같이 태그가 지정된 샌프란시스코 데이터 센터 의 멤버
("dc", "sf")
모든 세컨더리 멤버
이 코드 예시 이전 복제본 세트 멤버를 나타내는 태그 목록을 ReadPreference.secondary()
setter 메서드에 전달합니다. 그런 다음 이 코드는 읽기 설정 (read preference) 정보를 withReadPreference()
메서드에 전달하여 데이터베이스 에서 읽기 순서를 설정하다 .
TagSet tag1 = new TagSet(new Tag("dc", "ny")); TagSet tag2 = new TagSet(new Tag("dc", "sf")); TagSet tag3 = new TagSet(); ReadPreference readPref= ReadPreference.secondary(Arrays.asList(tag1, tag2, tag3)); MongoDatabase database = mongoClient.getDatabase("test_database") .withReadPreference(readPref);
부하 분산
샤딩된 클러스터 또는 복제본 세트 에 연결할 때 Java 운전자 로드 밸런싱을 사용하여 읽기 및 쓰기 (write) 요청을 처리하다 . 로드 밸런싱을 통해 운전자 이러한 요청을 여러 서버에 분산할 수 있으므로 하나의 서버 부담을 주지 않고 최적의 성능을 보장할 수 있습니다.
샤딩된 클러스터 에 연결할 때 Java 운전자 네트워크 왕복 시간이 가장 짧은 인스턴스를 계산하여 가장 가까운 mongos 인스턴스 결정합니다. 그런 다음 운전자 이 mongos의 평균 왕복 시간을 localThresholdMS 값에 추가하여 지연 시간 창 결정합니다. 운전자 지연 시간 창 내에 속하는 최대 2개의 임의 mongos 인스턴스에 요청의 operationCount
부하를 분산합니다. 각 요청 에 대해 운전자 값을 결정하여 작업 부하가 낮은 서버 선택합니다.
복제본 세트 에 연결할 때 Java 운전자 먼저 읽기 설정 (read preference) 에 따라 복제본 세트 멤버를 선택합니다. 그런 다음 운전자 이전 단락에서 설명한 것과 동일한 프로세스 따릅니다. 지연 시간 창 계산한 후 운전자 이 창 에 속하는 무작위 복제본 세트 멤버를 최대 두 개 선택하고 operationCount
값이 더 낮은 멤버를 선택하여 요청 받습니다.
팁
로드 밸런싱에 대해 자세히 학습 MongoDB Server 매뉴얼에서 샤드 클러스터 밸런서를 참조하세요.
드라이버의 서버 선택 동작을 사용자 지정하는 방법을 학습 MongoClient 설정 지정 가이드 의 클러스터설정을 참조하세요.
LocalThreshold
Java 운전자 로컬 임계값을 사용하여 서버 선택에 대한 지연 시간 창 계산합니다. 이 값은 읽기 및 쓰기 (write) 요청을 수신할 수 있는 서버를 결정합니다.
기본값 으로 운전자 핑 시간이 가장 가까운 서버 에서 15 밀리초 이내인 mongos 인스턴스 또는 복제본 세트 멤버만 사용합니다. 지연 시간이 더 긴 서버 간에 읽기를 분산하려면 MongoClientSettings
인스턴스 에서 localThreshold
옵션을 설정하다 연결 URI에서 localThresholdMS
옵션을 설정합니다.
참고
단일 mongos 인스턴스 에서 복제본 세트 멤버를 선택할 때 Java localThresholdMS
운전자 옵션을 무시합니다. 이 경우 localThreshold 명령줄 옵션을 사용합니다.
다음 예시 에서는 복제본 세트 에 연결하고 로컬 임계값을 35 밀리초로 지정합니다. MongoClientSettings 또는 Connection URI 탭 선택하여 각 접근 방식에 해당하는 코드를 확인합니다.
MongoClient client = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://localhost:27017/")) .applyToClusterSettings(builder -> builder.localThreshold(35, TimeUnit.MILLISECONDS)) .build());
String connectionString = "mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"; MongoClient client = MongoClients.create(connectionString);
앞의 예시 에서 Java 운전자 가장 가까운 멤버의 핑 시간 35 밀리초 이내에 일치하는 멤버에게 읽기를 분산합니다.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.